Appearance
分词器、Tokenizer 和 IK 到底怎么选
做 ES 检索时,分词方案选错,后面再怎么调查询 DSL 都很难补回来。因为召回范围、排序质量和误匹配率,很多时候在建索引那一刻就基本定型了。
先说结论
- 先决定“要不要分词”,再决定“怎么分词”
- 中文全文检索常用 IK,但 IK 不是所有字段的默认答案
- 索引分词器和搜索分词器可以不同,目的是兼顾召回与精度
先把概念分清
Tokenizer 是什么
Tokenizer 负责把一段文本切成 token,是分析链里的第一步。它更像“怎么切”。
Analyzer 是什么
Analyzer = tokenizer + token filter + char filter。也就是说,Analyzer 不只负责切词,还负责大小写归一、停用词处理、同义词扩展等后续加工。
IK 是什么
IK 是中文分词插件,常用模式有 ik_max_word 和 ik_smart。前者更偏召回,后者更偏收敛。
实战里怎么选
精确匹配字段不要乱分词
订单号、手机号、状态码、标签编码这类字段,通常应该用 keyword,而不是 text + 分词器。否则聚合和精确过滤都会变得不稳定。
中文全文检索优先从 IK 起步
搜索标题、商品名、文章正文时,可以优先用 IK 做基础方案。常见做法是索引用 ik_max_word 提高召回,查询用 ik_smart 降低噪音。
专业词汇多时要补词典
医疗、金融、商品品牌、技术词汇这类领域语料,如果不维护自定义词典,召回效果通常会比较差。
一个字段可以做多字段设计
例如同一个标题字段,既保留 text 做全文检索,也保留 keyword 子字段做排序、聚合和精确过滤,这是很常见也很实用的设计。
常见误区
所有字符串字段都上 IK
这样会让过滤、排序、聚合场景一起变乱,映射设计也会变得臃肿。
只看能不能搜到,不看误召回
召回太宽时,前几页结果会很差,用户体验不一定比“少召回一点”更好。
上线后才临时改分词器
分词策略变化往往要重建索引,代价不小。核心字段最好在设计期就想清楚。
一句话总结
分词选型的关键不是记住 IK,而是先区分精确匹配和全文检索,再用合适的 tokenizer 和 analyzer 去平衡召回与精度。