逆ネスト集約
親ドキュメントからネストされたドキュメントを集約する特別な単一バケット集約です。この集約は、ネストされたブロック構造から抜け出し、他のネストされた構造やルートドキュメントにリンクすることができ、ネストされた集約の一部ではない他の集約をネストすることを可能にします。
reverse_nested
集約は nested
集約の内部で定義する必要があります。
オプション:
path
- どのネストされたオブジェクトフィールドに戻るべきかを定義します。デフォルトは空で、これはルート/メインドキュメントレベルに戻ることを意味します。パスはnested
集約のネストされた構造の外にあるネストされたオブジェクトフィールドへの参照を含むことはできません。reverse_nested
の中にあります。
例えば、問題とコメントを持つチケットシステムのインデックスがあるとしましょう。コメントはネストされたドキュメントとして問題ドキュメントにインラインで含まれています。マッピングは次のようになります:
Python
resp = client.indices.create(
index="issues",
mappings={
"properties": {
"tags": {
"type": "keyword"
},
"comments": {
"type": "nested",
"properties": {
"username": {
"type": "keyword"
},
"comment": {
"type": "text"
}
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'issues',
body: {
mappings: {
properties: {
tags: {
type: 'keyword'
},
comments: {
type: 'nested',
properties: {
username: {
type: 'keyword'
},
comment: {
type: 'text'
}
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "issues",
mappings: {
properties: {
tags: {
type: "keyword",
},
comments: {
type: "nested",
properties: {
username: {
type: "keyword",
},
comment: {
type: "text",
},
},
},
},
},
});
console.log(response);
コンソール
PUT /issues
{
"mappings": {
"properties": {
"tags": { "type": "keyword" },
"comments": {
"type": "nested",
"properties": {
"username": { "type": "keyword" },
"comment": { "type": "text" }
}
}
}
}
}
comments は issue オブジェクトの下にネストされたドキュメントを保持する配列です。 |
次の集約は、コメントしたトップコメント者のユーザー名と、ユーザーがコメントした問題のトップタグを返します:
Python
resp = client.search(
index="issues",
query={
"match_all": {}
},
aggs={
"comments": {
"nested": {
"path": "comments"
},
"aggs": {
"top_usernames": {
"terms": {
"field": "comments.username"
},
"aggs": {
"comment_to_issue": {
"reverse_nested": {},
"aggs": {
"top_tags_per_comment": {
"terms": {
"field": "tags"
}
}
}
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'issues',
body: {
query: {
match_all: {}
},
aggregations: {
comments: {
nested: {
path: 'comments'
},
aggregations: {
top_usernames: {
terms: {
field: 'comments.username'
},
aggregations: {
comment_to_issue: {
reverse_nested: {},
aggregations: {
top_tags_per_comment: {
terms: {
field: 'tags'
}
}
}
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "issues",
query: {
match_all: {},
},
aggs: {
comments: {
nested: {
path: "comments",
},
aggs: {
top_usernames: {
terms: {
field: "comments.username",
},
aggs: {
comment_to_issue: {
reverse_nested: {},
aggs: {
top_tags_per_comment: {
terms: {
field: "tags",
},
},
},
},
},
},
},
},
},
});
console.log(response);
コンソール
GET /issues/_search
{
"query": {
"match_all": {}
},
"aggs": {
"comments": {
"nested": {
"path": "comments"
},
"aggs": {
"top_usernames": {
"terms": {
"field": "comments.username"
},
"aggs": {
"comment_to_issue": {
"reverse_nested": {},
"aggs": {
"top_tags_per_comment": {
"terms": {
"field": "tags"
}
}
}
}
}
}
}
}
}
}
上記のように、reverse_nested
集約は nested
集約に配置されており、これは reverse_nested
集約が使用できる唯一の場所です。その唯一の目的は、ネストされた構造の上位にある親ドキュメントに戻ることです。
reverse_nested 集約はルート/メインドキュメントレベルに戻ります。path が定義されていないためです。path オプションを介して、reverse_nested 集約は、マッピングで複数のレイヤーのネストされたオブジェクトタイプが定義されている場合、異なるレベルに戻ることができます |
コンソール-結果
{
"aggregations": {
"comments": {
"doc_count": 1,
"top_usernames": {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets": [
{
"key": "username_1",
"doc_count": 1,
"comment_to_issue": {
"doc_count": 1,
"top_tags_per_comment": {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets": [
{
"key": "tag_1",
"doc_count": 1
}
...
]
}
}
}
...
]
}
}
}
}