我想在ES5中使用匹配查询和自动完成建议。基本上我想根据属性限制自动完成结果,例如自动完成只能在城市内返回结果。
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("cityName", city);
SuggestBuilder suggestBuilder = new SuggestBuilder()
.addSuggestion("region", SuggestBuilders.completionSuggestion("region").text(text));
SearchResponse response = client.prepareSearch(index).setTypes(type)
.suggest(suggestBuilder)
.setQuery(queryBuilder)
.execute()
.actionGet();
以上似乎无法正常工作。我在响应中得到的结果都是彼此独立的。
有什么建议吗?
答案 0 :(得分:0)
看起来建议构建器正在创建完成建议器。完成建议器存储在与主索引分开的专用结构中,这意味着它无法访问您的过滤器字段,如cityName
。要过滤建议,您需要在创建建议时显式定义这些相同的过滤器值,与要为其附加建议的文档建立索引的属性分开。这些建议过滤器称为上下文。可以找到更多信息in the docs.
与上述相关的文档将比我更好地解释这一点,但这是一个简短的例子。使用如下映射:
"auto_suggest": {
"type": "completion",
"analyzer": "simple",
"contexts": [
{
"name": "cityName",
"type": "category",
"path": "cityName"
}
]
}
索引设置的此部分定义了一个名为auto_suggest
的完成建议器,其中包含可用于过滤建议的cityName上下文。请注意,path
值已设置,这意味着此上下文过滤器从主索引中的cityName属性获取其值。如果要将上下文显式设置为主索引中尚未存在的内容,则可以删除路径值。
要在提供上下文时请求建议,这样的结合上述设置应该有效:
"suggest": {
"auto_complete":{
"text":"Silv",
"completion": {
"field" : "auto_suggest",
"size": 10,
"fuzzy" : {
"fuzziness" : 2
},
"contexts": {
"cityName": [ "Los Angeles" ]
}
}
}
}
请注意,此请求还允许模糊,使其对拼写错误有一定的弹性。它还限制了返回10的建议数量。
值得注意的是,在ES 5.x中,完成建议器是以文档为中心的,因此如果多个文档具有相同的建议,如果该建议与输入的字符匹配,您将收到该建议的副本。 ES 6中有一个选项可以去除重复建议,但在5.x中没有类似的内容。同样,最好考虑在他们自己的索引中存在的完成建议,特别是FST,更详细地解释here。