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

Man*_*ani 5 elasticsearch

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

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

映射看起来像这样:

{
  "mappings": {
    "hotel" : {
      "properties" : {
        "name" : { "type" : "string" },
        "city" : { "type" : "string" },
        "group" : { "type" : "string" },
        "name_suggest" : {
          "type" : "completion",
          "payloads" : true
        }
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

并提供以下文件:

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

{
  "name" :         "Monaco Hotel",
  "city" :         "Munich",
  "group"    :     "2",
  "name_suggest" : "Monaco Hotel"
}'
Run Code Online (Sandbox Code Playgroud)

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

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

在我的诚实意见中,某些文档适用于某些用户并不是一个不寻常的用例.因此,我不想建议任何不允许用户访问的内容.

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

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

TIA

DrT*_*ech 0

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

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

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

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

  4. 使用edge-ngrams方法