【问题标题】:Compute Aggregations before running Filter Query在运行过滤查询之前计算聚合
【发布时间】:2017-05-08 13:06:35
【问题描述】:

我有一个简单的场景:

  1. 我搜索一些文本,弹性返回文档和
    聚合。

  2. 然后,我使用从该聚合返回的字段中的值过滤该搜索。我在过滤器中使用术语查询

  3. 我希望通过我的过滤条件过滤文档,这工作正常。

  4. 但是我想要聚合桶而不应用过滤条件(因为如果我在应用过滤器后得到桶,我只会得到那个值)

  5. 我在不应用过滤器的情况下获取聚合的解决方法:向弹性搜索发送两个请求,在第一个请求中,发送应用过滤器的查询,在第二个请求中,发送不应用过滤器的查询

问题:有没有更好的方法来实现这一点?我环顾四周,我想我可以在定义聚合时设置global:{},但我不确定!

或者更好地说,有没有办法在将过滤器应用于文档之前获得聚合结果?

编辑


我进行了一些搜索,看起来 post_filter 是为此类情况设计的,即,如果您不希望您的过滤器影响聚合。但是,也有很多关于post_filter性能的讨论

现在我想知道发送两个请求在性能方面是否比使用 post_filter 更好。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我认为 post_filter 的性能并没有你说的那么糟糕。它只是在搜索结果聚合后应用过滤器。所以所有文档都必须通过这个过滤器。我认为你应该使用 post_filter 因为-

    1. 它将节省您的网络往返时间,因此您的延迟时间将降至最低。
    2. 将节省您为处理新请求分配资源的 ES 开销。
    3. 您对 post_filtered 搜索和聚合的需求将由同一组文档满足,因此它需要的大部分值已经在主内存或缓存内存中(例如 doc_values)

    因此,性能应该不会受到太大影响。您也可以自己进行分析和分析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2020-02-17
      相关资源
      最近更新 更多