IK Analysis:给 Elasticsearch 装上中文分词的老牌插件

IK Analysis 在 GitHub 上已经拿到 17.4K Star 了。

INFINI Labs 维护着这个插件,干的事情很专一,就是把 Lucene 的 IK 分析器接进 Elasticsearch 和 OpenSearch,让这两个搜索引擎能正常切中文词。提供 ik_smart 和 ik_max_word 两套分析器,前者粗切,后者细切。

正文顶部截图

1、 这玩意儿解决什么问题

ES 内置的分词器处理中文基本一刀切,按字拆,搜出来的结果五花八门。开发者要么自己包一层,要么换带中文支持的方案,要么干脆不做中文搜索。

IK Analysis 把这一层补上。装上插件之后,索引数据时指定 analyzer 为 ik_max_word,搜索时指定 ik_smart,中文内容就能被正确切分成词项,匹配率和召回率都能上一个台阶。

2、 两种分词模式怎么选

ik_max_word 把文本切到最细。输入"中华人民共和国国歌",会切出"中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌",把各种可能的组合都列出来。适合 Term Query,靠它建索引能把召回拉满。

ik_smart 切到最粗。同样那句只会切出"中华人民共和国、国歌"两段。适合 Phrase Query,做精确匹配时用,不会把无关结果带出来。

两种切分结果并非子集关系,选哪个看场景,并非越细越好。

README区域截图

3、 怎么装

两种方式,二选一。

直接下打包好的 zip:

bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/9.1.4

OpenSearch 同理,把 elasticsearch-plugin 换成 opensearch-plugin,URL 换成对应版本即可。

或者去 release.infinilabs.com 下打包好的插件文件,按 ES 版本对应安装。装完重启节点生效。

注意:版本号必须跟 ES 主版本对上,对不上插件加载会失败。

4、 用起来什么样子

建索引、设 mapping、灌数据、查询,四步走。

mapping 里把字段的 analyzer 设成 ik_max_word,search_analyzer 设成 ik_smart。灌数据走 _create API,查询走 _search。配合 highlight 能把命中词项直接标出来,前端展示搜索结果的时候挺有用。

这套流程跑下来不复杂,对习惯 ES 的人没什么学习负担。

5、 自定义词典

IK 自带主词典,业务里那些专有名词、黑话、新词基本覆盖不到。配置文件 IKAnalyzer.cfg.xml 放在 conf/analysis-ik 目录下,里面能挂本地扩展词典、扩展停用词词典,也能挂远程词典。

远程那块是热更新入口。配一个 HTTP URL,IK 周期去拉,只要响应里 Last-Modified 或 ETag 有变化,就重新加载词库,不用重启 ES。

HTTP 响应得满足两条要求。返回头里要有 Last-Modified 和 ETag 两个字段,都是字符串,任一个变化就触发更新。返回体一行一个词,换行符是 \n。

实际部署里很多人把词典放在 nginx 或某个静态文件服务下,改词直接改 txt,ES 节点不用动。也有自己起个服务从业务系统抽词的,怎么方便怎么来。

6、 谁在用

  • 做内容搜索、电商搜索、企业内搜索的开发者
  • 用 ES 做日志分析、需要中文分词支持的运维
  • 搭知识库、需要中文召回率的团队

INFINI Labs 在持续维护,适配 ES 主要版本。社区活跃度不算特别高,但这是个成熟项目,能踩的坑前人都踩完了,issue 区能翻到答案。

abs 在持续维护,适配 ES 主要版本。社区活跃度不算特别高,但这是个成熟项目,能踩的坑前人都踩完了,issue 区能翻到答案。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐