在我们的网站上,我们允许用户使用一组分为以下类别的过滤器来过滤弹性搜索结果:
A
A1
A2
...
B
B1
B2
B3
...
这些只是匹配可以出现在文档字段中的文字标记,例如:
{ tags: ["A1", "B1", "B2"] }
我们现有的查询会加入AND下的所有过滤条件,因此,如果用户选择A1
,B1
和B2
,我们会按(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)
)。
有没有办法在聚合中表达这一点,以便过滤逻辑和聚合计数匹配?
答案 0 :(得分:2)
您可以使用构建存储区的Filter aggregation
基于您还可以在常规查询中用作过滤器的任何内容。如果您能够事先构造过滤器并且没有太多可能的值,则可以使用,因为您需要为每个“下一个”组合定义一个过滤器桶。请注意,与简单Terms aggregation
相比,这可能会影响性能。
有关详细信息,请参阅以下文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html