使用Java API查询Elasticsearch中的Completion建议者

时间:2014-04-04 12:50:53

标签: elasticsearch

我已创建索引,并且我的建议的映射类型为#39;字段设置为完成。我无法弄清楚如何在弹性搜索(Java API)

中配置完成建议的查询

我试图使用此查询来实现我的实现。

"song-suggest" : {
    "text" : "n",
    "completion" : {
        "field" : "suggest"
    }
}

这是我到目前为止所拥有的,

CompletionSuggestionBuilder compBuilder = new CompletionSuggestionBuilder("complete"); 
compBuilder.text("n");
compBuilder.field("suggest");

SearchResponse searchResponse = localClient.prepareSearch(INDEX_NAME)
    .setTypes("completion")
    .setQuery(QueryBuilders.matchAllQuery())
    .addSuggestion(compBuilder)
    .execute().actionGet();

 CompletionSuggestion compSuggestion = searchResponse.getSuggest().getSuggestion("complete");

我错过了什么,做错了吗?谢谢!

4 个答案:

答案 0 :(得分:2)

不确定这是否是最好的事情。但这对我有用。希望它有所帮助。

@Override
public List<SuggestionResponse> findSuggestionsFor(String suggestRequest) {
    CompletionSuggestionBuilder suggestionsBuilder = new CompletionSuggestionBuilder("completeMe");
    suggestionsBuilder.text(suggestRequest);
    suggestionsBuilder.field("suggest");
    SuggestRequestBuilder suggestRequestBuilder =
            client.prepareSuggest(MUSIC_INDEX).addSuggestion(suggestionsBuilder);

    logger.debug(suggestRequestBuilder.toString());

    SuggestResponse suggestResponse = suggestRequestBuilder.execute().actionGet();

    Iterator<? extends Suggest.Suggestion.Entry.Option> iterator =
            suggestResponse.getSuggest().getSuggestion("completeMe").iterator().next().getOptions().iterator();

    List<SuggestionResponse> items = new ArrayList<>();
    while (iterator.hasNext()) {
        Suggest.Suggestion.Entry.Option next = iterator.next();
        items.add(new SuggestionResponse(next.getText().string()));
    }
    return items;
}

答案 1 :(得分:1)

  

但是我遇到了错误&#34;字段&#34;建议&#34;没有类型&#39;完成&#39;。我的映射看起来像这样:代码.field(&#34;建议&#34;)。startObject()。field(&#34;类型&#34;,&#34;完成&#34;).field(&#34 ; index_analyzer&#34;,&#34; simple&#34;)。field(&#34; search_analyzer&#34;,&#34; simple&#34;)。endObject()

听起来,您的映射未正确应用。你看了吗?

根据您提供的映射,我认为您错过了映射周围的属性。请尝试以下映射:

XContentFactory.jsonBuilder().startObject()
  .startObject("properties")
    .startObject("suggest")
      .field("type", "completion")
    .endObject()
  .endObject()
.endObject()

顺便说一下,SimpleAnalyzer是建议的默认分析器。因此,您无需明确定义它。

答案 2 :(得分:1)

paramsMap = req.getParameterMap();

String prefix = getParam("prefix");     

if (prefix == null) {
    EndpointUtil.badRequest("Autocomplete EndPoint: prefix parameter is missing", resp);
    return;
}

SearchRequest searchRequest;
SearchSourceBuilder searchSourceBuilder; 

searchRequest = new SearchRequest("section");
searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuilder.from(0);
searchSourceBuilder.size(MAX_HITS);     

CompletionSuggestionBuilder suggestionBuilder = new CompletionSuggestionBuilder("text.completion")
        .prefix(prefix, Fuzziness.AUTO).size(MAX_HITS);            

SuggestBuilder suggestBuilder  = new SuggestBuilder();

suggestBuilder.addSuggestion(SUGGEST_NAME, suggestionBuilder);

searchSourceBuilder.suggest(suggestBuilder);

searchRequest.source(searchSourceBuilder);      

SearchResponse searchResponse = getElasticClient().search(searchRequest);   

Suggest suggest = searchResponse.getSuggest();

List<Document> results = new ArrayList<Document>();     

  Suggest.Suggestion<Suggest.Suggestion.Entry<Suggest.Suggestion.Entry.Option>> suggestion 
    = suggest.getSuggestion(SUGGEST_NAME);

    List<Suggest.Suggestion.Entry<Suggest.Suggestion.Entry.Option>> list = suggestion.getEntries();
    for(Suggest.Suggestion.Entry<Suggest.Suggestion.Entry.Option> entry :list) {
        List<Suggest.Suggestion.Entry.Option> options = entry.getOptions();
        for(Suggest.Suggestion.Entry.Option option : options) {

            Document doc = new Document();

            doc.append("text",option.getText().toString());                 

            results.add(doc);
        }
    }    

sendJsonResult(results, resp);                  

答案 3 :(得分:1)

向仍需要此功能的任何人。以下代码段适用于ES v 6.3:-

CompletionSuggestionBuilder suggestionBuilder = new CompletionSuggestionBuilder("<field_name>").prefix("<search_term>");

        SearchRequestBuilder requestBuilder =
                oaEsClient.client().prepareSearch("<index_name>").setTypes("<type_name>")
                .suggest(new SuggestBuilder().addSuggestion("<suggestion_name>",suggestionBuilder))
                .setSize(20)
                .setFetchSource(true)
                .setExplain(false)
                ;
        SearchResponse response = requestBuilder.get();
        Suggest suggest = response.getSuggest();