Наша компания использует AWS CloudSearch для поиска и извлечения пользовательских данных. Пользовательские данные состоят из поля position типа lat,lon. Таким образом, для заданного радиуса и положения мы должны найти всех пользователей в диапазоне радиуса. Как написать поисковый запрос для получения необходимых данных?
Мы используем node.js в качестве серверного языка.
Помогите, пожалуйста.
Поиск на основе радиуса по широте и долготе в AWS CloudSearch
Ответы (2)
В cloudsearch нет возможности поиска латлонов в радиусе. Можно заказать по расстоянию, а можно поискать в радиусе.
Так как вы хотите, чтобы все результаты в радиусе. Вместо этого создайте прямоугольник так, чтобы его четыре стороны касались круга, в котором вы хотите выполнить поиск. Теперь вы можете выполнять поиск внутри прямоугольника ограничивающей рамки и возвращать результаты, отсортированные по расстоянию.
Недостатком является то, что некоторые результаты будут находиться в углах ограничивающей рамки, поэтому они не будут в круге, но они появятся в результатах поиска в облаке. Вы можете использовать их, а также приближение или фильтровать дальше в зависимости от расстояния.
Вот пример запроса, который делает то же самое: q=user*&fq=location%3A%5B%2740.628611,-100.694152%27,%2725.621966,-66.686706%27%5D&expr.geo=haversin%2838.958687,-77.343149,location. широта,местоположение.долгота%29&sort=geo%20asc
здесь: fq=location%3A%5B%2740.628611,-100.694152%27,%2725.621966,-66.686706%27%5D ---> поиск в пределах ограничивающей рамки Latlons, то есть в верхнем левом углу и нижнем правом углу.
expr.geo=haversin%2838.958687,-77.343149,location.latitude,location.longitude%29&sort=geo%20asc ---> создает выражение, которое вычисляет расстояние между LatLon в документе поиска до фиксированной точки (укажите это как центр вашего круг). и возвращает результат, отсортированный по расстоянию.
Обратите внимание, что функция расстояния "haversin" вычисляет расстояние между LatLons как расстояние между двумя точками на идеальной сфере.
Вы хотите ранжировать результаты на основе функции гаверсина. Это эквивалентно «поиску в радиусе», за исключением того, что вас интересует расстояние на поверхности сферы.
Вот пример такого запроса с CloudSearch (от http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-locations.html):
q=restaurant&expr.distance=haversin(35.621966,-120.686706,location.latitude,location.longitude)&sort=distance asc
Ваш выбор языка на стороне сервера не имеет значения, поскольку CloudSearch предоставляет только интерфейс REST. Ознакомьтесь с руководством по началу работы, если вы еще этого не сделали. http://docs.aws.amazon.com/cloudsearch/latest/developerguide/getting-started.html