親の集約
指定されたタイプを持つ親ドキュメントを選択する特別な単一バケット集約で、これは join
フィールド で定義されています。
この集約には単一のオプションがあります:
type
- 選択すべき子タイプ。
例えば、質問と回答のインデックスがあるとしましょう。回答タイプは、マッピング内に次の join
フィールドを持っています:
Python
resp = client.indices.create(
index="parent_example",
mappings={
"properties": {
"join": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'parent_example',
body: {
mappings: {
properties: {
join: {
type: 'join',
relations: {
question: 'answer'
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "parent_example",
mappings: {
properties: {
join: {
type: "join",
relations: {
question: "answer",
},
},
},
},
});
console.log(response);
コンソール
PUT parent_example
{
"mappings": {
"properties": {
"join": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
question
ドキュメントにはタグフィールドが含まれ、answer
ドキュメントにはオーナーフィールドが含まれています。parent
集約を使用すると、オーナーバケットをタグバケットに単一のリクエストでマッピングできます。これは、2つのフィールドが異なる種類のドキュメントに存在する場合でも可能です。
質問ドキュメントの例:
Python
resp = client.index(
index="parent_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)
Ruby
response = client.index(
index: 'parent_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
Js
const response = await client.index({
index: "parent_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 parent_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
ドキュメントの例:
Python
resp = client.index(
index="parent_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="parent_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)
Ruby
response = client.index(
index: 'parent_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: 'parent_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
Js
const response = await client.index({
index: "parent_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: "parent_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 parent_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 parent_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"
}
次のリクエストを構築して、2つを接続できます:
Python
resp = client.search(
index="parent_example",
size="0",
aggs={
"top-names": {
"terms": {
"field": "owner.display_name.keyword",
"size": 10
},
"aggs": {
"to-questions": {
"parent": {
"type": "answer"
},
"aggs": {
"top-tags": {
"terms": {
"field": "tags.keyword",
"size": 10
}
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'parent_example',
size: 0,
body: {
aggregations: {
"top-names": {
terms: {
field: 'owner.display_name.keyword',
size: 10
},
aggregations: {
"to-questions": {
parent: {
type: 'answer'
},
aggregations: {
"top-tags": {
terms: {
field: 'tags.keyword',
size: 10
}
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "parent_example",
size: 0,
aggs: {
"top-names": {
terms: {
field: "owner.display_name.keyword",
size: 10,
},
aggs: {
"to-questions": {
parent: {
type: "answer",
},
aggs: {
"top-tags": {
terms: {
field: "tags.keyword",
size: 10,
},
},
},
},
},
},
},
});
console.log(response);
コンソール
POST parent_example/_search?size=0
{
"aggs": {
"top-names": {
"terms": {
"field": "owner.display_name.keyword",
"size": 10
},
"aggs": {
"to-questions": {
"parent": {
"type" : "answer"
},
"aggs": {
"top-tags": {
"terms": {
"field": "tags.keyword",
"size": 10
}
}
}
}
}
}
}
}
type は answer という名前のタイプ / マッピングを指します。 |
上記の例は、トップの回答オーナーと各オーナーのトップの質問タグを返します。
コンソール-結果
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total" : {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"top-names": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Sam",
"doc_count": 1,
"to-questions": {
"doc_count": 1,
"top-tags": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "file-transfer",
"doc_count": 1
},
{
"key": "windows-server-2003",
"doc_count": 1
},
{
"key": "windows-server-2008",
"doc_count": 1
}
]
}
}
},
{
"key": "Troll",
"doc_count": 1,
"to-questions": {
"doc_count": 1,
"top-tags": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "file-transfer",
"doc_count": 1
},
{
"key": "windows-server-2003",
"doc_count": 1
},
{
"key": "windows-server-2008",
"doc_count": 1
}
]
}
}
}
]
}
}
}
タグ Sam 、Troll などを持つ回答ドキュメントの数。 |
|
タグ Sam 、Troll などを持つ回答ドキュメントに関連する質問ドキュメントの数。 |