Создать документ с предопределенными geo_shapes в Elasticsearch - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть два индекса:

  1. Профили - имеет поле, которое является массивом geo_shape
  2. Локации - имеет геометрию поля, равную geo_shape

Каждый документ в профилях имеет много мест.В настоящее время копия геометрии местоположений хранится в документах профиля.

Можно ли улучшить это, создав документ профиля с предопределенным значением geo_shapes?Я пробовал

PUT profiles/profile/1
{
  "locations": [
    {
      "indexed_shape": {
        "id": "LOC1",
        "index": "locations",
        "path": "geometry",
        "type": "location"
      }
    },
    {
      "indexed_shape": {
        "id": "LOC2",
        "index": "locations",
        "path": "geometry",
        "type": "location"
      }
    }
  ]
}

, который очень похож на синтаксис запроса для предварительно определенных геометрических фигур, но безрезультатно.Я не могу найти ничего в документах.Есть ли решение этой проблемы, или я должен управлять копиями?

1 Ответ

0 голосов
/ 26 ноября 2018

К сожалению, пока нет способа хранить ссылки на проиндексированные фигуры.Что вы можете сделать, это предварительно проиндексировать фигуры в выделенном индексе, а затем сохранить идентификаторы этих фигур в массиве местоположений в индексе профилей, например:

PUT shapes/doc/LOC1
{
  ... shape definition goes here ...
}
PUT shapes/doc/LOC2
{
  ... shape definition goes here ...
}

PUT profiles/doc/1
{
  "locations": [ "LOC1", "LOC2" ]
  ... other fields
}

Затем, когда вам нужно выполнить запросВы можете сначала выполнить запрос по индексу фигур, собрать идентификаторы соответствующих фигур, а затем запросить индекс профилей, используя эти идентификаторы.Я не вижу способа сделать его короче.

Сначала запросите фигуры и соберите идентификаторы:

POST shapes/_search?filter_path=hits.hits._id
{ 
  "query" : {
    "geo_shape": {
      "location": {
        "shape": {
          "type": "envelope",
          "coordinates" : [[13.0, 53.0], [14.0, 52.0]]
        },
        "relation": "within"
      }
    }
  }
}

=> returns "LOC1", "LOC3", "LOC4"

Наконец, запросите индекс профилей

POST profiles/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          ...other profile criteria go here...
        },
        { 
          "terms": {
            "locations": ["LOC1", "LOC3", "LOC4" ]
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...