基于Elasticsearch 7.4 Java API实现Context Suggester查询求助
Elasticsearch 7.4 Java客户端实现Context Suggester示例
需求说明
基于Elasticsearch 7.4的Java客户端API,实现对应下述OpenSearch查询语句的Context Suggester功能,获取匹配指定前缀与分类上下文的自动补全结果。
目标查询语句(中文注释版)
POST ***_autosuggest/_search?pretty { "suggest": { "place_suggestion": { "prefix": "tim", // 前缀匹配文本 "completion": { "field": "suggest", // 目标completion类型字段 "size": 10, // 返回结果最大数量 "contexts": { "genre": [ "**-faculty", "**-companies" ] // 过滤指定分类上下文 } } } } }
对应索引映射(中文注释版)
{ "***_autosuggest": { "aliases": {}, "mappings": { "properties": { "dictionary": { "type": "keyword", "index": false, "store": true }, "suggest": { "type": "completion", "analyzer": "suggestionAnalyzer", // 自定义建议分析器 "preserve_separators": true, "preserve_position_increments": false, "max_input_length": 50, "contexts": [ // 定义分类类型上下文 { "name": "genre", "type": "CATEGORY" } ] }, "suggestion": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "title": { "type": "keyword", "index": false, "store": true } } }, "settings": { "index": { "number_of_shards": "1", "provided_name": "***_autosuggest", "creation_date": "1679448840300", "analysis": { "filter": { "en_stop": { // 英文停用词过滤器 "type": "stop", "stopwords": [ "_english_" ] } }, "analyzer": { "suggestionAnalyzer": { // 自定义分析器:标准分词+小写转换+停用词过滤 "filter": [ "lowercase", "en_stop" ], "type": "custom", "tokenizer": "standard" } } }, "number_of_replicas": "0", "uuid": "t97z4ZYdRB2KclQV28fTTQ", "version": { "created": "136277827" } } } } }
Java客户端实现代码
以下是Elasticsearch 7.4 High Level REST Client的对应实现示例:
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.suggest.Suggest; import org.elasticsearch.search.suggest.SuggestBuilder; import org.elasticsearch.search.suggest.SuggestBuilders; import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder; import org.elasticsearch.search.suggest.completion.context.CategoryQueryContext; import java.io.IOException; public class ContextSuggesterDemo { public void runContextSuggestQuery(RestHighLevelClient client) throws IOException { // 构建Completion建议查询,指定目标字段、前缀、返回数量 CompletionSuggestionBuilder completionBuilder = SuggestBuilders.completionSuggestion("suggest") .prefix("tim") .size(10) // 添加多个分类上下文过滤条件 .addContext("genre", CategoryQueryContext.builder().setCategory("**-faculty").build(), CategoryQueryContext.builder().setCategory("**-companies").build()); // 将建议器绑定到指定名称的suggest节点 SuggestBuilder suggestBuilder = new SuggestBuilder(); suggestBuilder.addSuggestion("place_suggestion", completionBuilder); // 构建搜索请求,指定目标索引 SearchRequest searchRequest = new SearchRequest("***_autosuggest"); searchRequest.source().suggest(suggestBuilder); // 执行请求并处理响应 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); Suggest suggestResult = response.getSuggest(); Suggest.Suggestion<?> suggestion = suggestResult.getSuggestion("place_suggestion"); // 遍历输出匹配结果 for (Suggest.Suggestion.Entry<?> entry : suggestion.getEntries()) { for (Suggest.Suggestion.Entry.Option option : entry) { System.out.println("匹配建议文本:" + option.getText().toString()); // 如需获取原始文档字段,可调用option.getSourceAsMap() } } } }
关键代码说明
- CompletionSuggestionBuilder:核心构建类,负责定义自动补全查询的字段、前缀、返回数量,以及上下文过滤规则。
- CategoryQueryContext:针对
genre分类上下文,添加多个允许的分类值,实现精准过滤。 - SuggestBuilder:将定义好的建议器挂载到指定的suggest节点名称下,与DSL结构一一对应。
- SearchRequest:指定目标索引,并将suggest构建器注入请求源,完成查询的最终组装。
内容的提问来源于stack exchange,提问作者MangeshShinde
相关产品推荐
相关产品推荐

