我目前正在评估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
答案 0 :(得分:3)
根据1.2.0版,您可以向建议者添加上下文并获取过滤后的建议。
另见How can I add filter to Completion Suggester in ElasticSearch?
答案 1 :(得分:0)
完成建议器根本不使用传统搜索,因此您无法自动过滤您的建议。您有几个选择:
您已指定payloads: true
,但您似乎没有使用它们。如果您只有几个groups
,那么您可以将它们包含在有效负载中,并在您的应用中过滤掉无效的建议。
同样,只有少数groups
您可以等待ContextSuggester合并。
检索超出您需要的建议,然后运行搜索,过滤掉无效结果。
使用edge-ngrams方法