嵌套聚合
nested 聚合允许您对嵌套对象内部的字段进行聚合。nested 类型是对象数据类型的特殊版本,它允许以可以彼此独立查询的方式对对象数组进行索引。
使用 object 类型时,所有数据都存储在同一个文档中,因此搜索的匹配可以跨越子文档进行。例如,设想一个 logs 索引,其中 pages 被映射为 object 数据类型:
PUT logs/_doc/0
{
"response": "200",
"pages": [
{
"page": "landing",
"load_time": 200
},
{
"page": "blog",
"load_time": 500
}
]
}
UDB-SX 会合并实体关系的所有子属性,结果看起来类似这样:
{
"logs": {
"pages": ["landing", "blog"],
"load_time": ["200", "500"]
}
}
因此,如果您想使用 pages=landing 和 load_time=500 搜索此索引,即使 landing 的 load_time 值是 200,此文档也符合条件。
如果您想确保不发生这种跨对象匹配,请将该字段映射为 nested 类型:
PUT logs
{
"mappings": {
"properties": {
"pages": {
"type": "nested",
"properties": {
"page": { "type": "text" },
"load_time": { "type": "double" }
}
}
}
}
}
嵌套文档允许您索引相同的 JSON 文档,但会将您的页面保存在不同的 Lucene 文档中,使得只有像 pages=landing 和 load_time=200 这样的搜索才会返回预期结果。在内部,嵌套对象将数组中的每个对象作为单独的隐藏文档进行索引,这意味着每个嵌套对象都可以独立于其他对象进行查询。
您必须指定一个相对于包含嵌套文档的父对象的嵌套路径:
GET logs/_search
{
"query": {
"match": { "response": "200" }
},
"aggs": {
"pages": {
"nested": {
"path": "pages"
},
"aggs": {
"min_load_time": { "min": { "field": "pages.load_time" } }
}
}
}
}
示例响应
...
"aggregations" : {
"pages" : {
"doc_count" : 2,
"min_load_time" : {
"value" : 200
}
}
}
}