752 字
约 2 分钟
8
S13-B02 · 索引映射与中文分词
适用读者:中文搜不到、或 mapping 建错后想重建索引的人。
前置:S13-B01。
实测环境:ES 8.15.3(2026-11-05)。
覆盖旧文:564(IK 中文分词器入门,127 点)。
覆盖扩展:E-S13-003(ik_smartvsik_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. 自检
- text 与 keyword 的适用差异?
ik_max_word与ik_smart分别用在哪?- 为什么 mapping 不能改分词器?
- 重建索引的四步?
- 别名的作用是什么?
7. 下一篇
S13-B03 · 查询 DSL 与客户端
分词讲完,下一篇讲查询:term/match/range/bool 的组合,以及为什么大小写会影响结果(实测)。
本篇属于系列《S13 · 搜索与文档存储》。旧文来源:A-564;扩展点 E-S13-003。
S13-B02 · 索引映射与中文分词
https://www.clxhxhhr.top/posts/5361/ 评论
0 条
还没有评论,先写一条吧。