Melhore a experiência de pesquisa ordenando os resultados por distância a partir de um determinado ponto de referência
Muitas vezes, os usuários querem pesquisar itens associados a uma localização geográfica. Por exemplo, eles podem querer encontrar o café mais próximo de sua localização. Para ajudá-lo a comparar locais na superfície da Terra, o AI Search inclui funções geoespaciais que você pode chamar em consultas.
Aqui, você aprenderá a procurar coisas que estão perto de um ponto físico ou dentro de uma área delimitada.
O que são funções geoespaciais?
Nas unidades anteriores deste módulo, você viu como os usuários podem localizar um hotel especificando campos para pesquisar, como Description
e Category
:
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Uma consideração importante ao reservar um hotel é a sua localização geográfica. Por exemplo, se você estiver reservando uma viagem para ver a Torre Eiffel, você vai querer um hotel localizado perto dela.
Para pedir ao AI Search para retornar resultados com base em suas informações de localização, você pode usar duas funções em sua consulta:
geo.distance
. Esta função devolve a distância em linha reta através da superfície da Terra desde o ponto especificado até à localização do resultado da pesquisa.geo.intersects
. Essa função retornarátrue
se o local de um resultado de pesquisa estiver dentro de um polígono que você especificar.
Para usar essas funções, verifique se o índice inclui o local dos resultados. Os campos de localização devem ter o tipo Edm.GeographyPoint
de dados e armazenar a latitude e a longitude.
Use a função geo.distance
geo.distance
é uma função que toma dois pontos como parâmetros e retorna a distância entre eles em quilômetros.
Suponha que você esteja procurando um hotel perto da Torre Eiffel. Você pode modificar a consulta acima, adicionando um novo 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
Esta consulta devolve todos os hotéis de luxo do índice a menos de cinco quilómetros da Torre Eiffel. Na consulta:
Location
é o nome do campo que armazena a localização do hotel.geography'POINT(2.294481 48.858370)'
é a localização da Torre Eiffel como longitude e latitude.le 5
Especifica que os hotéis devem ser incluídos nos resultados se ageo.distance
função retornar um número menor ou igual a cinco quilômetros.
Importante
Quando você usa geo.distance
em um filtro, os operadores igual a (eq
) e não igual a (ne
) não são suportados. Em vez disso, use lt
, le
, gt
, ou ge
.
Como geo.distance
retorna a distância em quilômetros, você também pode usá-la em uma orderby
cláusula. Por exemplo, esta consulta retorna todos os hotéis de luxo no índice, mas os mais próximos da Torre Eiffel são listados primeiro:
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
Nesta consulta, asc
especifica que os hotéis de luxo são devolvidos na ordem crescente da sua distância da Torre Eiffel.
Use a função geo.intersects
Suponha que você tenha decidido que quer ficar no sétimo arrondissement de Paris para sua viagem à Torre Eiffel. Ao pesquisar um hotel, você gostaria de especificar essa área com a maior precisão possível. Você pode formular essa consulta usando a geo.intersects
função.
A geo.intersects
função compara um local com um polígono na superfície da Terra, que você especifica com três ou mais pontos. Usando um polígono, você pode criar uma forma que se aproxime de uma área, como um arrondissement. Use este polígono para adicionar um filtro geográfico à sua consulta:
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
Esta consulta retorna todos os hotéis de luxo dentro de uma praça ao redor da Torre Eiffel. Você pode usar mais de quatro pontos para criar uma área mais precisa.
Importante
Em polígonos, você deve especificar os pontos no sentido anti-horário e o polígono deve ser fechado, o que significa que o primeiro e o último pontos especificados devem ser os mesmos.
geo.intersects
Retorna um valor booleano, portanto, não é possível usá-lo em uma orderby
cláusula.