如何获取 Elastic Search 聚合来镜像查询过滤逻辑?

How to get Elastic Search aggregation to mirror the query filtering logic?

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

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

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

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

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

我们想将其更改为 "OR within each filter category" 和 "AND across categories",以便您获得:(A1) AND (B1 OR B2).

现在,皱纹:我们还在 "tags" 字段上使用 "terms" 聚合来预测应用下一个过滤器会返回多少项目。在我们的 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 会破坏从 "terms" 聚合返回的计数,因为术语聚合仍在预测 A1 AND B1 AND B2。添加 B3 将使我们得到 A1 AND B1 AND B2 AND B3,从而缩小聚合的计数,而它实际上会扩大结果的范围(我们希望 (A1) AND (B1 OR B2 OR B3))。

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

您可以使用 Filter aggregation 构建基于任何您也可以在常规查询中用作过滤器的存储桶。如果您能够预先构建过滤器并且没有太多可能的值,那么这会起作用,因为您需要为每个 "next" 组合定义一个过滤器桶。请注意,与简单的 Terms aggregation.

相比,这可能会对性能产生影响

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