【问题标题】:Kibana, filter on count greater than or equal to XKibana,过滤大于或等于 X 的计数
【发布时间】:2016-10-29 07:14:00
【问题描述】:

我正在使用 Kibana 可视化一些(Elasticsearch)数据,但我想过滤掉所有“计数”小于小于 1000 (X) 的结果。

我正在使用带有“计数聚合”的 Y 轴,这是我要过滤的计数。我尝试按照几个在线资源的建议添加 min_document_count ,但这并没有改变任何东西。任何帮助将不胜感激。

我的整个 Kibana“数据”标签:

【问题讨论】:

  • 我无法理解 Y 轴上“计数聚合”的目的。您可以在 JSON 输入字段中的 X 轴 上添加 {"min_doc_count": 1000},它不会解决您的问题吗?
  • 我试过了,但它没有返回任何结果。我必须把它降低到一个才能在那里得到结果。尽管我的最高数量是 240 万个文档,而我的最低数量是 2 个。
  • 不返回任何结果是什么意思?你得到 zero 结果?我在 X 轴上的索引上尝试了{"min_doc_count": 1000},它正在工作。无需更改 Y 轴
  • 我的意思是,使用上面演示的设置,只要我添加 min_doc_count:1000,它就会返回“未找到结果:)”。看看:imgur.com/a/863RV
  • 我明白了,我没有找到使用 ascending 顺序但没有找到结果 descending 的结果,对你来说也一样吗?你能把大小增加到 100 吗?

标签: elasticsearch kibana


【解决方案1】:

min_doc_countorder: ascending 一起使用将无法正常工作,除非。

TL;DR:增加shard_size 和/或shard_min_doc_count 应该可以解决问题。


为什么聚合为空

documentation所述:

min_doc_count 标准仅在合并本地术语后应用 所有分片的统计信息。

这意味着当您使用带有参数 sizemin_doc_count 并按降序排列的术语聚合时,Elasticsearch 会检索 size 频率较低的术语在您的数据集中并过滤此列表以仅保留具有 doc_count>min_doc_count 的术语。

如果你想要一个例子,给定这个数据集:

terms | doc_count
----------------
lorem | 3315
ipsum | 2487
olor  | 1484
sit   | 1057
amet  | 875
conse | 684
adip  | 124
elit  | 86

如果您使用 size=3min_doc_count=100 执行聚合,Elasticsearch 将首先计算 3 个频率较低的术语:

conse: 684
adip : 124
elit : 86

然后过滤doc_count>100,所以最终的结果是:

conse: 684
adip : 124

即使您希望“amet” (doc_count=875) 出现在列表中。 Elasticsearch 在计算结果时会丢失该字段,最终无法检索到它。

如果您的情况是,您有太多带有 doc_count 的术语,以至于它们填满了您的列表,然后在过滤阶段之后,您没有结果。

为什么 Elasticsearch 会这样?

每个人都想应用过滤器,然后对结果进行排序。我们可以使用较旧的数据存储来做到这一点,这很好。但是 Elasticsearch 是为扩展而设计的,所以它默认关闭了一些以前使用的魔法。

为什么?因为对于大型数据集,它会中断。

例如,假设您的索引中有 800,000 个不同的术语,数据分布在不同的分片上(默认为 4 个),可以分布在其他机器上(每个分片最多 1 台机器)。

当请求 doc_count>1000 的词条时,每台机器必须计算数十万个计数器(超过 200,000 个,因为某些词条可能出现在一个分片中,其他出现在另一个分片中,等等)。而且由于即使一个分片只看到一次结果,其他分片也可能已经看到了 999 次,因此在合并结果之前它不能丢弃信息。所以我们需要通过网络发送超过 100 万个计数器。所以它很重,尤其是如果经常这样做的话。

因此,默认情况下,Elasticsearch 将:

  1. 为每个分片中的每个术语计算 doc_count
  2. 不对分片上的 doc_count 应用过滤器(在速度和资源使用方面有所损失,但对准确性更好):否 shard_min_doc_count
  3. size * 1.5 + 10 (shard_size) 条款发送到节点。如果顺序是升序,它将是频率较低的术语,否则是最频繁的术语。
  4. 合并此节点中的计数器。
  5. 应用min_doc_count 过滤器。
  6. 返回size 出现频率最高/频率最低的结果。

可以简单一次吗?

是的,当然,我说过这种行为是默认的。如果您没有庞大的数据集,您可以调整这些参数:)

解决方案

如果您不满意但准确性有所下降:

  • shard_size 参数增加到大于[your number of terms with a doc_count below your threshold] + [the number of values you want if you want exact results]

    如果您想要doc_count>=1000 的所有结果,请将其设置为字段的基数(不同术语的数量),但是我看不到order: ascending 的意义。

    如果您有很多术语,则会对内存产生巨大影响,如果您有多个 ES 节点,则会影响网络。

如果您没有问题但准确度有所下降(通常是轻微的)

  • 在该总和和[the number of values you want if you want exact results] 之间设置shard_size。如果您想要更快的速度或者如果您没有足够的 RAM 来执行精确的计算,它会很有用。这个值的好坏取决于您的数据集。

  • 使用术语聚合的shard_min_doc_count parameter 部分预过滤频率较低的值。这是一种过滤数据的有效方法,尤其是当它们随机分布在您的分片之间(默认)和/或您没有很多分片时。

您也可以将数据放在一个分片中。在准确性方面没有损失,但对性能和扩展性不利。但是,如果您的数据集较小,您可能不需要 ES 的全部功能。

注意: 术语聚合的降序已被弃用(因为它在时间和硬件方面花费了很多才能准确),将来很可能会被删除。

PS: 你应该添加 Kibana 生成的 Elasticsearch 请求,当 Kibana 返回数据但不是你想要的数据时,它通常很有用?当您单击屏幕截图中图表下方的箭头时,您可以在“请求”选项卡中找到它(例如:http://imgur.com/a/dMCWE)。

【讨论】:

  • 很清楚,我在网上找到了一些答案,这些答案为我指明了这个大方向,但没有一个像你的那样清楚。赏金给你,享受吧!
猜你喜欢
  • 2019-02-28
  • 2016-07-27
  • 2016-12-27
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多