Elasticsearch 搜索建议(Suggester)详解

在现代搜索应用中,搜索建议(Suggester) 是提升用户体验的关键功能。它能在用户输入过程中实时提供补全、纠错、联想等建议,显著降低拼写错误、提高搜索命中率。

Elasticsearch 提供了强大的 Suggester API,支持多种类型的搜索建议。本文将全面详解其原理、类型、配置与最佳实践。


一、什么是 Suggester?

Suggester 是 Elasticsearch 提供的一组 API,用于根据用户输入前缀或模糊拼写,返回可能的搜索建议。它不返回文档,而是返回建议文本(suggestion text)。

✅ 典型应用场景:

  • 搜索框自动补全(“iph” → “iPhone”)
  • 拼写纠错(“elasticsearch” → “Elasticsearch”)
  • 相关搜索(“手机” → “手机壳”、“手机支架”)

二、Suggester 的基本结构

GET /products/_search
{
  "suggest": {
    "NAME": {                    // 建议名称(自定义)
      "TEXT": "iph",             // 用户输入文本
      "completion": {            // 建议类型
        "field": "title_suggest" // 包含建议数据的字段
      }
    }
  }
}
  • suggest 位于查询顶层;
  • 可同时返回多种建议;
  • 不影响普通搜索结果。

三、四种核心 Suggester 类型

1. completion Suggester —— 自动补全(最常用)

适用于 前缀匹配,如搜索框补全。

Step 1:定义字段映射
PUT /products
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "title_suggest": {
        "type": "completion",
        "analyzer": "simple",
        "preserve_separators": true,
        "preserve_position_increments": true,
        "max_input_length": 50
      }
    }
  }
}

completion 字段使用专用数据结构(FST),查询极快(毫秒级)。

Step 2:写入文档
PUT /products/_doc/1
{
  "title": "iPhone 15 Pro",
  "title_suggest": {
    "input": ["iPhone", "iPhone 15", "iPhone 15 Pro", "苹果手机"],
    "weight": 30
  }
}
  • input:建议词列表;
  • weight:权重,影响排序。
Step 3:查询建议
POST /products/_search
{
  "suggest": {
    "product_suggest": {
      "prefix": "iph",
      "completion": {
        "field": "title_suggest",
        "skip_duplicates": true
      }
    }
  }
}
返回结果:
"suggest": {
  "product_suggest": [
    {
      "text": "iph",
      "offset": 0,
      "length": 3,
      "options": [
        { "text": "iPhone 15 Pro", "score": 30, "_source": {} }
      ]
    }
  ]
}

✅ 支持 fuzzy 模糊匹配:

"fuzzy": {
  "fuzziness": 1,
  "transpositions": true
}

2. phrase Suggester —— 短语纠错

用于纠正搜索短语中的拼写错误,基于语言模型。

示例:
"suggest": {
  "text": "carmera lucne",
  "phrase": {
    "field": "title",
    "max_errors": 2,
    "confidence": 1.0,
    "direct_generator": [
      {
        "field": "title.trigram",
        "suggest_mode": "always",
        "min_term_freq": 1
      }
    ]
  }
}

返回纠正后的短语:“camera lunch” → “camera lens”

⚠️ 需要对字段使用 ngram 分词器预处理。


3. term Suggester —— 单词纠错

对单个词进行拼写纠错,适用于简单场景。

"suggest": {
  "text": "elaticsearch",
  "term": {
    "field": "title",
    "sort": "frequency",
    "suggest_mode": "missing"
  }
}
  • suggest_mode:
    • missing: 仅当词不在索引中时建议
    • popular: 建议更常见的词
    • always: 总是建议

返回:“elasticsearch”


4. context Suggester —— 上下文感知补全

completion 基础上,支持基于上下文过滤建议。

示例:按类目补全
"category_suggest": {
  "type": "completion",
  "contexts": {
    "category": {
      "type": "category"
    }
  }
}

写入:

"category_suggest": {
  "input": ["手机", "笔记本"],
  "contexts": {
    "category": ["electronics"]
  }
}

查询时指定上下文:

"category": {
  "category": "electronics"
}

✅ 实现“电子产品类搜索建议”、“书籍类搜索建议”等多租户场景。


四、Suggester 性能优化建议 ✅

场景建议
completion 字段使用 input 预生成常见组合
大文档集避免在大索引上频繁更新 completion 字段
模糊匹配限制 fuzziness: 1,避免性能下降
权重控制使用 weight 提升热门建议排序
内存优化completion 字段占用堆外内存,监控 segments
缓存应用层缓存高频前缀建议(如“a”, “ap”)

五、完整示例:电商搜索建议系统

PUT /products
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "suggest": {
        "type": "completion",
        "analyzer": "simple",
        "contexts": {
          "category": { "type": "category" }
        }
      }
    }
  }
}

# 写入商品
POST /products/_doc
{
  "title": "iPhone 15 Pro 手机",
  "suggest": {
    "input": ["iPhone", "iPhone 15", "iPhone 15 Pro", "苹果手机", "手机"],
    "weight": 100,
    "contexts": {
      "category": ["electronics", "phone"]
    }
  }
}

# 查询建议
POST /products/_search
{
  "suggest": {
    "title_suggest": {
      "prefix": "iph",
      "completion": {
        "field": "suggest",
        "fuzzy": { "fuzziness": 1 },
        "contexts": {
          "category": "electronics"
        }
      }
    }
  }
}

六、Suggester 与其他功能对比

功能适用场景延迟
completion前缀补全⚡ < 10ms
term单词纠错🕐 10~50ms
phrase短语纠错🕐 50~200ms
ngram + match简单补全🕐 依赖数据量
fuzzy + term拼写纠错🕐 中等

✅ 推荐:completion 用于补全,term/phrase 用于纠错。


七、扩展建议

场景建议方案
拼音搜索使用 pinyin analyzer + completion
多语言支持为不同语言创建独立 suggest 字段
热门搜索推荐结合 aggs 统计高频搜索词,写入 completion
个性化建议基于用户历史行为生成上下文建议
冷启动问题初始填充运营配置的热门词

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值