Нужна помощь по составлению сложного запроса.
Основа запроса вот такая https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-geo-distance-query.html#_lat_lon_as_properties_3
Но вот эту часть:
"pin.location" : {
"lat" : 40,
"lon" : -70
}
надо усложнить. У меня есть индекс который содержит в себе много документов с координатами. Соответственно мне надо перебрать из одного индекса все координаты в документах где поле id=345wq и и поискать в определенном радиусе соответствующие документы в другом индексе
где поле id=345wq
это будет term query
и поискать в определенном радиусе соответствующие документы в другом индексе
а для этого, вам придется собрать все эти координаты вручную и искать другим запросом в другом индексе. Elasticsearch операции JOIN между индексами пока не поддерживает. Только в одном индексе и только в отношении "Один ко многим".
Честно сказать не понял механику. Если можно покажите на примере. Заранее спасибо!
Ну, скажем, вот мой первый индекс:
PUT test
{
"mappings": {
"doc": {
"properties": {
"id": {
"type": "keyword"
},
"loc": {
"type": "geo_point"
}
}
}
}
}
PUT test/doc/1
{
"id": "foo",
"loc": "42.358056,-71.063611"
}
PUT test/doc/2
{
"id": "foo",
"loc": "55.75,37.616667"
}
PUT test/doc/3
{
"id": "bar",
"loc":"40.7127,-74.0059"
}
Я сначала нахожу нужные координаты:
GET test/doc/_search
{
"query": {
"term": {
"id": {
"value": "foo"
}
}
}
}
Этот запрос возвращает мне "42.358056,-71.063611"
и "55.75,37.616667"
. Я из них в моем приложении формирую следующей запрос:
GET other_index/doc/_search
{
"query": {
"bool": {
"should": [
{
"geo_distance": {
"distance": "12km",
"loc": "42.358056,-71.063611"
}
},
{
"geo_distance": {
"distance": "12km",
"loc": "55.75,37.616667"
}
}
]
}
}
}
Но в моем первом индексе там очень много документов (подвижное устройство постоянно отсылающее свои координаты), не ужели и правда вручную прогонять поштучно запросы для всего дневного маршрута моего устройства, чтобы понять какие статичные точки (магазины и т.д.) попадались в течении дня в радиусе 300 метров на маршруте?
Может как-то надо по другому данные сложить, чтобы более эффективно решить мою задачу?
Может тогда из маршрута сделать geo_shape и искать пересечения?
Ознакомился, теоритически подходит. Собираю из точек передвижения моего устройства так называемый LineString и дальше смотрю какие статичные точки (магазины) попали в рамки моего LineString.
Но с практической точки зрения как это выглядит не ясно. получается мне надо формировать LineString в какой-то отдельный индекс что-ли? Как формируется LineString, придеться все координаты передаваемые устройством писать в один документ чтобы они собирали в geo shape ? А как Тогда производить фильтрацию, например по дате?
Игорь, если вас не затруднит , можете пример дать из которого можно будет понять как фактически это работает? Спасибо.
получается примерно вот таким запросом я могу поискать свои статические точки (магазины) встречающиеся на пути [[-77.03653, 38.897676], [-77.009051, 38.889939]]
curl -XGET 'http://localhost:9200/anyindex/anytype/_search?pretty' -d '{
"query": {
"filtered": {
"filter": {
"geo_shape": {
"location": {
"relation": "intersects",
"shape": {
"type": "linestring",
"coordinates":[[-77.03653, 38.897676], [-77.009051, 38.889939]]
}
}
}
},
"query": {
"match_all": {}
}
}
}
}'
Но как мне из моих документов с координатами приходящими от gps устройства получить тот самый geo shape для подстановки в запрос выше мне не понятно. Да и не ясно что значит intersects, по документации говорится что найдутся точки пересекающиеся с маршрутом, но с какой точность (в каком радиусе) пересечение будет защитано ?
Да и не ясно что значит intersects, по документации говорится что найдутся точки пересекающиеся с маршрутом, но с какой точность (в каком радиусе) пересечение будет защитано ?
Вы можете сделать из multiline mutltipoligon с желаемым радиусом.
А как быть с этим:
Но как мне из моих документов с координатами приходящими от gps устройства получить тот самый geo shape
Но как мне из моих документов с координатами приходящими от gps устройства получить тот самый geo shape
Если особой точности не нужно, то можно поиграться уменьшением precision
. Но при этом совпадения могут быть очень непредсказуемы (по сути все будет зависеть попала линия и магазин в одну клетку). Если нужно более-менее точное и предсказуемое поведение, то Elasticsearch вам тут не поможет. Я бы начал с изучения java - Computing a polygon that surrounds a multi-point line - Stack Overflow
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.