如何为前缀Suggestion编写REST高级客户端查询?

时间:2018-02-07 07:09:19

标签: elasticsearch

以下查询在kibana上正常工作。我想为ReastHighLevel Client编写相同的内容。

 POST taxon/_search?pretty
{
    "suggest": {
        "name-suggest" : {
            "prefix" : "man", 
            "completion" : { 
                "field" : "name" 
            }
        }
    }
}

我需要使用RestHighLevelClient编写上述查询。 我提出的那个没有帮助

SearchRequest searchRequest = new SearchRequest("taxon"); 
        searchRequest.types("taxon");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        SuggestionBuilder termSuggestionBuilder =SuggestBuilders.completionSuggestion("name").text(data); 

        SuggestBuilder suggestBuilder = new SuggestBuilder();

        suggestBuilder.addSuggestion("name-suggest", termSuggestionBuilder); 

        searchSourceBuilder.suggest(suggestBuilder);

    searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse=null;
        try {
            searchResponse = client.search(searchRequest);
            client.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("excetion is here");
            e.printStackTrace();
        }
        System.out.println(searchResponse);

上面的查询给出了正确的结果,但是如何从中获取_source条目。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我能够在java

中获取完成建议器的所有建议响应,如下所示
/* Create a Consumer to process each of the suggestion */

    Consumer<Suggestion<? extends org.elasticsearch.search.suggest.Suggest.Suggestion.Entry<? extends Option>>> suggestionConsumer = suggestion -> {

                for(org.elasticsearch.search.suggest.Suggest.Suggestion.Entry<? extends Option> entry: suggestion.getEntries()){
                     for(Option option:  entry.getOptions()){
                       //PRINT EACH SUGGESTION TEXT VALUE
                         System.out.println(option.getText());
                     }
                }

            };
      /* Fetch search results */
     searchResponse = client.search(searchRequest); 
    /* Fetch search response suggestions */
    Suggest suggestions=searchResponse.getSuggest();
   /* Handle each of the suggestions with foreach */
    suggestions.forEach(suggestionConsumer);


Please note that JAVA imports I have used are
Suggestion: org.elasticsearch.search.suggest.Suggest.Suggestion
Entry:      org.elasticsearch.search.suggest.Suggest.Suggestion.Entry
Option:     org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option;

答案 1 :(得分:0)

我认为来源来自建议字段中的选项。所以我在您的代码之后使用了此代码。它在建议字段中提供了所有可能的值。

/// *与上一行相同

SearchResponse searchResponse=null;
        try {
            searchResponse = client.search(searchRequest);
            client.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("exception is here");
            e.printStackTrace();
        }
        System.out.println(searchResponse);


        Suggest suggest = searchResponse.getSuggest(); 
        System.out.println("suggest variable has:  "+suggest);

        List<String> returnList =new ArrayList<>();


        CompletionSuggestion termSuggestion = suggest.getSuggestion("name-suggest");
        List<CompletionSuggestion.Entry.Option> termSuggestion1 = termSuggestion.getOptions();
        System.out.println("term suggestion value is:  "+termSuggestion1);

        for (CompletionSuggestion.Entry.Option entry : termSuggestion1) { 

            System.out.println("termsuggestion.entry value:  "+entry.getText());


            String suggestText = entry.getText().toString();
            System.out.println("suggest text value: "+suggestText);
            returnList.add(suggestText);
            System.out.println("output of return:  "+returnList);
        }