Начиная с 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"]
}
}
}
}
}