为什么要花时间:
"aggs": {
"Condition": {
"terms": {
"field": "color",
"size": 10,
"min_doc_count": 1
}
}
比这快得多:
"aggs": {
"Condition": {
"terms": {
"field": "color",
"size": 10,
"min_doc_count": 0
}
}
即使它们都向我返回相同的聚合结果?
答案 0 :(得分:2)
设置min_doc_count = 0也会返回与任何匹配不匹配的术语的存储桶。但是,某些文档计数为零的返回术语可能只属于已删除的文档或其他类型的文档,因此不保证match_all查询会找到这些术语的正文档计数。
因此,如果您有大量已删除的文档,性能会更差,因为聚合会处理更多的文档。尝试optimize the index查看效果是否相似。
答案 1 :(得分:1)
设置min_doc_count = 0也会返回没有的条件的桶 匹配任何命中。但是,有些退货条款有 文档计数为零可能只属于已删除的文档或 来自其他类型的文档,因此不保证match_all 查询会找到这些条款的正文档计数。
除了带有min_doc_count=0
的已删除文档之外,另一个重要警告是聚合不仅限于与父查询匹配或仅限于types
的文档。
见下面的例子: 例如:
1)创建测试索引
PUT test
2)插入type1
和type3
POST _bulk
{"index":{"_index":"test","_type":"type1","_id":"1"}}
{"condition":"good"}
{"index":{"_index":"test","_type":"type1","_id":"2"}}
{"condition":"bad"}
{"index":{"_index":"test","_type":"type1","_id":"3"}}
{"condition":"soso"}
{"index":{"_index":"test","_type":"type1","_id":"4"}}
{"condition":"excellent"}
{"index":{"_index":"test","_type":"type1","_id":"5"}}
{"condition":"bad"}
{"index":{"_index":"test","_type":"type1","_id":"6"}}
{"condition":"bad"}
{"index":{"_index":"test","_type":"type1","_id":"7"}}
{"condition":"excellent"}
{"index":{"_index":"test","_type":"type3","_id":"1"}}
{"condition":"unwell"}
3)查询type1
没有术语bad
的所有文档:
POST test/type1/_search
{
"query": {
"bool": {
"must_not": {
"term": {
"condition": "bad"
}
}
}
},
"aggs": {
"condition_value": {
"terms": {
"field": "condition",
"size": 10,
"min_doc_count": 0
}
}
}
}
响应:
"aggregations": {
"condition_value": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "excellent",
"doc_count": 2
},
{
"key": "good",
"doc_count": 1
},
{
"key": "soso",
"doc_count": 1
},
{
"key": "bad",
"doc_count": 0
},
{
"key": "unwell",
"doc_count": 0
}
]
}
}
请注意结果中type:type3
和condition:bad
的文档。
由于默认情况下聚合一词由doc_count
排序且OP有size:10
,因此它似乎不会影响整体结果设置size:0
会提供更好的图片。简而言之,使用min_doc_count:0
生成聚合的术语数量会大得多。