Kibana,过滤计数大于或等于 X

Kibana, filter on count greater than or equal to X

我正在使用 Kibana 来可视化一些 (Elasticsearch) 数据,但我想过滤掉所有 "Count" less 小于 1000 (X) 的结果.

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

我的整个 Kibana "data" 选项卡:

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

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


为什么聚合为空

documentation所述:

The min_doc_count criterion is only applied after merging local terms statistics of all shards.

这意味着当您使用带有参数 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<1000 的术语太多,以至于它们填满了您的列表,然后在过滤阶段之后,您没有任何结果。

为什么 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. Return size most/less 频繁结果。

能不能简单一次?

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

解决方案

如果你 OK但准确性有所下降:

  • 增加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 节点,它会影响网络。

如果你 OK,但有一些准确性损失(通常是轻微的)

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

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

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

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

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