【问题标题】:Querying with Completion Suggesters in Elasticsearch with Java API使用 Java API 在 Elasticsearch 中使用 Completion Suggesters 进行查询
【发布时间】:2018-11-18 18:23:37
【问题描述】:

我已创建索引,并将“建议”字段的映射类型设置为完成。我不知道如何在弹性搜索(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");

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

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    不确定这是否是最好的做法。但这对我有用。希望对您有所帮助。

    @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;
    }
    

    【讨论】:

    • 谢谢!但我遇到了错误“字段“建议”没有类型“完成”。我的映射如下所示:code .field("suggest") .startObject() .field("type", "完成") .field("index_analyzer","simple") .field("search_analyzer","simple") .endObject() code
    【解决方案2】:
    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】:

      但我遇到了错误“字段“建议”没有类型“完成”。我的映射如下所示:code .field("suggest") .startObject() .field("type", "完成") .field("index_analyzer","simple") .field("search_analyzer","simple") .endObject()

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

      根据您提供的映射,我认为您缺少映射周围的属性。尝试以下映射:

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

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

      【讨论】:

        【解决方案4】:

        给仍然需要这个的人。下面的代码 sn-p 适用于 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          • 2017-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多