5月29日 00:51

Elasticsearch 的 suggest 功能如何实现自动补全?

ES 提供四种 suggester:Completion Suggester 基于内存 FST(有限状态转换器)做前缀匹配,延迟极低,适合自动补全;Term Suggester 基于编辑距离做拼写纠错;Phrase Suggester 在 Term 基础上加 n-gram 语言模型优化整句建议;Context Suggester 为 Completion 增加分类/地理上下文过滤。自动补全场景用 Completion Suggester:索引时将建议词存入 completion 类型字段构建 FST,查询时用 prefix 参数匹配,毫秒级返回。

追问

Completion Suggester 为什么快?

它将建议词构建为 FST 结构常驻内存,前缀匹配是 O(k) 复杂度(k 为前缀长度),不涉及倒排索引扫描和评分计算,所以延迟在毫秒级。

Completion 和 search_as_you_type 有什么区别?

Completion 是独立建议通道,返回建议词而非文档;search_as_you_type 是特殊 text 子类型,本质还是全文检索返回文档。Completion 更适合输入框补全,search_as_you_type 更适合边输边搜文档内容。

拼写纠错用哪个?

Term Suggester。它基于倒排索引中的词项做编辑距离计算,返回相似词建议。需要指定 suggest_mode:missing(仅缺词建议)、popular(热门词优先)、always(始终建议)。

如何给建议词加权重?

在 completion 字段中设置 weight 属性,权重高的建议优先返回。常用于热门搜索词提权:"suggest": {"input": "laptop", "weight": 100}。

FST 内存开销大吗?

FST 是高度压缩的有向无环图,百万级建议词通常只占几十 MB。但建议词总量达亿级时需评估内存,可用 context 过滤减少单次匹配范围。

写段代码

json
PUT /search-suggest { "mappings": { "properties": { "title": { "type": "keyword" }, "suggest": { "type": "completion", "analyzer": "standard" } } } } GET /search-suggest/_search { "suggest": { "auto": { "prefix": "elas", "completion": { "field": "suggest", "size": 5 } } } }
标签:ElasticSearch