子聚合
编辑子聚合编辑
一种特殊的单桶聚合,用于选择具有指定类型的子文档,如 join
字段 中定义的。
此聚合有一个选项
-
type
- 应该选择的子类型。
例如,假设我们有一个问题和答案的索引。答案类型在映射中具有以下 join
字段
response = client.indices.create( index: 'child_example', body: { mappings: { properties: { join: { type: 'join', relations: { question: 'answer' } } } } } ) puts response
PUT child_example { "mappings": { "properties": { "join": { "type": "join", "relations": { "question": "answer" } } } } }
question
文档包含一个标签字段,而 answer
文档包含一个所有者字段。使用 children
聚合,即使这两个字段存在于两种不同类型的文档中,也可以在单个请求中将标签桶映射到所有者桶。
问题文档示例
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
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
文档示例
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
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" }
可以构建以下请求将两者连接在一起
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
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 } ] } } } ] } } }