在弹性搜索中计算* Facet Counts *的有效方法

时间:2012-08-17 23:56:25

标签: elasticsearch faceted-search

我想计算构面查询用户界面的构面数,但我想我错过了一些东西,因为我无法使用构面过滤器得到我需要的数字。

这是一个例子。给出了两个方面,每个方面有三个可能的术语:

Colors: {red, yellow, blue}
Notes: {do, re, mi}

当我进行搜索时,构面中每个术语的计数不会考虑另一个方面中设置的过滤器。

举例说明:

[ ] All colors (18)
 [x] Red (10)
 [ ] Green (5)
 [ ] Blue (3)

[ ] All notes (18)
 [ ] Do (5)
 [x] Re (7)
 [ ] Mi (6)

请注意,每个方面内的总数与查询的总点击数相加,就像没有设置过滤器一样。

我想要的行为是让Notes facet中的数字考虑到Colors facet中的过滤器,反之亦然。也就是说,音符术语的数字应该总和为10(以匹配红色滤波器),而不是18。

有趣的是,文档中的示例屏幕截图使用了Linked In中的一个示例,该示例实际演示了我想要的行为。

http://www.elasticsearch.org/guide/reference/api/search/facets/

我能够通过为每个方面的每个术语手动重新提交一次查询来获得我想要的结果(呃)但是我想知道是否有办法通过更改我的查询获得与开箱即用的LinkedIn相同的行为

1 个答案:

答案 0 :(得分:7)

我发现这个工作的唯一方法是通过以下逻辑进行任何多选方面:

每当用户从构面中选择一个值(“向下钻取”)时,您将向所有构面添加相应的过滤器(通过facet_filter)除了完成选择的构面,以及到顶级过滤器以过滤查询结果。

换句话说,给定3个多选面,A,B& C:

  • 从A =>中选择值将过滤器添加到顶级 过滤器 以及构面B和C的 facet_filter
  • 从B =>中选择值将过滤器添加到顶级 过滤器 以及A&的 facet_filter 下进行。
  • ......等等

顶级过滤器始终组合所有选择的过滤器,而每个单独的构面根据 其他 构面中的选择包含facet_filters。