Сложный поисковый запрос

Нужна помощь по составлению сложного запроса.
Основа запроса вот такая 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.