Migliorare l'esperienza di ricerca ordinando i risultati in base alla distanza da un determinato punto di riferimento
Spesso gli utenti vogliono cercare elementi associati a una posizione geografica. Ad esempio, potrebbero voler trovare il bar più vicino alla loro posizione. Per confrontare le posizioni sulla superficie terrestre, AI Search include funzioni geospaziali che è possibile richiamare nelle query.
In questa sezione si apprenderà come cercare gli oggetti che si trovano vicino a un punto fisico o all'interno di un'area delimitata.
Cosa sono le funzioni geospaziali?
Nelle unità precedenti di questo modulo, è stato illustrato come gli utenti possono individuare un hotel specificando i campi da cercare, ad esempio Description
e Category
:
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Un aspetto importante da tenere in considerazione quando si prenota un hotel è la posizione geografica. Ad esempio, se si prenota un viaggio per visitare la Torre Eiffel, è consigliabile che l'hotel si trovi nelle vicinanze.
Per chiedere a AI Search di restituire i risultati in base alle informazioni sulla posizione, è possibile usare due funzioni nella query:
geo.distance
. La funzione restituisce la distanza in linea retta sulla superficie terrestre dal punto specificato alla posizione del risultato della ricerca.geo.intersects
. Questa funzione restituiscetrue
se la posizione di un risultato di ricerca è all'interno di un poligono specificato.
Per usare queste funzioni, assicurarsi che l'indice includa la posizione dei risultati. I campi posizione devono avere il tipo di dati Edm.GeographyPoint
e archiviare la latitudine e la longitudine.
Usare la funzione geo.distance
geo.distance
è una funzione che prende come parametri due punti e restituisce la distanza tra essi in chilometri.
Si supponga di cercare un hotel vicino alla Torre Eiffel. È possibile modificare la query precedente, aggiungendo un nuovo filtro:
search=(Description:luxury OR Category:luxury)$filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Questa query restituisce tutti gli hotel di lusso presenti nell'indice entro cinque chilometri dalla Torre Eiffel. Nella query:
Location
è il nome del campo che archivia la posizione dell'hotel.geography'POINT(2.294481 48.858370)'
è la posizione della Torre Eiffel come longitudine e latitudine.le 5
specifica che gli hotel devono essere inclusi nei risultati se la funzionegeo.distance
restituisce un numero inferiore o uguale a cinque chilometri.
Importante
Quando si usa geo.distance
in un filtro, gli operatori uguali a (eq
) e non uguali a (ne
) non sono supportati. Usare invece lt
, le
, gt
, o ge
.
Poiché geo.distance
restituisce la distanza in chilometri, è possibile usarlo anche in una clausola orderby
. Ad esempio, questa query restituisce tutti gli hotel di lusso presenti nell'indice, ma quelli più vicini alla Torre Eiffel sono elencati per primi:
search=(Description:luxury OR Category:luxury)&orderby=geo.distance(Location, geography'POINT(2.294481 48.858370)') asc&$select=HotelId, HotelName, Category, Tags, Description&$count=true
In questa query, asc
specifica che gli hotel di lusso vengono restituiti in ordine crescente in base alla distanza dalla Torre Eiffel.
Usare la funzione geo.intersects
Si supponga di voler soggiornare nel settimo arrondissement di Parigi per poter visitare la Torre Eiffel. Quando si cerca un hotel, è consigliabile specificare quest'area nel modo più preciso possibile. È possibile formulare una query di questo tipo usando la funzione geo.intersects
.
La funzione geo.intersects
confronta una posizione con un poligono sulla superficie terrestre, che viene specificato con tre o più punti. Usando un poligono, è possibile creare una forma che corrisponda maggiormente a un'area, ad esempio un arrondissement. Usare questo poligono per aggiungere un filtro geografico alla query:
search=(Description:luxury OR Category:luxury) AND geo.intersects(Location, geography'POLYGON((2.32 48.91, 2.27 48.91, 2.27 48.60, 2.32 48.60, 2.32 48.91))')&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Questa query restituisce tutti gli hotel di lusso situati in una piazza intorno alla Torre Eiffel. È possibile usare più di quattro punti per creare un'area più precisa.
Importante
Nei poligoni, è necessario specificare i punti in ordine antiorario e il poligono deve essere chiuso, il che significa che il primo e l'ultimo punto specificati devono essere uguali.
geo.intersects
restituisce un valore booleano, pertanto non è possibile usarlo in una clausola orderby
.