如果没有使用构面过滤器返回构面,弹性搜索是否可以返回所有方面?

时间:2013-06-12 13:47:32

标签: filter elasticsearch facet

我目前正在将elasticsearch与rubberband gem结合使用来索引在线目录中的项目。我的用例如下:

一个项目可以有多个子项目,例如一本有多个故事的漫画书。这些故事在项目文档中被编入索引作为嵌套文档,并具有三个特定功能。一个故事:

  • 有一个或多个作家
  • 有一个或多个插图画家
  • 是意甲的一部分,或者有零个或多个英雄。

我正在对这三个功能应用facet,如果用户提供了搜索词,我会添加一个facet过滤器。给定的搜索词也用于查询整个索引。有时用户正在搜索漫画书中的特定故事。如果是这样的话,我希望这些方面能够回归作家,插画家和那些特定故事的系列,而不是整本漫画书的各个方面,但是没有办法提前知道这一点。用户只填写搜索词,并且不区分搜索漫画书或搜索故事。我已经想到了以下这个问题的解决方案:

  • 如果给定的搜索词在应用于构面过滤器时返回构面,那么我假设用户正在漫画书中搜索故事并且可以返回构面
  • 如果给定的搜索词在应用于构面过滤器时没有返回构面,那么我假设用户正在搜索漫画书本身并且必须删除过滤器以返回构面。

我想知道如果没有返回facet,弹性搜索是否有可能告诉facet过滤器自行删除?

2 个答案:

答案 0 :(得分:0)

您可以简单地将每个方面添加两次,一次使用构面过滤器,一次不使用?

答案 1 :(得分:0)

我正在阅读两个问题,回答第一个问题:如果你想返回零计数的方面,你可以在查询中使用all_terms: true,就像在这个例子中一样(取自{{3 }}):

{
    "query" : {
        "match_all" : {  }
    },
    "facets" : {
        "tag" : {
            "terms" : {
                "field" : "tag",
                "all_terms" : true
            }
        }
    }
}

(此解决方案要求您可以访问原始查询。如果隐藏在rubberband gem的某些逻辑后面,您必须检查是否可以在那里设置此属性。)

我担心你的第二个问题的假设解决方案(“如果没有返回任何方面,是否有可能告诉方面过滤器自行删除”)将使得很难确定实际结果结果,虽然首先没有