跳转到内容

中文分词与同义词

用途:解决中文搜索“搜不到、搜太宽、排序怪”

方案 特点 适用
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)

中文场景常见的“排序怪”来源:

  1. 分词粒度过粗 → 命中不了;过细 → 噪声文档得分高。
  2. 字段权重不合理:标题、正文、标签应分层加权。
  3. BM25 的长度归一让短字段占优,业务上可能希望“完整描述”优先。
  4. 缺少业务分:热度、时效、运营权重需要 function_score 叠加。

做法:准备一组真实查询 + 期望结果(哪怕 50 条),每次调分词或权重都跑一遍对比,避免凭感觉调参。

误区 修正
用 standard 分词器跑中文 单字切分导致精度差
同义词写进索引分析器 改词表需重建索引
词典不版本化、不入仓 环境不一致,问题难复现
所有字段都开 ngram 索引膨胀数倍,写入变慢
用 match_phrase 当“完全包含” 它是词序 + 邻近语义,不是子串
只看单条 case 调权重 无评估集则改动不可信
  • Elasticsearch 官方文档:Analyzers、Synonym graph token filter、Wildcard field type
  • IK / HanLP / pinyin 插件文档