当前位置: 首页 > news >正文

【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 主版本号完全一致

五、日常操作总结

  1. 下载对应版本的 IK 插件
    wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-<版本号>.zip

  2. 安装到容器并重启

    docker cp zip包 es01:/tmp/
    docker exec -it es01 /bin/bash -c "./bin/elasticsearch-plugin install file:///tmp/xxx.zip"
    docker restart es01
    
  3. 配置自定义词典

    • 修改 IKAnalyzer.cfg.xml
    • 添加 <entry key="ext_dict">my_dict.dic</entry>
  4. 添加自定义词典 my_dict.dic,保存为 UTF-8

  5. 将配置同步回容器并重启 ES

  6. _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,不需要做分词。


http://www.dtcms.com/a/344501.html

相关文章:

  • Python 中 SQLAlchemy 和 MySQLdb 的关系
  • MongoDB 分片集群把非分片集合转成分片集合
  • MySQL 错误码
  • Flutter Provider 详解:从状态管理痛点到实战落地
  • Linux权限详解
  • 电子基石:硬件工程师的器件手册 (十三) - 电源管理IC:能量供给的艺术
  • 使用html+css+javascript练习项目布局--创建导航栏
  • 高并发场景数据与一致性的简单思考
  • 理解音频响度:LUFS 标准及其计算实现
  • 在灵码中配置MCP服务
  • Basic Threejs (2)
  • Unity中国小游戏行业沙龙:抖音小游戏平台分析与规划
  • Excel处理控件Aspose.Cells教程:使用Python将 Excel 转换为 NumPy
  • AWS OpenSearch 是什么
  • 复合设计模式
  • 阿里云详解:与 AWS、GCP 的全方位比较
  • openEuler系统中home文件夹下huawei、HwHiAiUser、lost+found 文件夹的区别和作用
  • 农业-学习记录
  • vue中监听页面滚动位置
  • Playwright进阶指南 (5):拦截与模拟网络请求
  • 【LLMs篇】19:vLLM推理中的KV Cache技术全解析
  • SymPy 中抽象函数的推导与具体函数代入
  • 《器件在EMC中的应用》---磁珠在EMC中的应用
  • 一次性密码(OTP)原理及应用
  • 解决 PyTorch 导入错误:undefined symbol: iJIT_NotifyEvent
  • 数据结构之深入探索快速排序
  • Spring Start Here 读书笔记:第10章 Implementing REST services
  • vue vxe-gantt 甘特图自定义任务条样式模板 table 自定义插槽模板
  • 云手机是依靠哪些技术运行的?
  • Shell脚本源码安装Redis、MySQL、Mongodb、PostgreSQL(无报错版)