中文分词与同义词
用途:解决中文搜索“搜不到、搜太宽、排序怪”
分词器选择
「分词器选择」小节链接| 方案 | 特点 | 适用 |
|---|---|---|
ik_max_word |
最细粒度切分,召回高 | 索引用(提高召回) |
ik_smart |
粗粒度智能切分 | 查询用(提高精度),或整体资源受限时 |
ngram / edge_ngram |
字符级组合,支持前缀联想与子串 | 补全、模糊匹配、专有名词 |
| HanLP / 分词服务类插件 | 词性、命名实体、更准的中文切分 | 专业语料、领域词典要求高 |
pinyin |
拼音与首字母检索 | 人名、地名、型号 |
standard |
中文按单字切 | 兜底可用但噪声大,不建议作为主方案 |
常见组合:索引 ik_max_word + 查询 ik_smart,兼顾召回与精度。
词典治理
「词典治理」小节链接- 停用词与同义词文件需版本化并纳入部署(改文件后需重启或 reload analyzer)。
- 同义词放查询侧(
synonym_graph+search_analyzer),避免改词表就要重建索引。 - 领域专有词(产品名、缩写、黑话)必须进自定义词典,否则切词结果不可用。
- 多义词需要上下文或字段级策略,不要指望一个词表解决。
子串与模糊需求
「子串与模糊需求」小节链接| 需求 | 方案 |
|---|---|
| 前缀联想(输入即提示) | edge_ngram 或 completion suggester |
| 任意子串匹配 | ngram(索引膨胀)或 wildcard 字段类型(新版本对通配做了优化) |
| 错别字容错 | fuzzy(编辑距离)+ 拼音辅助 |
| 语义相似 | dense_vector + kNN,与关键词检索混合(hybrid) |
排序与相关性
「排序与相关性」小节链接中文场景常见的“排序怪”来源:
- 分词粒度过粗 → 命中不了;过细 → 噪声文档得分高。
- 字段权重不合理:标题、正文、标签应分层加权。
- BM25 的长度归一让短字段占优,业务上可能希望“完整描述”优先。
- 缺少业务分:热度、时效、运营权重需要
function_score叠加。
做法:准备一组真实查询 + 期望结果(哪怕 50 条),每次调分词或权重都跑一遍对比,避免凭感觉调参。
常见误区
「常见误区」小节链接| 误区 | 修正 |
|---|---|
用 standard 分词器跑中文 |
单字切分导致精度差 |
| 同义词写进索引分析器 | 改词表需重建索引 |
| 词典不版本化、不入仓 | 环境不一致,问题难复现 |
| 所有字段都开 ngram | 索引膨胀数倍,写入变慢 |
用 match_phrase 当“完全包含” |
它是词序 + 邻近语义,不是子串 |
| 只看单条 case 调权重 | 无评估集则改动不可信 |
延伸阅读
「延伸阅读」小节链接- Elasticsearch 官方文档:Analyzers、Synonym graph token filter、Wildcard field type
- IK / HanLP / pinyin 插件文档