🌺The Begin🌺点点关注,收藏不迷路🌺

一、前言

在日常使用搜索引擎、电商平台、APP搜索框时,你一定见过输入关键词自动联想、拼写纠错、推荐相关词的功能,这就是Search Suggestion(搜索建议/搜索补全)

Elasticsearch 内置了完善的搜索建议模块,无需依赖第三方组件,就能快速实现拼写纠错、前缀补全、短语推荐、相关搜索等核心能力,极大提升用户搜索体验和搜索命中率。

本文将系统讲解 ES Search Suggestion 的核心概念、4大标准类型、实现流程图、索引设计、DSL/Java代码实战,从零到一掌握 ES 搜索建议功能。

二、核心基础:Search Suggestion 核心概念

1. 定义:什么是 Elasticsearch Search Suggestion

Search Suggestion 是 Elasticsearch 提供的搜索建议/自动补全功能,基于索引内的文档数据,对用户输入的关键词进行实时分析、纠错、补全、推荐,返回高相似度的候选关键词,帮助用户快速完成搜索输入。

2. 核心价值

  1. 拼写纠错:用户输错字(如elsticelasticsearch)自动修正
  2. 输入补全:输入前缀(如sprspring boot)自动联想
  3. 提升体验:减少用户输入成本,降低搜索跳出率
  4. 精准匹配:引导用户搜索高频/高相关关键词,提高检索准确率

3. 适用场景

  • 搜索引擎联想搜索
  • 电商商品名称补全
  • 文章/标题智能推荐
  • 日志/数据库关键词快速检索

三、ES 搜索建议完整实现流程图

用户输入关键词

ES接收请求

匹配建议类型:短语/补全/纠错/相关

基于索引分词/词典匹配

计算相似度/权重排序

返回TopN搜索建议

前端展示联想/纠错/推荐词

四、环境准备

  1. Elasticsearch 7.x/8.x(本文以7.17为例)
  2. Kibana(执行DSL语句)
  3. 测试索引:search_suggest(存储文章/商品标题数据)
  4. 开发依赖:Java 客户端 elasticsearch-rest-high-level-client

创建测试索引(支持所有建议类型)

PUT /search_suggest
{
  "mappings": {
    "properties": {
      "title": {  // 标题:用于搜索建议核心字段
        "type": "text",
        "analyzer": "ik_max_word",
        "fields": {
          "completion": {  // 专门用于completion建议的子字段
            "type": "completion"
          },
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "content": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

# 插入测试数据
POST /search_suggest/_bulk
{"index":{"_id":1}}
{"title":"Elasticsearch实战","content":"ES搜索建议教程"}
{"index":{"_id":2}}
{"title":"Elasticsearch分页","content":"ES深度分页详解"}
{"index":{"_id":3}}
{"title":"Spring Boot教程","content":"SpringBoot整合ES"}
{"index":{"_id":4}}
{"title":"Spring Cloud微服务","content":"微服务实战"}

五、ES 搜索建议 4 大核心类型(最全详解)

Elasticsearch 提供4种标准搜索建议类型,覆盖拼写纠错、前缀补全、短语推荐、相关搜索全场景,分别对应不同业务需求。

类型1:Term Suggestion 单词级纠错建议

1. 定义

单词级别的拼写纠错建议,针对用户输入的单个单词进行错误修正,返回最相似的正确单词,适合简单关键词纠错。

2. 核心特性
  • 基于单个词条纠错
  • 支持编辑距离(错别字相似度)配置
  • 适合短关键词、英文检索纠错
3. DSL 实战代码
POST /search_suggest/_search
{
  "suggest": {
    "term_suggest": {  // 建议名称自定义
      "text": "elstic",  // 用户输错的关键词
      "term": {
        "field": "title",  // 纠错字段
        "size": 3  // 返回Top3建议
      }
    }
  }
}
4. 返回结果

自动纠错:elsticelasticsearch


类型2:Phrase Suggestion 短语级纠错建议

1. 定义

短语/句子级别的拼写纠错,针对多个单词组成的短语进行整体纠错,比 Term 更贴合实际搜索场景。

2. 核心特性
  • 支持整句/短语纠错
  • 考虑词语之间的关联性
  • 适合中文短语、英文句子纠错
3. DSL 实战代码
POST /search_suggest/_search
{
  "suggest": {
    "phrase_suggest": {
      "text": "elstic pag",  // 错误短语
      "phrase": {
        "field": "title",
        "size": 2,
        "max_errors": 2  // 允许最大错误数
      }
    }
  }
}
4. 返回结果

自动纠错:elstic pagelasticsearch page


类型3:Completion Suggestion 前缀补全建议(性能最高)

1. 定义

前缀实时补全/联想搜索,用户输入关键词前缀,ES 毫秒级返回完整候选词,是最常用、性能最高的搜索建议类型(百度/谷歌联想核心实现)。

2. 核心特性
  • 基于前缀匹配
  • 性能极高(毫秒级响应)
  • 必须使用 completion 专用字段类型
  • 支持大小写忽略、排序、权重控制
3. DSL 实战代码
POST /search_suggest/_search
{
  "suggest": {
    "completion_suggest": {
      "prefix": "spr",  // 输入前缀
      "completion": {
        "field": "title.completion",  // completion专用字段
        "size": 3
      }
    }
  }
}
4. 返回结果

前缀补全:sprspring bootspring cloud


类型4:Context Suggester 上下文感知建议(高级)

1. 定义

带上下文/分类的个性化建议,基于用户身份、场景、分类、地域等维度,返回差异化推荐结果(高级场景使用)。

2. 核心特性
  • 支持分类/用户/场景过滤
  • 实现千人千面的搜索建议
  • 适合电商、多租户、多场景业务
3. 适用场景
  • 电商:按商品分类推荐
  • 多系统:按用户角色推荐
  • 地域化:按城市推荐关键词

六、4 大搜索建议类型全方位对比

建议类型核心功能性能使用难度适用场景
Term Suggestion单词纠错单个关键词拼写纠错
Phrase Suggestion短语纠错句子/中文短语纠错
Completion Suggestion前缀补全/联想极高搜索框实时联想、前缀补全(最常用)
Context Suggestion上下文个性化推荐分类/用户/场景化精准推荐

七、Java 代码实战:实现 Completion 前缀补全(生产常用)

最常用的 Completion 建议 Java 客户端代码,可直接复制使用:

/**
 * Completion 前缀补全搜索建议
 * @param prefix 用户输入前缀
 * @return 建议列表
 */
public List<String> completionSuggest(String prefix) throws IOException {
    SearchRequest request = new SearchRequest("search_suggest");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    // 构建补全建议
    CompletionSuggestionBuilder suggestion = SuggestBuilders.completionSuggestion("title.completion")
            .prefix(prefix)  // 前缀
            .size(3);  // 返回3条建议

    // 添加到查询
    sourceBuilder.suggest(new SuggestBuilder().addSuggestion("completion_suggest", suggestion));
    request.source(sourceBuilder);

    // 执行查询
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    List<String> result = new ArrayList<>();

    // 解析建议结果
    Suggest.Suggestion<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> suggest =
            response.getSuggest().getSuggestion("completion_suggest");

    if (suggest != null && !suggest.getEntries().isEmpty()) {
        for (Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option> entry : suggest.getEntries()) {
            for (Suggest.Suggestion.Entry.Option option : entry.getOptions()) {
                result.add(option.getText().toString());
            }
        }
    }
    return result;
}

八、生产环境最佳实践

  1. 优先使用 Completion Suggestion:性能最高,适合绝大多数联想搜索场景
  2. 纠错使用 Phrase 而非 Term:短语纠错更贴合真实用户输入
  3. 单独设计建议索引:只存储标题/关键词,减少数据量,提升速度
  4. 限制建议返回数量:建议返回 3~5 条,兼顾体验与性能
  5. 搭配 IK 分词器:中文场景必须使用中文分词,提升建议准确率
  6. 避免高频刷新建议索引:降低 ES 写入压力

九、总结

Elasticsearch Search Suggestion 是实现智能搜索框的核心能力,4 种类型覆盖全业务场景:

  1. 单词输错纠错 → Term Suggestion
  2. 短语/整句纠错 → Phrase Suggestion
  3. 搜索框前缀联想 → Completion Suggestion(生产首选)
  4. 分类/个性化推荐 → Context Suggestion

本文包含核心概念、流程图、索引设计、DSL 语句、Java 实战代码,完全满足生产环境开发需求,可直接落地到项目中。

总结

  1. Search Suggestion = ES 内置搜索联想+拼写纠错功能
  2. 4 大类型:Term、Phrase、Completion、Context
  3. 生产环境优先用 Completion 实现前缀补全,性能最优
  4. 搭配分词器+合理索引设计,可实现毫秒级搜索建议体验

在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐