寻找最佳做法来过滤Completion Suggester的建议

时间:2014-02-04 13:33:19

标签: elasticsearch

我目前正在评估ElasticSearch中的Completion Suggester功能以实现自动完成功能。到目前为止看起来确实很不错。但是我在权限方面有点挣扎。

我们假设我有一个像ElesticSearch网站上的例子那样的酒店的索引。除了获得与给定短语匹配的酒店之外,我还想检查是否允许用户看到“建议”。像酒店只适合某个客户的东西。我添加了一个用于保存组/权限的新字段,就像用于测试目的的简单字符串一样。我想要完成的是按群组过滤。

映射看起来像这样:

{
  "mappings": {
    "hotel" : {
      "properties" : {
        "name" : { "type" : "string" },
        "city" : { "type" : "string" },
        "group" : { "type" : "string" },
        "name_suggest" : {
          "type" : "completion",
          "payloads" : true
        }
      }
    }
  }
}'

并附上以下文件:

{
  "name" :         "Mercure Hotel Munich",
  "city" :         "Munich",
  "group "   :     "1",
  "name_suggest" : "Mercure Hotel Munich"
}'

{
  "name" :         "Monaco Hotel",
  "city" :         "Munich",
  "group"    :     "2",
  "name_suggest" : "Monaco Hotel"
}'

因此,如果组“1”的用户输入“M”,他应该只获得“慕尼黑美居酒店”。反之亦然,组“2”的用户输入“M”他应该只获得“摩纳哥酒店”。

我在Stackoverflow上看到有关Completion Suggester +过滤器的一些类似帖子,并且它不能一起工作。

在我看来,某些文档适用于某些用户并不是一个不寻常的用例。因此,我不想建议任何不允许用户访问的内容。

所以我的问题是:实现这一目标的最佳做法是什么?我的意思是考虑即将推出的ES版本的性能和可维护性。

https://github.com/elasticsearch/elasticsearch/pull/4044集成之前,我们应该坚持使用edgeNGram解决方案吗?或者是否有使用完成建议器的另一种解决方案?

TIA

2 个答案:

答案 0 :(得分:3)

根据1.2.0版,您可以向建议者添加上下文并获取过滤后的建议。

Introductory blog post

Full Docs

另见How can I add filter to Completion Suggester in ElasticSearch?

答案 1 :(得分:0)

完成建议器根本不使用传统搜索,因此您无法自动过滤您的建议。您有几个选择:

  1. 您已指定payloads: true,但您似乎没有使用它们。如果您只有几个groups,那么您可以将它们包含在有效负载中,并在您的应用中过滤掉无效的建议。

  2. 同样,只有少数groups您可以等待ContextSuggester合并。

  3. 检索超出您需要的建议,然后运行搜索,过滤掉无效结果。

  4. 使用edge-ngrams方法