Запрос на основе родителя
Возвращает дочерние документы, у которых связанный родительский документ соответствует заданному запросу. Вы можете создать родительско-дочерние отношения между документами в одном индексе с помощью отображения поля join.
Поскольку выполняется объединение, запрос has_parent медленный по сравнению с другими запросами. Его производительность ухудшается по мере увеличения количества совпадающих родительских документов. Каждый запрос has_parent в поиске может значительно увеличить время выполнения запроса.
Пример запроса
Настройка индекса
Для использования запроса has_parent ваш индекс должен содержать отображение поля join. Например:
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"my-join-field": {
"type": "join",
"relations": {
"parent": "child"
}
},
"tag": {
"type": "keyword"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
"my-join-field": {
type: 'join',
relations: {
parent: 'child'
}
},
tag: {
type: 'keyword'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
"my-join-field": {
type: "join",
relations: {
parent: "child",
},
},
tag: {
type: "keyword",
},
},
},
});
console.log(response); PUT /my-index-000001
{
"mappings": {
"properties": {
"my-join-field": {
"type": "join",
"relations": {
"parent": "child"
}
},
"tag": {
"type": "keyword"
}
}
}
} Пример запроса
resp = client.search(
index="my-index-000001",
query={
"has_parent": {
"parent_type": "parent",
"query": {
"term": {
"tag": {
"value": "Elasticsearch"
}
}
}
}
},
)
print(resp) const response = await client.search({
index: "my-index-000001",
query: {
has_parent: {
parent_type: "parent",
query: {
term: {
tag: {
value: "Elasticsearch",
},
},
},
},
},
});
console.log(response); GET /my-index-000001/_search
{
"query": {
"has_parent": {
"parent_type": "parent",
"query": {
"term": {
"tag": {
"value": "Elasticsearch"
}
}
}
}
}
} Параметры верхнего уровня для запроса has_parent
-
parent_type - (Обязательно, строка) Имя родительского отношения, сопоставленного для поля join.
-
query - (Обязательно, объект запроса) Запрос, который необходимо выполнить на родительских документах поля
parent_type. Если родительский документ соответствует поиску, запрос возвращает его дочерние документы. -
score -
(Необязательно, логическое значение) Указывает, агрегируется ли релевантность совпадающего родительского документа в дочерние документы. По умолчанию
false.Если
false, Elasticsearch игнорирует релевантность родительского документа. Elasticsearch также присваивает каждому дочернему документу релевантность, равнуюboostquery, которая по умолчанию равна1.Если
true, релевантность совпадающего родительского документа агрегируется в релевантности дочерних документов. -
ignore_unmapped -
(Необязательно, логическое значение) Указывает, игнорировать ли неотображенное поле
parent_typeи не возвращать никаких документов вместо ошибки. По умолчаниюfalse.Если
false, Elasticsearch возвращает ошибку, если полеparent_typeне отображено.Вы можете использовать этот параметр для поиска по нескольким индексам, которые могут не содержать поле
parent_type.
Примечания
Сортировка
Вы не можете отсортировать результаты запроса has_parent с помощью стандартных параметров сортировки.
Если вам нужно отсортировать возвращаемые документы по полю в родительских документах, используйте запрос function_score и отсортируйте по полю _score. Например, следующий запрос сортирует возвращаемые документы по полю view_count их родительских документов.
resp = client.search(
query={
"has_parent": {
"parent_type": "parent",
"score": True,
"query": {
"function_score": {
"script_score": {
"script": "_score * doc['view_count'].value"
}
}
}
}
},
)
print(resp) const response = await client.search({
query: {
has_parent: {
parent_type: "parent",
score: true,
query: {
function_score: {
script_score: {
script: "_score * doc['view_count'].value",
},
},
},
},
},
});
console.log(response); GET /_search
{
"query": {
"has_parent": {
"parent_type": "parent",
"score": true,
"query": {
"function_score": {
"script_score": {
"script": "_score * doc['view_count'].value"
}
}
}
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-has-parent-query.html