在现代搜索应用中,搜索建议(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 |
| 个性化建议 | 基于用户历史行为生成上下文建议 |
| 冷启动问题 | 初始填充运营配置的热门词 |
2224

被折叠的 条评论
为什么被折叠?



