как искать дочерние документы с тем же родительским идентификатором в Elasticsearch на ver_6.2.4? - PullRequest
0 голосов
/ 10 июля 2019

Я читаю ответы в , как искать дочерние документы с тем же родительским идентификатором в Elasticsearch? , но никто из них не может решить эту проблему в 6.2.4, может кто-нибудь сказать мне, как выполнить ту же работу на 6.2.4

1 Ответ

0 голосов
/ 10 июля 2019

Начиная с Elasticsearch 6.x, хранение родительского / дочернего элемента в виде отдельных типов было заменено на тип данных join . Это принципиально не меняет способ индексации и запроса этих документов, но немного меняет синтаксис.

ПРИМЕЧАНИЕ. Этот набор изменений был сделан при подготовке к удалению type полностью, что происходит в 7.x

Initialize Mapping (с использованием шаблона)

Вместо указания отдельных типов мы создадим поле join с именем branch_join для всех документов. В конфигурации relations указывается отношение родительский -> дочерний, ключ (branch) - родительский, а значение (employee) - дочерний.

ПРИМЕЧАНИЕ. Я использую индекс с именем organization для примера

PUT _template/org_template
{
  "index_patterns": ["organization"],
  "settings": {
    "number_of_shards": 2
  },
  "mappings": {
    "_doc": {
      "properties": {
        "branch_join": {
          "type": "join",
          "relations": {
            "branch": "employee"
          }
        }
      }
    }
  }
}

Индексировать ваши документы

Индексирование родительских документов аналогично, но нам нужно указать, на какой стороне отношения находится каждый документ, указав branch в поле branch_join.

POST /organization/_doc/_bulk
{"index": {"_id": "london"}}
{"name": "London Westminster", "city": "London", "country": "UK", "branch_join": {"name":"branch"}}
{"index": {"_id": "liverpool"}}
{"name": "Liverpool Central", "city": "Liverpool", "country": "UK", "branch_join": {"name":"branch"}}
{"index": {"_id": "paris"}}
{"name": "Champs Élysées", "city": "Paris", "country": "France", "branch_join": {"name":"branch"}}

Чтобы проиндексировать детей, нам нужно сделать две вещи: 1. Нам нужно снова указать поле branch_join, но мы не только указываем, к какой стороне объединения это относится (employee), нам также нужно указать _id родительских документов, к которым нужно присоединиться. 2. Чтобы обеспечить индексацию детей на тех же осколках, что и их родители, мы установим параметр routing равным _id родительского документа.

POST /organization/_doc/_bulk
{"index": { "_id": 1, "routing": "london"}}
{"name": "Alice Smith", "dob": "1970-10-24", "hobby": "hiking", "branch_join": {"name":"employee", "parent": "london"}}
{"index": { "_id": 2, "routing": "london"}}
{"name": "Mark Thomas", "dob": "1982-05-16", "hobby": "diving", "branch_join": {"name":"employee", "parent": "london"}}
{"index": { "_id": 3, "routing": "liverpool"}}
{"name": "Barry Smith", "dob": "1979-04-01", "hobby": "hiking", "branch_join": {"name":"employee", "parent": "liverpool"}}
{"index": { "_id": 4, "routing": "paris"}}
{"name": "Adrien Grand", "dob": "1987-05-11", "hobby": "horses", "branch_join": {"name":"employee", "parent": "paris"}}

Запрос

Запрос почти идентичен, за исключением того, что type был переименован в parent_type, чтобы быть более явным:

POST /organization/_search
{
  "query": {
    "has_parent": {
      "parent_type": "branch", 
      "query": {
        "ids": {
          "values" : ["london"]
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...