news 2026/3/1 7:48:56

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/2/25 6:26:40

互联网域间路由系统安全风险分析及应对策略研究

一、前言DNS作为互联网的“电话簿”,承担域名解析的核心职能。然而,DNS设计初期的开放性导致其长期暴露于多种安全威胁中。例如在边界路由广播协议(Border Gateway Protocol, BGP)路由劫持中,攻击者通过伪造BGP路由宣告…

作者头像 李华
网站建设 2026/2/28 14:34:14

Java面试一般问什么?

程序员面试背八股,可以说是现在互联网开发岗招聘不可逆的形式了,其中最卷的当属Java!(网上动不动就是成千上百道的面试题总结)你要是都能啃下来,平时技术不是太差的话,面试基本上问题就不会太大…

作者头像 李华
网站建设 2026/2/25 13:54:33

Java毕设项目推荐-基于springboot的校园传统文化交流系统传统文化资源(典籍、技艺、民俗等)、活动信息【附源码+文档,调试定制服务】

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

作者头像 李华
网站建设 2026/2/18 16:22:52

智谱·Open-AutoGLM智能体实战指南:3步实现自动化代码生成与优化

第一章:智谱Open-AutoGLM智能体概述智谱Open-AutoGLM 是由智谱AI推出的一款面向自动化任务处理的大型语言模型智能体框架。该智能体基于 GLM 大模型架构,融合了自然语言理解、代码生成与工具调用能力,能够自主解析用户指令、规划执行路径&…

作者头像 李华
网站建设 2026/2/23 10:24:18

Open-AutoGLM部署已完成,如何实现高并发推理服务上线?

第一章:Open-AutoGLM部署完成后的系统概览Open-AutoGLM 成功部署后,系统进入可运行状态,各核心组件协同工作以支持自动化大语言模型任务调度与执行。此时可通过访问默认服务端口验证系统运行状态,并检查关键服务进程是否正常启动。…

作者头像 李华
网站建设 2026/2/28 0:04:45

穿透表象:在“人类在环-规则在场-语境主权”框架下

穿透表象:在“人类在环-规则在场-语境主权”框架下——重审AI元人文构想的风险与未来前天投递手稿论文通过了,其实我不觉得成功了,可能预印本平台看我两个月连续投递134篇非专业手稿论文,可怜我我理解您的感受。当巨大的心力付出后…

作者头像 李华