在Elasticsearch中,`terms`聚合的“无限制的误差”(unbounded error)是指当聚合结果按文档计数(`doc_count`)升序排序时,无法准确计算聚合结果的误差范围。这种误差是由于Elasticsearch的分片(shard)机制导致的。
为什么会出现“无限制的误差”?
Elasticsearch的`terms`聚合默认是按文档计数降序排序的,这种情况下,Elasticsearch可以计算出每个桶(bucket)的文档计数误差上限(`doc_count_error_upper_bound`)。这个误差上限是基于分片返回的最大桶的大小计算的。
然而,当`terms`聚合按文档计数升序排序时,Elasticsearch无法准确计算出误差范围,因为分片返回的结果可能不包含某些低频词,而这些词可能在其他分片中存在。由于无法确定这些低频词的完整分布,Elasticsearch无法提供一个可靠的误差上限,因此称为“无限制的误差”。
示例
假设有一个`terms`聚合,按文档计数升序排序:
```json
GET /_search
{
"aggs": {
"genres": {
"terms": {
"field": "genre",
"order": { "_count": "asc" }
}
}
}
}
```
在这种情况下,Elasticsearch无法准确报告每个桶的文档计数误差,因此会返回一个值为-1的`doc_count_error_upper_bound`。
如何避免“无限制的误差”?
为了避免这种误差,建议不要使用`terms`聚合按文档计数升序排序。如果需要查找稀有词,可以使用`rare_terms`聚合,它专门用于处理稀有词的场景。
总结
“无限制的误差”是由于Elasticsearch的分片机制和`terms`聚合的实现方式导致的。在按文档计数升序排序时,Elasticsearch无法准确计算误差范围,因此不推荐使用这种排序方式。如果需要处理稀有词或低频词,建议使用`rare_terms`聚合。