Melhorar a experiência de pesquisa ordenando os resultados por distância de um determinado ponto de referência
Muitas vezes, os usuários desejam pesquisar itens associados a uma localização geográfica. Por exemplo, eles podem querer encontrar a cafeteria mais próxima à sua localização. Para ajudar você a comparar locais na superfície da Terra, a Pesquisa de IA inclui funções geoespaciais que você pode chamar em consultas.
Aqui, você aprenderá a pesquisar coisas próximas a um ponto físico ou dentro de uma área limitada.
O que são funções geoespaciais?
Em unidades anteriores neste módulo, você viu como os usuários podem localizar um hotel especificando campos a serem pesquisados, como Description
e Category
:
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Uma consideração importante quando você está reservando um hotel é a localização geográfica dele. Por exemplo, caso esteja reservando uma viagem para ver a Torre Eiffel, você vai querer um hotel localizado próximo a ela.
Para solicitar que a Pesquisa de IA retorne resultados com base nas informações de localização, você pode usar duas funções na consulta:
geo.distance
. Essa função retorna a distância em uma linha reta ao longo da superfície da Terra do ponto que você especifica até a localização no resultado da pesquisa.geo.intersects
. Essa função retornarátrue
se a localização de um resultado de pesquisa estiver dentro de um polígono que você especificar.
Para usar essas funções, verifique se o índice inclui a localização nos resultados. Os campos de localização devem ter o tipo de dados Edm.GeographyPoint
e armazenar a latitude e a longitude.
Usar a função geo.distance
geo.distance
é uma função que usa dois pontos como parâmetros e retorna a distância entre eles em quilômetros.
Suponha que 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
A consulta retorna todos os hotéis de luxo no índice dentro 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 em longitude e latitude.le 5
especifica que hotéis deverão ser incluídos nos resultados se a funçãogeo.distance
retornar um número menor ou igual a cinco quilômetros.
Importante
Quando você usa geo.distance
em um filtro, não há suporte para operadores igual a (eq
) e não é igual a (ne
). Em vez disso, use lt
, le
, gt
ou ge
.
Como o geo.distance
retorna a distância em quilômetros, também é possível pode usá-lo em uma cláusula orderby
. Por exemplo, essa 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
Nessa consulta, asc
especifica que os hotéis de luxo sejam retornados na ordem crescente de distância da Torre Eiffel.
Usar a função geo.intersects
Suponha que você decidiu que deseja ficar no sétimo arrondissement de Paris para seu passeio à Torre Eiffel. Ao pesquisar um hotel, você gostaria de especificar essa região o mais precisamente possível. Você pode formular essa consulta usando a função geo.intersects
.
A função geo.intersects
compara uma localização 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 corresponde uma região, como um arrondissement. Use este polígono para adicionar um filtro geográfico à 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
Essa consulta retorna todos os hotéis de luxo dentro de um quadrado ao redor da Torre Eiffel. Você pode usar mais de quatro pontos para criar uma área mais precisa.
Importante
Em polígonos, você precisa especificar os pontos no sentido anti-horário e o polígono precisa ser fechado, o que significa que o primeiro e o último ponto especificados devem ser o mesmo.
geo.intersects
retorna um valor booliano, portanto não é possível usá-lo em uma cláusula orderby
.