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

我在Y轴上使用“计数汇总”,这是我要过滤的计数。我尝试根据一些在线资源的建议添加min_document_count,但这没有任何改变。任何帮助将不胜感激。

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

elasticsearch - Kibana,对大于或等于X的计数进行过滤-LMLPHP

最佳答案

除了将min_doc_countorder: ascending一起使用外,其他方法均无效。

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

为什么聚合为空

documentation所述:



这意味着当您使用带有参数大小和min_doc_count并以降序排列的术语聚合时,Elasticsearch会检索数据集中频率较小的术语,并过滤此列表以仅保留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次,因此在合并结果之前,它无法删除信息。因此,我们需要通过网络发送超过一百万个计数器。因此,它非常繁重,尤其是经常执行时。

因此,默认情况下,Elasticsearch将:
  • 计算每个分片中每个术语的doc_count
  • 不对分片上的doc_count应用过滤器(在速度和资源使用方面有所损失,但准确性更高):No shard_min_doc_count
  • size * 1.5 + 10(shard_size)术语发送到节点。如果顺序升序,它将是频率较低的术语,否则是频率最高的术语。
  • 合并此节点中的计数器。
  • 应用min_doc_count过滤器。
  • 返回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节点,则会对网络产生巨大影响。

  • 如果,则可以,但会损失一些准确性(通常是次要的)
  • 在此总和和shard_size之间设置[the number of values you want if you want exact results]。如果您想提高速度或没有足够的RAM来执行准确的计算,这将很有用。这个值的高低取决于您的数据集。
  • 使用术语聚合的shard_min_doc_count parameter对较低频率的值进行部分预过滤。这是一种过滤数据的有效方法,尤其是当数据在分片之间随机分布(默认)和/或您没有很多分片时。

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

    注意:已弃用术语聚合的降序(因为要花费大量时间和硬件才能保证准确性),将来很有可能将其删除。

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

    09-25 17:39
    查看更多