Elasticsearch IK 中文分词器入门
1. IK 分词器是什么?
analysis-ik 是 Elasticsearch / OpenSearch 的中文分析插件,它把 Lucene IK 分词能力集成进搜索引擎,并支持自定义词典。项目主要提供两个 Analyzer:
ik_smart
ik_max_word
(GitHub )
它解决的核心问题就是:
让 Elasticsearch 更合理地理解中文里的“词”。
2. 为什么需要中文分词?
英文天然存在空格:
I love Spring Boot
很容易拆成:
I
love
Spring
Boot
但是中文:
我喜欢使用SpringBoot开发项目
词与词之间没有天然空格。
搜索系统真正希望得到的是类似:
喜欢
SpringBoot
开发
项目
而不是单纯把整句话当成一个整体。
Elasticsearch 的 Analyzer 本身就是负责把文本转换成 Token,随后这些 Token 才会进入倒排索引。(Elastic )
所以:
中文文本
↓
IK 分词
↓
一个个词
↓
倒排索引
↓
关键词搜索
3. IK 什么时候使用?
如果项目存在:
中文文章搜索
商品搜索
知识库关键词检索
标题搜索
新闻搜索
文档全文检索
并且使用:
Elasticsearch / OpenSearch
就可以考虑 IK。
例如数据库里有:
Spring Boot 微服务开发实战
用户搜索:
微服务开发
ES 首先需要对文本进行分词,然后才能根据倒排索引进行关键词匹配。
因此 IK 服务的是:
Keyword Search
关键词检索
而不是:
Embedding
Vector Search
语义检索
这个区别非常重要。
4. ik_max_word 和 ik_smart
IK 最核心的就是这两个。
ik_max_word
尽可能细地拆词:
中华人民共和国国歌
会生成更多可能的词组合。
特点:
分词更多
召回率更高
索引词更多
比较适合:
建立索引
ik_smart
更加粗粒度:
中华人民共和国
国歌
特点:
词更少
结果更干净
官方项目也说明,ik_max_word 是细粒度切分,而 ik_smart 是粗粒度切分。(GitHub )
所以非常常见的配置是:
写入文档
↓
ik_max_word
用户搜索
↓
ik_smart
5. 和 Elasticsearch 怎么使用?
安装 IK 插件以后,可以给字段设置 Analyzer。
例如:
PUT article
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}
这里:
analyzer
表示:
文档写入 ES 时怎么分词
而:
search_analyzer
表示:
用户搜索时怎么分词
这种 ik_max_word + ik_smart 的配置也是 analysis-ik 官方 README 给出的入门方式。(GitHub )
6. 查询时发生了什么?
保存:
{
"title": "Java微服务开发实战"
}
大致经过:
Java微服务开发实战
↓
ik_max_word
↓
Java
微服务
服务
开发
实战
...
↓
ES索引
用户搜索:
微服务开发
经过:
微服务开发
↓
ik_smart
↓
微服务
开发
↓
倒排索引匹配
↓
搜索结果
所以 IK 本身并不是:
搜索引擎
它更像 Elasticsearch 搜索之前的一道:
中文文本预处理器
7. 怎么查看 IK 分词结果?
开发时非常推荐使用 ES 的 _analyze API:
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "新能源汽车充电解决方案"
}
然后观察 ES 实际拆出了哪些 Token。
换成:
POST /_analyze
{
"analyzer": "ik_smart",
"text": "新能源汽车充电解决方案"
}
就可以很直观地比较两个 Analyzer。
8. 自定义词典有什么用?
假设你的公司有一个产品:
星云智算平台
IK 可能不知道这是一个完整业务词。
这时候就可以加入:
自定义词典
例如:
星云智算平台
ChatGPT
SpringAI
公司内部产品名
行业专有名词
analysis-ik 支持扩展词典、停用词以及远程词典,并支持通过远程词典进行热更新。(GitHub )
这在:
电商
医疗
金融
企业知识库
专业技术文档
里面非常重要,因为这些业务通常有大量专业词。
9. IK 和语义搜索是什么关系?
这两个不要混。
IK
↓
中文分词
↓
倒排索引
↓
BM25
↓
关键词搜索
而语义搜索:
文本
↓
Embedding
↓
Vector
↓
向量相似度
↓
语义搜索
因此:
IK解决:
“有没有这些词?”
Vector解决:
“是不是这个意思?”
实际知识库系统可以两个一起使用:
用户问题
↓
┌────────┴────────┐
↓ ↓
IK分词 Embedding
↓ ↓
Keyword Search Vector Search
↓ ↓
BM25 Semantic
└────────┬────────┘
↓
Hybrid Search
10. 总结
IK 可以记成一句话:
IK 是 Elasticsearch 中非常常见的中文分词插件,用来提高中文关键词检索的分词和匹配效果。
核心链路:
中文
↓
IK
↓
Token
↓
Elasticsearch 倒排索引
↓
BM25
↓
关键词搜索
入门阶段只需要记住:
ik_max_word
→ 分得细
→ 常用于建立索引
ik_smart
→ 分得粗
→ 常用于搜索
以及:
IK = 关键词检索体系
Embedding = 语义检索体系
IK + Vector
= 可以进一步组成 Hybrid Search
这就足够开始实际使用 IK 了。
项目地址:analysis-ik GitHub