Elasticsearch:使用匹配查询和自动完成

时间:2017-11-21 15:27:34

标签: elasticsearch autocomplete elasticsearch-5

我想在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();

以上似乎无法正常工作。我在响应中得到的结果都是彼此独立的。

有什么建议吗?

1 个答案:

答案 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