Агрегация дочерних элементов
Специальная агрегация по одной корзине, которая выбирает дочерние документы, имеющие указанный тип, как определено в поле join">join.
Эта агрегация имеет один параметр:
-
type- Тип дочернего элемента, который следует выбрать.
Например, предположим, что у нас есть индекс вопросов и ответов. Тип ответа имеет следующее поле join в отображении:
resp = client.indices.create(
index="child_example",
mappings={
"properties": {
"join": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
},
)
print(resp) response = client.indices.create(
index: 'child_example',
body: {
mappings: {
properties: {
join: {
type: 'join',
relations: {
question: 'answer'
}
}
}
}
}
)
puts response const response = await client.indices.create({
index: "child_example",
mappings: {
properties: {
join: {
type: "join",
relations: {
question: "answer",
},
},
},
},
});
console.log(response); PUT child_example
{
"mappings": {
"properties": {
"join": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
} Документ question содержит поле тега, а документ answer содержит поле владельца. С помощью агрегации children корзины тегов могут быть сопоставлены с корзинками владельцев в одном запросе, даже если эти два поля существуют в двух разных типах документов.
Пример документа вопроса:
resp = client.index(
index="child_example",
id="1",
document={
"join": {
"name": "question"
},
"body": "I have Windows 2003 server and i bought a new Windows 2008 server...",
"title": "Whats the best way to file transfer my site from server to a newer one?",
"tags": [
"windows-server-2003",
"windows-server-2008",
"file-transfer"
]
},
)
print(resp) response = client.index(
index: 'child_example',
id: 1,
body: {
join: {
name: 'question'
},
body: 'I have Windows 2003 server and i bought a new Windows 2008 server...',
title: 'Whats the best way to file transfer my site from server to a newer one?',
tags: [
'windows-server-2003',
'windows-server-2008',
'file-transfer'
]
}
)
puts response const response = await client.index({
index: "child_example",
id: 1,
document: {
join: {
name: "question",
},
body: "I have Windows 2003 server and i bought a new Windows 2008 server...",
title:
"Whats the best way to file transfer my site from server to a newer one?",
tags: ["windows-server-2003", "windows-server-2008", "file-transfer"],
},
});
console.log(response); PUT child_example/_doc/1
{
"join": {
"name": "question"
},
"body": "<p>I have Windows 2003 server and i bought a new Windows 2008 server...",
"title": "Whats the best way to file transfer my site from server to a newer one?",
"tags": [
"windows-server-2003",
"windows-server-2008",
"file-transfer"
]
} Примеры документов answer:
resp = client.index(
index="child_example",
id="2",
routing="1",
document={
"join": {
"name": "answer",
"parent": "1"
},
"owner": {
"location": "Norfolk, United Kingdom",
"display_name": "Sam",
"id": 48
},
"body": "Unfortunately you're pretty much limited to FTP...",
"creation_date": "2009-05-04T13:45:37.030"
},
)
print(resp)
resp1 = client.index(
index="child_example",
id="3",
routing="1",
refresh=True,
document={
"join": {
"name": "answer",
"parent": "1"
},
"owner": {
"location": "Norfolk, United Kingdom",
"display_name": "Troll",
"id": 49
},
"body": "Use Linux...",
"creation_date": "2009-05-05T13:45:37.030"
},
)
print(resp1) response = client.index(
index: 'child_example',
id: 2,
routing: 1,
body: {
join: {
name: 'answer',
parent: '1'
},
owner: {
location: 'Norfolk, United Kingdom',
display_name: 'Sam',
id: 48
},
body: "Unfortunately you're pretty much limited to FTP...",
creation_date: '2009-05-04T13:45:37.030'
}
)
puts response
response = client.index(
index: 'child_example',
id: 3,
routing: 1,
refresh: true,
body: {
join: {
name: 'answer',
parent: '1'
},
owner: {
location: 'Norfolk, United Kingdom',
display_name: 'Troll',
id: 49
},
body: 'Use Linux...',
creation_date: '2009-05-05T13:45:37.030'
}
)
puts response const response = await client.index({
index: "child_example",
id: 2,
routing: 1,
document: {
join: {
name: "answer",
parent: "1",
},
owner: {
location: "Norfolk, United Kingdom",
display_name: "Sam",
id: 48,
},
body: "Unfortunately you're pretty much limited to FTP...",
creation_date: "2009-05-04T13:45:37.030",
},
});
console.log(response);
const response1 = await client.index({
index: "child_example",
id: 3,
routing: 1,
refresh: "true",
document: {
join: {
name: "answer",
parent: "1",
},
owner: {
location: "Norfolk, United Kingdom",
display_name: "Troll",
id: 49,
},
body: "Use Linux...",
creation_date: "2009-05-05T13:45:37.030",
},
});
console.log(response1); PUT child_example/_doc/2?routing=1
{
"join": {
"name": "answer",
"parent": "1"
},
"owner": {
"location": "Norfolk, United Kingdom",
"display_name": "Sam",
"id": 48
},
"body": "<p>Unfortunately you're pretty much limited to FTP...",
"creation_date": "2009-05-04T13:45:37.030"
}
PUT child_example/_doc/3?routing=1&refresh
{
"join": {
"name": "answer",
"parent": "1"
},
"owner": {
"location": "Norfolk, United Kingdom",
"display_name": "Troll",
"id": 49
},
"body": "<p>Use Linux...",
"creation_date": "2009-05-05T13:45:37.030"
} Можно составить следующий запрос, который свяжет их вместе:
resp = client.search(
index="child_example",
size="0",
aggs={
"top-tags": {
"terms": {
"field": "tags.keyword",
"size": 10
},
"aggs": {
"to-answers": {
"children": {
"type": "answer"
},
"aggs": {
"top-names": {
"terms": {
"field": "owner.display_name.keyword",
"size": 10
}
}
}
}
}
}
},
)
print(resp) response = client.search(
index: 'child_example',
size: 0,
body: {
aggregations: {
"top-tags": {
terms: {
field: 'tags.keyword',
size: 10
},
aggregations: {
"to-answers": {
children: {
type: 'answer'
},
aggregations: {
"top-names": {
terms: {
field: 'owner.display_name.keyword',
size: 10
}
}
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "child_example",
size: 0,
aggs: {
"top-tags": {
terms: {
field: "tags.keyword",
size: 10,
},
aggs: {
"to-answers": {
children: {
type: "answer",
},
aggs: {
"top-names": {
terms: {
field: "owner.display_name.keyword",
size: 10,
},
},
},
},
},
},
},
});
console.log(response); POST child_example/_search?size=0
{
"aggs": {
"top-tags": {
"terms": {
"field": "tags.keyword",
"size": 10
},
"aggs": {
"to-answers": {
"children": {
"type" : "answer"
},
"aggs": {
"top-names": {
"terms": {
"field": "owner.display_name.keyword",
"size": 10
}
}
}
}
}
}
}
} |
|
Вышеприведённый пример возвращает верхние теги вопросов и, для каждого тега, верхних владельцев ответов.
Возможный ответ:
{
"took": 25,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped" : 0,
"failed": 0
},
"hits": {
"total" : {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"top-tags": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "file-transfer",
"doc_count": 1,
"to-answers": {
"doc_count": 2,
"top-names": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Sam",
"doc_count": 1
},
{
"key": "Troll",
"doc_count": 1
}
]
}
}
},
{
"key": "windows-server-2003",
"doc_count": 1,
"to-answers": {
"doc_count": 2,
"top-names": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Sam",
"doc_count": 1
},
{
"key": "Troll",
"doc_count": 1
}
]
}
}
},
{
"key": "windows-server-2008",
"doc_count": 1,
"to-answers": {
"doc_count": 2,
"top-names": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Sam",
"doc_count": 1
},
{
"key": "Troll",
"doc_count": 1
}
]
}
}
}
]
}
}
} | Количество документов вопросов с тегом | |
| Количество документов ответов, связанных с документами вопросов с тегом |
© 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/search-aggregations-bucket-children-aggregation.html