You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:54:58