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

【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.xdnf.cn/news/18446.html

相关文章:

  • 微前端qiankun框架,子页面图标样式错乱问题,显示为X
  • 人脸识别驱动的工厂人体属性检测与预警机制
  • Conmi的正确答案——Ubuntu24.04禁用任何休眠
  • huggingface离线下载模型使用方法
  • CAN总线工具学习:DBC解析、设备扫描与报文监控
  • Logstash——性能、可靠性与扩展性架构
  • JAVA后端开发——API状态字段设计规范与实践
  • Claude Code接入Serena mcp
  • Elasticsearch Rails 集成(elasticsearch-model / ActiveRecord)
  • [激光原理与应用-317]:光学设计 - Solidworks - 零件、装配体、工程图
  • 浅拷贝,深拷贝
  • 【生成树+环】题解:P3907 环的异或_图论_环_异或_搜索_算法竞赛_C++
  • 【C++】多态(详解)
  • 单片机---------WIFI模块
  • 智能二维码QR\刷IC卡\人脸AI识别梯控系统功能设计需基于模块化架构,整合物联网、生物识别、权限控制等技术,以下是多奥分层次的系统设计框架
  • openEuler系统中home文件夹下huawei、HwHiAiUser、lost+found 文件夹的区别和作用
  • Linux:网络层IP协议
  • Spring Web MVC
  • 36v转5v峰值电流7A同步DC/DC降压芯片AH8655
  • C#开源库ACadSharp读取dwg图元的示例
  • Springboot项目的各层级详细总结
  • 【GaussDB】全密态等值查询功能测试及全密态技术介绍
  • Python socket远程部署工具服务
  • 论文阅读:Do As I Can, Not As I Say: Grounding Language in Robotic Affordances
  • 基于Django的学校实验室预约管理系统/基于python的实验室管理系统的设计与实现#python#django#FLASK
  • Spring Start Here 读书笔记:第9章 Using the Spring web scopes
  • Excel表格指定数据读取写入到另一个Excel表中(指定列指定行)
  • CXR-LT 2024:一场关于基于胸部X线的长尾、多标签和零样本疾病分类的MICCAI挑战赛|文献速递-深度学习人工智能医疗图像
  • 前端AI工具——TRAE
  • ExcelUtils实现 设置内容 插入行 复制行列格式