如何获取 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 下加入了所有过滤条件,因此如果用户选择 A1
、B1
和 B2
,我们将按 (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
在我们的网站上,我们允许用户使用一组分为以下类别的过滤器来过滤 Elastic Search 结果:
A
A1
A2
...
B
B1
B2
B3
...
这些只是匹配可以出现在文档字段中的文字标签,例如:
{ tags: ["A1", "B1", "B2"] }
我们现有的查询在 AND 下加入了所有过滤条件,因此如果用户选择 A1
、B1
和 B2
,我们将按 (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