Melhore a experiência de pesquisa ordenando os resultados por distância a partir de um determinado ponto de referência

Concluído

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 a geo.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.