Запрос Has child
Возвращает родительские документы, чьи связанные дочерние документы соответствуют предоставленному запросу. Вы можете создать родительско-дочерние отношения между документами в одном индексе с помощью отображения поля join.
Поскольку он выполняет объединение, has_child медленнее по сравнению с другими запросами. Его производительность ухудшается по мере увеличения числа совпадающих дочерних документов, указывающих на уникальные родительские документы. Каждый has_child запрос в поиске может значительно увеличить время выполнения запроса.
Если вам важна производительность запросов, не используйте этот запрос. Если вам необходимо использовать запрос has_child, используйте его как можно реже.
Пример запроса
Настройка индекса
Чтобы использовать запрос has_child, ваш индекс должен включать отображение поля join. Например:
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"my-join-field": {
"type": "join",
"relations": {
"parent": "child"
}
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
"my-join-field": {
type: 'join',
relations: {
parent: 'child'
}
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
"my-join-field": {
type: "join",
relations: {
parent: "child",
},
},
},
},
});
console.log(response); PUT /my-index-000001
{
"mappings": {
"properties": {
"my-join-field": {
"type": "join",
"relations": {
"parent": "child"
}
}
}
}
} Пример запроса
resp = client.search(
query={
"has_child": {
"type": "child",
"query": {
"match_all": {}
},
"max_children": 10,
"min_children": 2,
"score_mode": "min"
}
},
)
print(resp) const response = await client.search({
query: {
has_child: {
type: "child",
query: {
match_all: {},
},
max_children: 10,
min_children: 2,
score_mode: "min",
},
},
});
console.log(response); GET /_search
{
"query": {
"has_child": {
"type": "child",
"query": {
"match_all": {}
},
"max_children": 10,
"min_children": 2,
"score_mode": "min"
}
}
} Параметры верхнего уровня для has_child
-
type - (Обязательно, строка) Имя отображения дочерних отношений для поля join.
-
query - (Обязательно, объект запроса) Запрос, который вы хотите выполнить на дочерних документах поля
type. Если дочерний документ соответствует поиску, запрос возвращает родительский документ. -
ignore_unmapped -
(Необязательно, булево) Указывает, нужно ли игнорировать неопределенное поле
typeи не возвращать документы, а возвращать ошибку. По умолчаниюfalse.Если
false, Elasticsearch возвращает ошибку, если полеtypeне определено.Вы можете использовать этот параметр для запроса к нескольким индексам, которые могут не содержать поле
type. -
max_children - (Необязательно, целое число) Максимальное количество дочерних документов, соответствующих
query, разрешенных для возвращаемого родительского документа. Если родительский документ превышает это ограничение, он исключается из результатов поиска. -
min_children - (Необязательно, целое число) Минимальное количество дочерних документов, соответствующих
query, необходимое для соответствия запросу для возвращаемого родительского документа. Если родительский документ не соответствует этому ограничению, он исключается из результатов поиска. -
score_mode -
(Необязательно, строка) Указывает, как оценки соответствия дочерних документов влияют на релевантность родительского документа оценку релевантности. Допустимые значения:
-
none(По умолчанию) - Не используйте оценки релевантности соответствующих дочерних документов. Запрос присваивает родительским документам оценку
0. -
avg - Используйте среднюю оценку релевантности всех соответствующих дочерних документов.
-
max - Использует самую высокую оценку релевантности всех соответствующих дочерних документов.
-
min - Использует самую низкую оценку релевантности всех соответствующих дочерних документов.
-
sum - Складывает оценки релевантности всех соответствующих дочерних документов.
-
Примечания
Сортировка
Вы не можете отсортировать результаты запроса has_child с помощью стандартных параметров сортировки.
Если вам нужно отсортировать возвращаемые документы по полю в их дочерних документах, используйте запрос function_score и отсортируйте по полю _score. Например, следующий запрос сортирует возвращаемые документы по полю click_count их дочерних документов.
resp = client.search(
query={
"has_child": {
"type": "child",
"query": {
"function_score": {
"script_score": {
"script": "_score * doc['click_count'].value"
}
}
},
"score_mode": "max"
}
},
)
print(resp) const response = await client.search({
query: {
has_child: {
type: "child",
query: {
function_score: {
script_score: {
script: "_score * doc['click_count'].value",
},
},
},
score_mode: "max",
},
},
});
console.log(response); GET /_search
{
"query": {
"has_child": {
"type": "child",
"query": {
"function_score": {
"script_score": {
"script": "_score * doc['click_count'].value"
}
}
},
"score_mode": "max"
}
}
}
© 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-child-query.html
|
|