2017-05-08 113 views
0

之前,我有一个简单的场景:计算聚合运行筛选查询

  1. 我寻找一些文本,弹性恢复文件和
    聚合。

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

  3. 我希望文档能够根据我的过滤条件进行过滤,而且过滤条件正常。

  4. 但我想不应用过滤条件的聚集桶(因为如果我应用过滤后得到的水桶,我就得到一个值)

  5. 我的解决方法,以获得聚合不应用过滤器:发送两个请求,弹性搜索,在第一个请求,发送带过滤器的查询应用,并在第二个请求,发送查询,而不应用的过滤器

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

或者更好的说,有没有一种方法可以在将滤镜应用到文档之前获得聚合结果?

编辑


我做了一些搜索,它看起来是post_filter是专为这样的情况下,即,如果你不想让你的过滤器来影响聚合。但是,也有大量的性能谈判post_filter

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

回答

1

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

  1. 这将节省您的网络往返旅行,所以你将有最小的延迟。
  2. 将节省分配资源以处理新请求的ES开销。
  3. 您的post_filtered搜索和聚合需求,将通过同一套文件来实现,因此大多数需要将已经在主内存中或高速缓存存储器(如doc_values的东西)的值的

所以,性能应该没有受到太大的影响。你也可以自己分析和分析它。