在弹性搜索中doc_count_error_upper_bound的重要性是什么?如何最小化?

时间:2016-05-29 18:49:39

标签: elasticsearch

我总是在doc_count_error_upper_bound属性的elasticsearch中获得聚合查询的高值。对于具有近十亿个索引文档的ES集群,有时高达8000或9000。我在大约5M doc的索引上运行查询,我得到的值大约是300到500。

问题是我的结果有多么不正确(我正在尝试基于下面JSON的前20个计数查询)

"aggs":{ "group_by_creator":{ "terms":{ "field":"creator" } } } }

3 个答案:

答案 0 :(得分:16)

official documentation中已经很好地解释了这一点。

当运行terms聚合时,每个分片都会找出自己的前20个术语列表,然后返回其20个顶级术语。协调节点将收集所有这些术语并对其重新排序以获得所有分片的总体前20个术语。

如果你有多个分片,那么正如官方文档示例中所示,可能存在非零错误计数并且有compute the doc count error的方法就不足为奇了。

每个索引使用一个分片,doc错误计数将始终为零,但根据您的索引拓扑结构,它可能并不总是可行,尤其是如果您有近十亿个文档。但对于具有5M文档的索引,如果它们不大,则可以将它们存储在单个分片中。当然,这很大程度上取决于你的硬件,但如果你的分片大小不超过15 / 20GB,你应该没问题。您应该尝试使用单个分片创建一个新索引,并查看它是如何进行的。

答案 1 :(得分:1)

我创建了此可视化文件以尝试自己理解。

Example of elastic aggregation errors

聚合错误有两个级别:

  • 整体汇总-向您显示缺少一项的潜在价值
  • 术语水平-表示返回的术语中可能存在的不准确性

第一个给出整个聚合的值,其中 表示一个术语在 不要将其纳入最终的条款列表。

第二个显示了由 表示文档中最坏情况错误的汇总 计数,并在确定shard_size的值时很有用 参数。这是通过将 所有未返回该术语的分片返回的最后一个术语。

您可以通过设置以下内容来查看术语级别错误:

"show_term_doc_count_error": true

默认情况下显示整体汇总错误

official docs的行情

答案 2 :(得分:0)

将shardSize设置为int.MaxValue可以减少计数错误