java - 使用 JAVA API 从 Elastic Search Suggest Search 响应中提取源数据
问题描述
我在 Java 中使用 CompletitionSuggester 来自动完成应用程序,我能够使用 JAVA api 从搜索响应中提取建议文本。在检查原始响应时,我看到建议响应包含 _source 数据(完整文档而不仅仅是 Suggest 字符串)。如何从 Suggest Search 响应中提取源数据?
请在下面找到我用来获取建议文本的代码 -
SearchRequest searchRequest = new SearchRequest("my_entitiy");
CompletionSuggestionBuilder suggestionBuilder = new CompletionSuggestionBuilder("nameSuggest");
suggestionBuilder.size(10).prefix(input).skipDuplicates(true);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.suggest(
new SuggestBuilder().addSuggestion(SUGGESTION_NAME, suggestionBuilder));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = elasticClient.search(searchRequest, RequestOptions.DEFAULT);
Suggest suggest = searchResponse.getSuggest();
Suggest.Suggestion<Suggest.Suggestion.Entry<Suggest.Suggestion.Entry.Option>> suggesition =
suggest.getSuggestion(SUGGESTION_NAME);
List<String> suggestionList = new ArrayList<>();
for (Suggest.Suggestion.Entry<Suggest.Suggestion.Entry.Option> entry : suggesition.getEntries()) {
for(Suggest.Suggestion.Entry.Option option:entry.getOptions()){
suggestionList.add(option.getText().toString());
}
}
在选项中,有几种方法可用于提取乐谱、文本和突出显示。是否可以从选项中获取 _source 数据?我看到了一个toXContent函数,是否可以使用它来获取源数据?
上面的代码片段将建议的字符串保存到一个列表中,我想知道是否可以获得完整的 Doc JSON。
解决方案
您始终可以使用源过滤来过滤要在搜索结果中返回的字段。在弹性中,您可以在上下文中添加includes
,excludes
或两者都添加。_source
例如,您只想获取field1
and field2
,您可以设置_source
如下以及查询:
{
"query":{
// your query goes here
},
"_source":{
"includes":["field1", "field2"]
}
}
使用高级别的客户端也可以实现如下:
String[] includes = {"field1", "field2"};
searchSourceBuilder.fetchSource(new FetchSourceContext(true, includes, null));
推荐阅读
- android - 使用 Frida - 如何获取通过 AIDL 接口调用的函数实例
- android - 如果我不在 android 中使用 launchMode "singleTask" 会发生什么?
- pandas - 计算数据框中列中的组
- typescript - Angular 应用程序的 IntelliJ javascript 调试器与特定配置文件上的 Chrome
- firebase - java.lang.IllegalArgumentException:服务未注册 Flutter 和 Firebase Google SignIn
- r - 使用 paste0() 重命名列时应该使用哪些运算符?
- javascript - 在 JavaScript 中将字符串转换为日期对象默认时间为 12:00
- java - 列表函数 add() 不起作用,但我不知道为什么?
- debugging - GDB共享选项卡下嵌入代码的目的是什么
- arduino - 使用 ESP32 计算电能表中的电能的问题