Я использую Elasticsearch для хранения местоположений пользователей и их предпочтения на расстоянии при поиске других пользователей. Он хранится в location
geo_point и distance
целых числах.Найти подходящие местоположения/расстояния без использования скриптов в Elasticsearch?
Например, индекс содержит следующие документы:
- Alice, расположенный в [0,100] и ищет пользователей в пределах 100 метров;
- Bob, расположенный по адресу [100,0] и ищет пользователей в пределах 50 метров.
Когда Карлос, расположенный в [0,0], поиски в пределах 100 метров мне нужен мой запрос, чтобы вернуть Алису, но не Боб (так как Боб хочет только пользователи в пределах 50 м, и Карлос находится в 100 км).
Другими словами, я хочу, чтобы вернуть все документы D
таким образом, что D.reach
содержит Carlos.location
и Carlos.reach
содержит D.location
.
Насколько я могу видеть, единственный способ сделать это путем сравнения расстояний с помощью сценариев, как так:
{
"filter": {
"script": {
"script": "min(doc['distance'].value, distance) >= doc['location'].arcDistance(lat, lon)",
"params": {
"distance": 100,
"lat": 0,
"lon": 0
}
}
}
}
Однако, я бы rather avoid scripting, если это вообще возможно. Есть ли альтернативный метод для достижения этого?
Привет, спасибо за ответ, но это не совсем то, что мне нужно. Это вычислит пересечение A.reach и C.reach, тогда как я хочу обеспечить существование A.location внутри C.reach AND C.location существует внутри A.reach. Я уточню вопрос, чтобы уточнить. – Graham
Предположительно, я мог бы использовать И для выполнения двух фильтров; один из которых обеспечивает форму «Точка» в соответствии с досягаемостью документа, а другой - форму круга в соответствии с местоположением документа? – Graham
Да, вы тоже можете это сделать, если это было вашим намерением. Проверить, находится ли точка внутри круга, легко с помощью фильтра geo_shape. – Val