Elasticsearch Completion Suggester 是什么?和普通搜索自动补全有什么区别?
简化版
Completion Suggester 是 ES 面向自动补全的建议能力,底层使用适合前缀匹配的结构,查询延迟很低。它适合输入框联想,但不等同于完整全文搜索或复杂排序推荐。
详细版
搜索框自动补全要求用户每输入一个字符就快速返回候选词。普通 match 查询也能做前缀类需求,但在低延迟和建议词模型上不如 Completion Suggester 专门。
- 需要在 mapping 中定义
completion类型字段。 - 写入时提供 suggest 输入,可以有权重。
- 查询时用 suggest API 根据 prefix 返回候选。
- 适合商品名、城市名、关键词联想。
- 复杂权限过滤、多维排序和实时个性化推荐可能需要额外设计。
完整版教学
一、为什么自动补全和普通搜索不是一回事
普通搜索通常发生在用户提交完整关键词后,可以花几十到几百毫秒做相关性排序;自动补全发生在用户输入过程中,每个字符都可能触发请求。它更看重前缀匹配速度、稳定延迟和建议词质量。Completion Suggester 就是为这种“边输边提示”的模式准备的能力。它不是让搜索结果页更强,而是让输入框更快给候选。
PUT products
{
"mappings": {
"properties": {
"suggest": { "type": "completion" }
}
}
}
记忆钩子:Completion Suggester 解决“输入框提示”,普通搜索解决“提交后检索”。
二、completion 字段怎么写入
使用 Completion Suggester 时,通常会单独写一个 suggest 字段,里面放可补全的输入词和权重。比如商品“iPhone 17 Pro”可以写入 iphone、iphone 17、苹果手机 等输入变体。权重可以让热门词排得更靠前。这个模型说明,自动补全不是完全靠原始标题字段自然生成,常常需要业务提前准备候选词。
POST products/_doc/1
{
"name": "iPhone 17 Pro",
"suggest": {
"input": ["iphone", "iphone 17", "苹果手机"],
"weight": 100
}
}
三、查询时为什么很快
Completion Suggester 针对前缀建议做了专门的数据结构,常被理解为基于 FST 这类紧凑自动机结构来快速匹配前缀。用户输入 iph 时,不需要像普通全文查询那样计算大量文档相关性,而是沿着前缀路径找到候选建议。它把一部分成本放在写入和内存结构维护上,换取查询阶段的低延迟。
POST products/_search
{
"suggest": {
"product-suggest": {
"prefix": "iph",
"completion": { "field": "suggest", "size": 5 }
}
}
}
四、带数字理解输入框延迟压力
假设一个搜索框每输入 1 个字符触发一次请求,用户平均输入 6 个字符,峰值每秒 2000 个用户在输入,就可能产生每秒 12000 次 suggest 请求。这个场景下,哪怕普通搜索单次 80ms,也会给集群造成压力;如果 suggest 能稳定在几毫秒到十几毫秒,用户体验和资源成本都会更好。自动补全是典型的小请求高并发场景。
2000 users/s × 6 chars = 12000 suggest requests/s
输入框体验要求比普通搜索结果页更苛刻
五、它的限制:不是完整推荐系统
Completion Suggester 适合按前缀召回建议词,但复杂业务常常需要权限过滤、库存过滤、个性化、拼音、纠错、多语言和运营干预。如果把这些都塞进 completion 字段,会让模型变复杂。常见做法是用 suggester 做第一层候选,再结合业务缓存、热门词服务或搜索后端做二次处理。面试回答不要把它吹成万能推荐系统。
| 需求 | Completion Suggester 是否适合 |
|---|---|
| 前缀联想 | 适合 |
| 热门词权重 | 适合 |
| 个性化推荐 | 需要额外系统 |
| 复杂过滤 | 要谨慎设计 |
六、和 edge ngram 的取舍
自动补全也可以用 edge ngram 分词,把词切成前缀 token 后用普通查询检索。edge ngram 更灵活,可以结合普通 query/filter,但索引体积可能更大,相关性和性能要调。Completion Suggester 查询快、模型专用,但过滤和复杂排序不如普通查询灵活。选择时要看你需要的是纯建议词,还是带复杂条件的搜索结果。
Completion:低延迟建议词,专用能力
edge ngram:更像普通搜索方案,灵活但索引膨胀
七、常见误区与追问
- 误区:Completion Suggester 等于全文搜索。 它主要面向前缀建议,不是完整搜索结果排序。
- 误区:自动补全不用业务建模。 输入变体、权重、热门词和过滤规则都需要业务设计。
- 误区:它一定比所有方案都好。 如果需要复杂过滤和排序,edge ngram 或专门搜索服务可能更合适。
- 追问:为什么它适合低延迟? 它针对前缀匹配使用专门结构,减少普通搜索的相关性计算成本。
- 追问:热门词怎么排前面? 写入 suggest 时设置 weight,并结合业务热度定期更新。
八、加强记忆
Completion Suggester 记成“输入框联想专用通道”。它通过 completion 字段和前缀建议结构换取低延迟,适合商品名、城市名、关键词提示。回答时同时讲出 edge ngram 方案和复杂过滤限制,才不会显得只会背 API。