java - SuggestRequestBuilder.java / org.elasticsearch.action.suggest 缺失
问题描述
我正在尝试将 Elasticsearch spring boot 项目从 1.5.7 升级到 2.2.1。我在项目中的唯一依赖项(与弹性搜索相关)是 spring-data-Elasticsearch。但是由于缺少/不推荐使用的类很少,因此SuggestRequestBuilder
我的构建失败了。我也查了谷歌也找不到任何合适的替代品。谁能帮我找到使用这些的替代方法suggestRequestBuilder
,suggestionResponse
.
解决方案
使用 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
),您可以灵活调整查询的参数。
推荐阅读
- android - Cordova 不部署到我的 android 模拟器
- javascript - 以编程方式从另一个 javascript 函数更改一个函数中的 javascript 值
- python - Python for 循环优化
- c# - .NET Core 3.1 登录 WPF 应用程序
- r - +r +ggplot +jpeg +背景 +透明
- tensorflow - 使用 float16 的 TensorFlow 2.2 仅在 CPU 上执行
- c# - C# 控制台:您能否在与项目相同的文件夹中找到 .wav 文件
- karate - 在 KarateDSL 中,如何从服务响应(一种键值响应)中获取键?
- r - 如何计算R中距离矩阵的加权平均值和标准差
- python - 如何在烧瓶管理中隐藏“列表”视图?