Children aggregation
A special single bucket aggregation that selects child documents that have the specified type, as defined in a join field.
This aggregation has a single option:
-
type- The child type that should be selected.
For example, let’s say we have an index of questions and answers. The answer type has the following join field in the mapping:
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"
}
}
}
}
} The question document contain a tag field and the answer documents contain an owner field. With the children aggregation the tag buckets can be mapped to the owner buckets in a single request even though the two fields exist in two different kinds of documents.
An example of a question document:
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"
]
} Examples of answer documents:
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"
} The following request can be built that connects the two together:
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
}
}
}
}
}
}
}
} | The |
The above example returns the top question tags and per tag the top answer owners.
Possible response:
{
"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
}
]
}
}
}
]
}
}
} | The number of question documents with the tag | |
| The number of answer documents that are related to question documents with the tag |
© 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