如何获得弹性搜索聚合以镜像查询过滤逻辑?

时间:2016-08-10 17:34:10

标签: elasticsearch elasticsearch-aggregation

在我们的网站上,我们允许用户使用一组分为以下类别的过滤器来过滤弹性搜索结果:

A
  A1
  A2
  ...
B
  B1
  B2
  B3
  ...

这些只是匹配可以出现在文档字段中的文字标记,例如:

{ tags: ["A1", "B1", "B2"] }

我们现有的查询会加入AND下的所有过滤条件,因此,如果用户选择A1B1B2,我们会按(A1 AND B1 AND B2)进行过滤。

我们希望将此更改为“在每个过滤器类别中”或“跨类别”,以便您获得:(A1) AND (B1 OR B2)

现在,皱纹:我们还在“标签”字段上使用“术语”聚合来预测应用下一个过滤器会返回多少项。在我们的UI上,这看起来像:

A
  A1   12   # If the user adds the A1 filter, there'll be 12 results.
  A2   3    # etc.
  ...
B
  B1   5
  B2   0
  B3   2
  ...

此处,将过滤器逻辑更改为AND / OR会中断从“术语”聚合返回的计数,因为术语聚合仍在预测A1 AND B1 AND B2。添加B3会使我们A1 AND B1 AND B2 AND B3从而缩小聚合的计数,而实际上会扩大结果的范围(我们需要(A1) AND (B1 OR B2 OR B3))。

有没有办法在聚合中表达这一点,以便过滤逻辑和聚合计数匹配?

1 个答案:

答案 0 :(得分:2)

您可以使用构建存储区的Filter aggregation基于您还可以在常规查询中用作过滤器的任何内容。如果您能够事先构造过滤器并且没有太多可能的值,则可以使用,因为您需要为每个“下一个”组合定义一个过滤器桶。请注意,与简单Terms aggregation相比,这可能会影响性能。

有关详细信息,请参阅以下文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html