【ElasticSearch】IK分词器安装,配置修改,支持新增词组,中文常用mapping使用案例
Elasticsearch IK 分词器日常操作全流程(Docker 环境)
IK 分词器是最常用的中文分词插件,支持 智能分词 与 细粒度分词,
安装配置好后,可以支持,加入新词,“”
一、IK 分词器安装与验证
1. 版本准备
- 确保 ES 与 IK 插件版本一致,否则会启动报错。
- 例如:ES
8.15.0
对应下载analysis-ik-8.15.0.zip
。
IK 插件下载地址(Infinilabs 官方): https://release.infinilabs.com/analysis-ik/stable/
# 示例:下载 ES 8.15.0 对应版本
wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.15.0.zip
常见坑:
- 版本不匹配:ES 会直接拒绝加载插件。
- 下载失败:国内环境可能需要代理或提前下好再
docker cp
。
2. 安装步骤
# 1. 把插件包复制进容器
docker cp elasticsearch-analysis-ik-8.15.0.zip es01:/tmp/# 2. 进入容器
docker exec -it es01 /bin/bash# 3. 安装插件
./bin/elasticsearch-plugin install file:///tmp/elasticsearch-analysis-ik-8.15.0.zip# 4. 退出并重启 ES
exit
docker restart es01
3. 验证安装
# 查看已安装插件
docker exec -it es01 /bin/bash -c "./bin/elasticsearch-plugin list"
输出中包含 analysis-ik
即安装成功。
进一步测试:
curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{"analyzer": "ik_max_word","text": "豆包是一个智能编程助手"
}'
如果能正确切分 "豆包" "智能" "编程" "助手"
,说明分词器可用。
二、自定义词典配置(最常见需求)
1. 配置文件位置
容器内路径:
/usr/share/elasticsearch/config/analysis-ik/
包含:
IKAnalyzer.cfg.xml
—— 主配置文件stopword.dic
—— 停用词main.dic
—— 系统内置词库- (可新增)
my_dict.dic
—— 自定义扩展词典
2. 宿主机管理配置(推荐做法)
# 复制默认配置到宿主机
docker cp es01:/usr/share/elasticsearch/config/analysis-ik ./analysis-ik-backup
修改 IKAnalyzer.cfg.xml
,在 <properties>
节点下增加:
<!-- 自定义扩展词典 -->
<entry key="ext_dict">my_dict.dic</entry>
<!-- 自定义停用词(可选) -->
<entry key="ext_stopwords">my_stopword.dic</entry>
3. 创建自定义词典
# my_dict.dic
豆包
编程助手
自定义词汇
# my_stopword.dic
的
了
呢
啊
4. 将配置同步回容器并重启
docker cp ./analysis-ik-backup es01:/usr/share/elasticsearch/config/
docker restart es01
三、配置持久化方案
直接修改容器内配置会丢失(删除容器后消失)。建议用挂载。
方案 1:手动同步(临时修改)
- 修改完宿主机配置 →
docker cp
覆盖到容器 → 重启 ES
方案 2:挂载配置目录(推荐)
在 docker-compose.yml
里新增:
volumes:- ./ik-config:/usr/share/elasticsearch/config/analysis-ik
这样修改宿主机 ik-config
下的文件会实时生效(需重启 ES)。
四、常见问题与排查
问题 | 原因 | 解决办法 |
---|---|---|
分词不生效 | 词典没加载 | 确认已在 IKAnalyzer.cfg.xml 注册,并且重启了容器 |
编码问题 | Windows 保存为 GBK / BOM | 确认词典为 UTF-8 无 BOM |
词典路径错误 | 配置中写了绝对路径 | 正确写法:只写文件名,默认相对路径就是 config/analysis-ik/ |
插件无法安装 | 版本不一致 | 确认下载的 IK 与 ES 主版本号完全一致 |
五、日常操作总结
-
下载对应版本的 IK 插件
wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-<版本号>.zip
-
安装到容器并重启
docker cp zip包 es01:/tmp/ docker exec -it es01 /bin/bash -c "./bin/elasticsearch-plugin install file:///tmp/xxx.zip" docker restart es01
-
配置自定义词典
- 修改
IKAnalyzer.cfg.xml
- 添加
<entry key="ext_dict">my_dict.dic</entry>
- 修改
-
添加自定义词典
my_dict.dic
,保存为 UTF-8 -
将配置同步回容器并重启 ES
-
用
_analyze
API 验证分词效果
Elasticsearch IK 分词器在项目中的常见用法
IK 分词器支持两种模式:
- ik_max_word:细粒度分词,尽可能多地切分词汇 → 适合搜索召回
- ik_smart:智能分词,较粗粒度 → 适合精确匹配或提高搜索速度
在创建索引时,需要在 mapping(映射) 中声明分词器,否则默认使用 standard
英文分词器。
一、创建索引并指定 IK 分词器
示例 1:中文搜索常用 mapping
PUT /article
{"settings": {"analysis": {"analyzer": {"ik_max": {"type": "custom","tokenizer": "ik_max_word"},"ik_smart": {"type": "custom","tokenizer": "ik_smart"}}}},"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word", # 索引时分词"search_analyzer": "ik_smart" # 搜索时分词(可选)},"content": {"type": "text","analyzer": "ik_max_word"},"author": {"type": "keyword" # 精确匹配,不分词}}}
}
💡 解释:
analyzer
→ 文档写入时使用的分词器search_analyzer
→ 用户搜索时使用的分词器(可以不同)keyword
类型 → 保持原值,适合 ID、分类、标签
示例 2:带自定义词典的分词器
如果你在 IK 配置文件中加入了 my_dict.dic
,可以这样使用:
PUT /product
{"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_max_word"},"tags": {"type": "text","analyzer": "ik_smart"}}}
}
然后 _analyze
验证:
POST /product/_analyze
{"analyzer": "ik_max_word","text": "豆包编程助手"
}
如果 豆包
和 编程助手
能被切分,说明自定义词典生效。
二、搜索时指定分词器
即使字段默认不是 IK,也可以在查询时指定:
GET /article/_search
{"query": {"match": {"title": {"query": "豆包编程助手","analyzer": "ik_smart"}}}
}
三、项目中常见实践
1. 标题/内容检索
- 存储时:用
ik_max_word
,保证尽可能多地被切分,提升召回率 - 搜索时:用
ik_smart
,避免过多无意义的匹配,提升相关性
2. 标签/分类
-
使用
keyword
类型,不分词,保证精确过滤"tags": { "type": "keyword" }
3. 拼音搜索(扩展)
很多中文搜索项目会在 IK 基础上加 pinyin 插件,实现中文 + 拼音检索。
四、常见问题与排查
问题 | 可能原因 | 解决方案 |
---|---|---|
分词器报错 analyzer not found [ik_max_word] | 插件未安装或未重启 | 检查 elasticsearch-plugin list |
自定义词典不生效 | 没在 IKAnalyzer.cfg.xml 注册 / 未重启 ES | 确认 <entry key="ext_dict"> 配置 |
字段存储成 keyword,查询没结果 | keyword 不会分词 | 换成 text 并指定 analyzer |
搜索结果太多、不相关 | 索引和搜索分词器相同,切分过细 | 索引用 ik_max_word ,搜索用 ik_smart |
五、Go 项目中的用法示例
在 Go 里创建索引时,可以直接传 DSL:
mapping := `{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}}}
}`res, err := es.Indices.Create("article", es.Indices.Create.WithBody(strings.NewReader(mapping)))
搜索时依旧是 DSL,客户端只负责传递 JSON,不需要做分词。