news 2026/9/3 2:05:39

ES 8.13.4 如何配置 IK 分词同义词库(附完整实战代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ES 8.13.4 如何配置 IK 分词同义词库(附完整实战代码)

这是一篇为您定制的技术博客,完全基于您提供的Jieba分词配置逻辑,并将其转换为适用于 Elasticsearch 8.13.4 和 IK分词器的实现方案。


在使用 Elasticsearch 进行中文搜索时,IK 分词器几乎是标配。但在实际业务中(如电商、内容搜索),用户输入的词和文档中的词往往不完全一致。例如用户搜“番茄”,但文档里写的是“西红柿”或“圣女果”。如果不能识别这些同义词,搜索体验会大打折扣。

本文将基于Elasticsearch 8.13.4,手把手教你如何配置 IK 分词器结合同义词库,实现搜索效果的质的飞跃。


1. 环境准备

  • Elasticsearch: 8.13.4
  • IK Analysis Plugin: 需提前安装
    • 如果你还没安装,进入 ES 安装目录执行:
      ./bin/elasticsearch-plugininstallhttps://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.13.4/elasticsearch-analysis-ik-8.13.4.zip
    • 安装后重启 ES。

2. 创建同义词库文件

首先,我们需要告诉 ES 哪些词是同义的。

  1. 进入 Elasticsearch 的安装目录,找到config文件夹。
  2. config目录下创建一个新的文件夹,命名为ik_synonyms(名字自取,方便识别即可)。
  3. config/ik_synonyms目录下创建一个文本文件,例如my_synonyms.txt

文件内容格式(非常重要)
每一行代表一组同义词,词与词之间用英文逗号,隔开。第一个词通常作为主词。

番茄,西红柿,圣女果 土豆,马铃薯,洋芋 计算机,电脑,pc

注意:ES 8.x 对文件路径的检查比较严格,建议使用classpath:路径或者绝对路径,但在config目录下通常可以直接通过文件名引用(视具体版本配置而定,为了保险,下文配置中会使用classpath方式的变体,实际上在 config 下创建文件夹后,直接写文件名通常也能被加载)。


3. 配置索引 Mapping 与 Analyzer

这是核心步骤。我们需要创建一个索引,在其中定义一个新的 Analyzer(分析器),该分析器使用 IK 分词器,并在其后叠加一个同义词过滤器(Synonym Token Filter)。

在 Kibana Dev Tools 中执行以下命令:

PUT/product_index{"settings":{"analysis":{"filter":{"my_synonym_filter":{"type":"synonym","synonyms_path":"ik_synonyms/my_synonyms.txt"}},"analyzer":{"ik_synonym_analyzer":{"type":"custom","tokenizer":"ik_max_word","filter":["my_synonym_filter"]},"ik_synonym_search_analyzer":{"type":"custom","tokenizer":"ik_max_word","filter":["my_synonym_filter"]}}}},"mappings":{"properties":{"name":{"type":"text","analyzer":"ik_synonym_analyzer","search_analyzer":"ik_synonym_search_analyzer"}}}}

配置解析:

  1. filter部分
    • 定义了一个名为my_synonym_filter的过滤器。
    • 类型为synonym,并指定了刚才创建的同义词文件路径ik_synonyms/my_synonyms.txt
  2. analyzer部分
    • 我们自定义了一个ik_synonym_analyzer
    • tokenizer: “ik_max_word”:使用 IK 分词的细粒度模式(也可以用ik_smart粗粒度)。
    • filter: 将 IK 分词后的结果,传入我们的同义词过滤器。这意味着如果 IK 分出了“番茄”,过滤器会把它扩展成“番茄”、“西红柿”、“圣女果”三个 Token。
  3. mappings部分
    • 将字段name的分析器设置为我们刚定义的ik_synonym_analyzer

4. 插入测试数据

为了验证效果,我们插入几条包含同义词的数据:

POST/product_index/_doc/1{"name":"圣女果"}POST/product_index/_doc/2{"name":"番茄"}POST/product_index/_doc/3{"name":"番茄酱"}POST/product_index/_doc/4{"name":"西红柿炒鸡蛋"}POST/product_index/_doc/5{"name":"土豆丝"}

5. 实战搜索效果对比

现在到了见证奇迹的时刻。我们来搜索“番茄”,看看能不能把“圣女果”和“西红柿”都搜出来。

场景一:使用配置了同义词的索引搜索

GET/product_index/_search{"query":{"match":{"name":"番茄"}}}

预期结果
你会发现文档 1(圣女果)、文档 2(番茄)、文档 3(番茄酱)、文档 4(西红柿炒鸡蛋)全部被命中

原理分析

  1. 搜索词“番茄”进入ik_synonym_search_analyzer
  2. IK 分词器将其分为["番茄"]
  3. 同义词过滤器发现“番茄”在词库中,扩展为["番茄", "西红柿", "圣女果"]
  4. ES 去倒排索引中匹配这三个词,因此所有包含这三个词中任意一个的文档都被找出来了。

场景二:搜索“土豆”

GET/product_index/_search{"query":{"match":{"name":"土豆"}}}

结果: 只命中文档 5(土豆丝)。
注:如果你希望“马铃薯”也能被搜到,记得在同义词文件里加一行土豆,马铃薯


6. 进阶:同义词的扩展格式

IK 分词配合同义词过滤器非常强大,它支持 Solr 的同义词格式。

1. 显式映射(推荐)
如果你只想让“番茄”能搜到“西红柿”,但不想让“西红柿”搜到“番茄”(单向),可以使用=>

番茄 => 西红柿, 圣女果

2. 别名(Aliases)
如果你希望“番茄”和“西红柿”完全等价,互搜互得,用逗号即可(如上文配置)。

3. 保持原词并扩展(默认)
默认情况下,synonymfilter 会保留输入词。例如搜“番茄”,实际查询的是(番茄 | 西红柿 | 圣女果)


7. 常见坑点排查

  1. 分词器不生效?

    • 检查elasticsearch.yml中是否允许动态修改 analyzer(默认允许)。
    • 使用_analyzeAPI 调试:
      GET/product_index/_analyze{"analyzer":"ik_synonym_analyzer","text":"我要买番茄"}
      查看返回的 tokens 是否包含了同义词。
  2. 文件找不到报错?

    • ES 8.x 对资源文件的隔离较严格。确保my_synonyms.txtES_HOME/config/ik_synonyms/下。
    • 如果在 Docker 中运行,需要通过 Volume 挂载该文件到容器内的/usr/share/elasticsearch/config/ik_synonyms/
  3. 重启问题

    • 修改同义词文件后,不需要重启 ES,但需要关闭并重新打开索引(Close/Open Index),或者重新创建索引,因为同义词规则是在索引创建时加载到倒排索引中的。

总结

通过IK 分词 + Synonym Filter的组合拳,我们可以用极低的成本解决中文搜索中的“词不达意”问题。相比 Jieba 分词,IK 分词在 ES 中的集成更加原生和稳定,配置方式也大同小异,只需将 Tokenizer 替换为ik_max_word即可。

赶紧去你的 ES 里试一试吧!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:17:00

【计算机毕业设计案例】基于springboot的校园生活智慧服务平台校园公告推送、社团活动发布、失物招领、二手交易集市(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/9/3 0:46:32

生成式AI的技术革命与行业赋能实践

025年,生成式AI已从实验室走向产业化应用前沿,全球市场规模突破800亿美元,年增长率达45%。从GPT-5的多模态生成到Stable Diffusion的3D建模能力,生成式AI通过技术突破重构产业逻辑,在医疗、制造、内容创作等领域展现出…

作者头像 李华
网站建设 2026/8/29 0:55:16

终于找到我想要的远程工具了!

由于受不了当下流程的卡顿的远程工具,我花费2小时时间,探索到了一款4K超低延迟的远程控制工具,这里分享给大家!好用记得点赞支持一下~当远程给现场同时解决问题的时候又因为向日葵卡顿,我猜你们的对话可能是下面这样的…

作者头像 李华
网站建设 2026/9/2 23:01:16

还在手动开微信?Open-AutoGLM自动启动全攻略(附源码级解析)

第一章:Open-AutoGLM自动打开微信教学功能概述 Open-AutoGLM 是一个基于自动化脚本与大语言模型指令解析的开源工具,能够根据自然语言指令触发设备端操作。本章介绍如何使用该工具实现“自动打开微信”这一典型场景,适用于 Windows 与 macOS …

作者头像 李华
网站建设 2026/9/2 23:56:16

【限时稀缺资源】Open-AutoGLM容器化部署方案首次公开

第一章:Open-AutoGLM部署概述Open-AutoGLM 是一个开源的自动化通用语言模型部署框架,专为简化大语言模型在生产环境中的集成与管理而设计。该框架支持多种模型后端、推理引擎和调度策略,适用于从本地开发到云原生集群的多场景部署需求。核心特…

作者头像 李华
网站建设 2026/9/1 14:13:01

揭秘Open-AutoGLM在Mac上的部署难题:5步实现零错误安装与运行

第一章:Open-AutoGLM mac 部署 在 macOS 系统上部署 Open-AutoGLM 是实现本地化大模型推理与自动化任务处理的重要一步。该框架依赖 Python 环境与核心机器学习库,需通过命令行工具完成安装与配置。 环境准备 部署前需确保系统已安装以下组件&#xff1…

作者头像 李华