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

时间:2016-10-25 13:53:19

标签: elasticsearch kibana

我使用Kibana来显示一些(Elasticsearch)数据,但我想用" Count"来过滤掉所有结果。 而不是1000(X)。

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

我的整个Kibana"数据"标签:

Kibana settings

1 个答案:

答案 0 :(得分:6)

min_doc_countorder: ascending一起使用不会像您一样工作。

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

为什么聚合为空

正如documentation所说:

  

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

这意味着当您使用带参数 size min_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 + 10shard_size)条款发送到节点。如果订单是递增的话,那将是不那么频繁的术语,否则最常见的术语。
  4. 合并此节点中的计数器。
  5. 应用min_doc_count过滤器。
  6. 返回size最常/不常见的结果。
  7. 一次可能很简单吗?

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

    解决方案

    如果确定,但准确性有所下降:

    • 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节点,则会对网络产生影响。

    如果 确定,但准确度有所下降(通常很小)

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

    • 使用术语聚合的shard_min_doc_count parameter来部分预过滤较不频繁的值。这是一种过滤数据的有效方法,特别是如果它们在您的分片之间随机分布(默认)和/或您没有大量分片。

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

    NB:不推荐使用降级条款聚合的顺序(因为它在时间和硬件方面要花费很多精确),将来很可能会被删除。

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