752 字
约 2 分钟
8
S13-B02 · 索引映射与中文分词

适用读者:中文搜不到、或 mapping 建错后想重建索引的人。
前置:S13-B01。
实测环境:ES 8.15.3(2026-11-05)。
覆盖旧文:564(IK 中文分词器入门,127 点)。
覆盖扩展:E-S13-003(ik_smart vs ik_max_word)。
上一篇:S13-B01 · 倒排索引与基本概念
下一篇:S13-B03 · 查询 DSL 与客户端。


1. 一句话结论

中文搜索失败,九成是因为"用 standard 分词器切中文"——它会把一整句当成一个 token。要用中文专用分词器(如 ik),并且 mapping 建好后不能再改分词器(只能重建索引)。


2. mapping 的三个关键决策

决策 选项 影响
字段类型 text / keyword text 分词、keyword 精确
分词器 standard / ik_max_word / ik_smart 决定能否搜到
是否索引 index: false 不索引则不可搜(只可存)

"text 还是 keyword"的判断:

要"模糊搜索/相关性排序" → text(分词)
要"精确匹配/聚合/排序" → keyword
既要又要 → 用 multifields(title + title.keyword)

3. 中文分词:ik_max_word vs ik_smart(E-S13-003)

分词器 粒度 适合
ik_max_word 最细(穷尽所有可能) 索引阶段(提高召回)
ik_smart 最粗(一次切分) 查询阶段(减少噪声)

标准实践:索引用 ik_max_word,查询用 ik_smart。

"mappings": {"properties": {
  "title": {"type": "text",
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_smart"}
}}

注意:ik 是第三方插件,需要安装到 ES 的 plugins 目录并重启。


4. mapping 不可改:只能重建

变更 是否可改
加新字段 ✅ PUT _mapping
改字段类型 ❌
改分词器 ❌(需 reindex)

标准重建流程:

① 建新索引(新 mapping)
② _reindex 从旧索引导数据
③ 别名切换(业务无感)
④ 删旧索引

判据:"用别名访问索引吗?" 用 → 可无感切换;直接写死索引名 → 切换要停服。


5. 五个误区

误区 真相
"standard 能切中文" 会把整句当一个 token
"mapping 可以随时改" 类型/分词器不可改
"ik_max_word 查询也用它" 查询用 ik_smart 更准
"keyword 也能模糊搜" 只能精确匹配
"重建索引要停服" 用别名 + reindex 可不停

6. 自检

  1. text 与 keyword 的适用差异?
  2. ik_max_word 与 ik_smart 分别用在哪?
  3. 为什么 mapping 不能改分词器?
  4. 重建索引的四步?
  5. 别名的作用是什么?

7. 下一篇

S13-B03 · 查询 DSL 与客户端

分词讲完,下一篇讲查询:term/match/range/bool 的组合,以及为什么大小写会影响结果(实测)。


本篇属于系列《S13 · 搜索与文档存储》。旧文来源:A-564;扩展点 E-S13-003。

S13-B02 · 索引映射与中文分词
https://www.clxhxhhr.top/posts/5361/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。