首页 > 解决方案 > SuggestRequestBuilder.java / org.elasticsearch.action.suggest 缺失

问题描述

我正在尝试将 Elasticsearch spring boot 项目从 1.5.7 升级到 2.2.1。我在项目中的唯一依赖项(与弹性搜索相关)是 spring-data-Elasticsearch。但是由于缺少/不推荐使用的类很少,因此SuggestRequestBuilder我的构建失败了。我也查了谷歌也找不到任何合适的替代品。谁能帮我找到使用这些的替代方法suggestRequestBuildersuggestionResponse.

标签: javaspring-bootelasticsearch

解决方案


使用 spring-boot 2.3.1 和 spring-boot-starter-data-elasticsearch 我正在使用包中的Suggest*org.elasticsearch.search.suggest.*

例子:

ES索引中添加了一些产品:

{
    "_index": "products",
    "_id": "WtYOV3MBurwvUvNLpjxM",
    "_source": {
        "productName": "Hammer",
        "available": true
    }
},
{
    "_index": "products",
    "_id": "XtYdV3MBurwvUvNLXjzO",
    "_source": {
        "productName": "Hammer with handle",
        "available": true
    }
}

productName现在我不想对基于字段的“hamer”一词提出建议。这是找到正确建议的完整代码:

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.SuggestBuilders;
import org.elasticsearch.search.suggest.SuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestion;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.stereotype.Component;    
import ...;

@Component
public class ProductService {

  private static final Logger logger = getLogger(ProductService.class);

  public void suggestProducts() {

    ClientConfiguration clientConfiguration =
        ClientConfiguration.builder().connectedTo("localhost:9200").build();
    RestHighLevelClient client = RestClients.create(clientConfiguration).rest();

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    SuggestionBuilder termSuggestionBuilder =
        SuggestBuilders.termSuggestion("productName").text("Hamer");
    SuggestBuilder suggestBuilder = new SuggestBuilder();
    suggestBuilder.addSuggestion("suggest_product", termSuggestionBuilder);
    searchSourceBuilder.suggest(suggestBuilder);

    SearchRequest searchRequest = new SearchRequest();
    searchRequest.source(searchSourceBuilder);
    SearchResponse searchResponse;
    try {
      searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
      Suggest suggest = searchResponse.getSuggest();
      TermSuggestion termSuggestion = suggest.getSuggestion("suggest_product");
      for (TermSuggestion.Entry entry : termSuggestion.getEntries()) {
        for (TermSuggestion.Entry.Option option : entry) {
          String suggestText = option.getText().string();
          logger.info(suggestText);
        }
      }
    } catch (IOException e) {
      logger.error(e.getMessage());
    }
  }
}

这会打印出正确的结果:“锤子”。当然还有其他类型的建议可用(termSuggestion, completionSuggestion, phraseSuggestion),您可以灵活调整查询的参数。


推荐阅读