Elasticsearch全文检索中文分词:IK分词器详解与Docker环境集成

目录

  • 一、IK分词器介绍与选择
    • 1. IK分词器详细介绍
      • 1.1 基本概念
      • 1.2 核心功能
      • 1.3 适用场景
    • 2. 如果不使用IK分词器,有哪些替代方案?
      • 2.1 默认分词器的局限性
      • 2.2 替代方案及对比
      • 2.3 示例:Ngram Tokenizer配置
    • 3. 如何选择分词器?
      • 3.1 决策建议
      • 3.2 替代方案实操建议
    • 4. 最终结论
  • 二、Docker 单机部署 ES 并配置 IK 分词器
    • 1. 通过 Dockerfile 构建自定义镜像
      • 1.1 创建项目目录结构
      • 1.2 下载 IK 分词器插件
      • 1.3 创建 Dockerfile
      • 1.4 构建镜像
      • 1.5 启动容器
    • 2. 通过卷挂载插件
      • 2.1 下载并解压IK分词器
      • 2.2 启动容器并挂在插件
    • 3. 验证 IK 分词器安装
      • 3.1 检查插件列别
      • 3.2 测试分词效果
    • 4. 配置自定义词典
    • 5. 常见问题解决
      • 5.1 插件加载失败
      • 5.2 权限不足
      • 5.3 自定义词典未生效

一、IK分词器介绍与选择

1. IK分词器详细介绍

1.1 基本概念

IK分词器(IK Analyzer)是Elasticsearch中广泛使用的中文分词插件,专门针对中文文本进行高效的分词处理。它支持两种分词模式:

  • ik_max_word(细粒度切分):尽可能多地拆分出词语,适合提高搜索召回率。
    示例:
    输入:"身份证号:123456"
    输出:["身份", "证", "号", "123456"]
  • ik_smart(智能切分):按最粗粒度合并词语,适合提高搜索准确率。
    示例:
    输入:"身份证号:123456"
    输出:["身份证号", "123456"]

1.2 核心功能

  • 中文分词:解决中文无空格分隔的难题。
  • 自定义词典:支持用户扩展专有名词(如人名、品牌名)或过滤停用词。
# 自定义词典文件(my_dict.dic)
王者荣耀
微信支付
  • 兼容性:与Elasticsearch无缝集成,无需额外编码。

1.3 适用场景

  • 全文检索:如搜索“张三的身份证号”,能命中包含“张三”和“身份证号”的文档。
  • 精确匹配:结合keyword字段实现完整短语匹配。
  • 专业领域:通过自定义词典支持法律、医疗等专业术语。

2. 如果不使用IK分词器,有哪些替代方案?

2.1 默认分词器的局限性

Elasticsearch默认的standard分词器会按单个汉字切分中文,效果极差:

  • 输入:"身份证号" → 输出:["身", "份", "证", "号"]
  • 问题:搜索“身份证”无法命中“身份证号”。

2.2 替代方案及对比

分词方案优点缺点适用场景
ICU分词器支持多语言,内置中文基础分词分词粒度较粗,专业术语支持弱多语言混合文本
Ngram Tokenizer无需词典,按N-gram切分索引膨胀严重,检索效率低短文本、简单搜索
HanLP/THULAC插件分词精度高,支持语义分析安装复杂,性能开销较大高精度要求的专业领域
拼音分词器支持拼音搜索(如“zhangsan→张三”)需额外存储拼音字段,占用空间中文拼音混合搜索场景

2.3 示例:Ngram Tokenizer配置

PUT /image_ocr_index
{"settings": {"analysis": {"analyzer": {"ngram_analyzer": {"tokenizer": "ngram_tokenizer"}},"tokenizer": {"ngram_tokenizer": {"type": "ngram","min_gram": 2,"max_gram": 3}}}},"mappings": {"properties": {"texts.content": {"type": "text","analyzer": "ngram_analyzer"}}}
}
  • 行为:将“张三”切分为["张三", "张", "三"]min_gram=2时仅生成["张三"])。
  • 缺点:索引体积可能增长5~10倍,且搜索结果包含大量噪声。

3. 如何选择分词器?

3.1 决策建议

  • 必须使用IK的情况
    需要精准中文分词(如法律合同、身份证信息提取)。
  • 可不用IK的情况
    • 数据以英文为主,中文为辅。
    • 仅需简单匹配(如按完整字段值搜索)。
    • 资源有限,无法安装第三方插件。

3.2 替代方案实操建议

  1. ICU分词器(内置,无需安装):
PUT /image_ocr_index
{"settings": {"analysis": {"analyzer": {"icu_analyzer": {"tokenizer": "icu_tokenizer"}}}}
}
  • 效果:"身份证号"["身份", "证", "号"](优于默认分词器)。
  1. Ngram + 同义词过滤
    通过同义词表合并常用词,减少噪声。

4. 最终结论

  • 推荐方案:优先使用IK分词器,通过ik_max_word提高召回率,结合content.keyword实现精确匹配。
  • 妥协方案:若无IK,选择ICU分词器Ngram+同义词过滤,但需接受精度下降。
  • 高级场景:专业领域(如医学)可尝试HanLP,但需评估性能成本。

二、Docker 单机部署 ES 并配置 IK 分词器

1. 通过 Dockerfile 构建自定义镜像

1.1 创建项目目录结构

mkdir -p elasticsearch-ik-docker/plugins
cd elasticsearch-ik-docker

1.2 下载 IK 分词器插件

  • 确保下载与 Elasticsearch 8.4.3 兼容的版本
  • IK分词器下载地址:Index of: analysis-ik/stable/
wget -P plugins/ https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.4.3/elasticsearch-analysis-ik-8.4.3.zip
unzip plugins/elasticsearch-analysis-ik-8.4.3.zip -d plugins/ik

1.3 创建 Dockerfile

# elasticsearch-ik-docker/Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:8.4.3
# 复制 IK 分词器到插件目录
COPY plugins/ik /usr/share/elasticsearch/plugins/ik
# 可选:添加自定义词典(需提前准备好)
# COPY custom_dict.dic /usr/share/elasticsearch/plugins/ik/config/custom_dict.dic
# 确保插件目录权限正确
USER root
RUN chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/plugins
USER elasticsearch

1.4 构建镜像

docker build -t elasticsearch-ik:8.4.3 .

1.5 启动容器

docker run -d \--name elasticsearch \-p 9200:9200 \-p 9300:9300 \-e "discovery.type=single-node" \-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \elasticsearch-ik:8.4.3

2. 通过卷挂载插件

2.1 下载并解压IK分词器

mkdir -p ~/es-plugins/ik
wget -O ~/es-plugins/ik/ik.zip https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.4.3/elasticsearch-analysis-ik-8.4.3.zip
unzip ~/es-plugins/ik/ik.zip -d ~/es-plugins/ik

2.2 启动容器并挂在插件

docker run -d \--name elasticsearch \-p 9200:9200 \-p 9300:9300 \-v ~/es-plugins/ik:/usr/share/elasticsearch/plugins/ik \-e "discovery.type=single-node" \docker.elastic.co/elasticsearch/elasticsearch:8.4.3

3. 验证 IK 分词器安装

3.1 检查插件列别

# 检查插件列表,输出应包含: analysis-ik
docker exec elasticsearch /usr/share/elasticsearch/bin/elasticsearch-plugin list
# 测试分词效果
curl -X POST "http://10.0.31.221:9200/_analyze" -H 'Content-Type: application/json' -d '{"analyzer": "ik_max_word","text": "身份证号:123456"}'

3.2 测试分词效果

curl -X POST "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{"analyzer": "ik_max_word","text": "身份证号:123456"
}'
  • 预期输出
{"tokens": [{"token":"身份", "start_offset":0, "end_offset":2, "type":"CN_WORD", "position":0},{"token":"证", "start_offset":2, "end_offset":3, "type":"CN_CHAR", "position":1},{"token":"号", "start_offset":3, "end_offset":4, "type":"CN_CHAR", "position":2},{"token":"123456", "start_offset":5, "end_offset":11, "type":"ARABIC", "position":3}]
}

4. 配置自定义词典

  • 准备词典文件
echo "自定义术语" > ~/es-plugins/ik/config/custom_dict.dic
  • 修改IK配置文件,编辑 ~/es-plugins/ik/config/IKAnalyzer.cfg.xml
<entry key="ext_dict">custom_dict.dic</entry>
  • 重启容器
docker restart elasticsearch

5. 常见问题解决

5.1 插件加载失败

  • 现象:日志提示 Plugin [analysis-ik] was built for Elasticsearch version x.x.x
  • 解决:确保 IK 版本与 Elasticsearch 完全一致(此处必须为 8.4.3)。

5.2 权限不足

  • 现象:容器启动失败,日志报错 Permission denied
  • 解决:确保挂载的插件目录权限正确
chmod -R 755 ~/es-plugins/ik

5.3 自定义词典未生效

  • 现象:新增词汇未识别
  • 解决:确认词典文件路径正确,且配置文件修改后重启容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93760.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用软件推荐

作者给大家推荐两个软件&#xff1a;typedown,typora typedown在microsoft上即可下载&#xff0c;免费 如果有更多的需求建议下载typora,typora为付费软件 typora官网&#xff1a;typora官网 typedown下载&#xff1a;typedown下载 作者曾经发布的一些以"md"为后…

地图导航怎么测?

地图导航的测试需要结合功能验证、性能评估和场景模拟等多维度方法,以下是基于行业标准和实践的系统化测试方案: 一、核心测试维度与方法 (一)功能测试:覆盖导航全流程 1、基础功能验证 路线规划:输入起点 / 终点后,验证系统是否能生成最短、最快或避开拥堵的路线,并…

力扣70:爬楼梯

力扣70:爬楼梯题目思路代码题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路 首先我们先列出来前几个台阶的答案从第一个开始&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;5。…

CoRL 2025|隐空间扩散世界模型LaDi-WM大幅提升机器人操作策略的成功率和跨场景泛化能力

内容源自计算机科研圈在机器人操作任务中&#xff0c;预测性策略近年来在具身人工智能领域引起了广泛关注&#xff0c;因为它能够利用预测状态来提升机器人的操作性能。然而&#xff0c;让世界模型预测机器人与物体交互的精确未来状态仍然是一个公认的挑战&#xff0c;尤其是生…

Rust 入门 生命周期-next2 (十九)

生命周期消除实际上&#xff0c;对于编译器来说&#xff0c;每一个引用类型都有一个生命周期&#xff0c;那么为什么我们在使用过程中&#xff0c;很多时候无需标注生命周期&#xff1f;例如&#xff1a;fn first_word(s: &str) -> &str {let bytes s.as_bytes();f…

Three.js 动画循环学习记录

在上一篇文章中&#xff0c;我们学习了Three.js 坐标系系统与单位理解教程&#xff1a; Three.js 坐标系系统与单位理解教程 接下来我们要学习的是Three.js 的动画循环 一、动画循环基础原理 1. 什么是动画循环&#xff1f; 动画循环是连续更新场景状态并重新渲染的过程&am…

ktg-mes 改造成 Saas 系统

ktg-mes 改造成 Saas 系统 快速检验市场&#xff0c;采用最简单的方案&#xff0c;即添加表字段 截止2025年8月16日上传的ktg-mes搭建存在一些问题&#xff0c;搭建可看文章&#xff1a; 搭建ktg-mes 改造 1. 添加租户表 create table sys_tenant (tenant_id bigint au…

【新手易混】find 命令中 -perm 选项的知识点

find 命令是 Linux/Unix 系统中强大的文件查找工具&#xff0c;广泛用于根据文件名、类型、时间、权限等条件搜索文件。其中&#xff0c;-perm 选项用于按文件权限查找文件&#xff0c;而在 -perm /mode 中出现的斜杠 / 是一种特殊的语法&#xff0c;表示“按位或&#xff08;O…

gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别

问&#xff1a; "monitor flash write_image erase ${workspaceFolder}/obj/ylad_led_blink.elf", 和 "load", "executable" : "${workspaceFolder}/obj/ylad_led_blink.elf", 的区别&#xff1f;答&#xff1a; 你提到的 "monit…

1. Docker的介绍和安装

文章目录1. Docker介绍核心概念核心优势与虚拟机的区别一句话总结2. Docker的安装Windows 10/11 安装 Docker Desktop&#xff08;推荐 WSL2 方式&#xff09;Linux&#xff08;以 Ubuntu / Debian 系为例&#xff09;Docker 是一个开源的容器化平台&#xff0c;它允许开发者将…

fastdds.ignore_local_endpoints 属性

Fast DDS 的 fastdds.ignore_local_endpoints 属性用于控制同一 DomainParticipant 下的本地端点&#xff08;即 DataWriter 和 DataReader&#xff09;是否自动匹配。以下是对该功能的详细解释&#xff0c;并翻译为中文&#xff0c;结合其上下文、实现原理和使用场景&#xff…

华清远见25072班C语言学习day11

重点内容:函数&#xff1a;定义&#xff1a;返回值类型 函数名(参数列表) { //函数体 }函数的参数列表中可以有多个数据返回值&#xff1a;如果函数没有返回值可以写成void 返回值的作用&#xff0c;函数的结果用来返回给主调函数的&#xff0c;如果主调函数处不需要函数的结果…

视觉语言导航(7)——VLN的数据集和评估方法 3.2

这是课上做的笔记&#xff0c;因此很多记得比较急&#xff0c;之后会逐步完善&#xff0c;每节课的逻辑流程写在大纲部分。成功率(SR)导航误差(NE)成功加权路径长度&#xff08;SucceedPLength&#xff09;轨迹长度&#xff08;TL&#xff09;先知成功率&#xff08;OS&#xf…

ElasticSearch不同环境同步索引数据

目的&#xff1a;在生产环境把一个索引的数据同步到测试环境中1、在生产环境导出json数据curl -u "adims_user:xkR%cHwR5I9g" -X GET "http://172.18.251.132:9200/unify_info_mb_sp_aggregatetb_0004/_search?scroll1m" -H Content-Type: applicatio…

咨询进阶——解读咨询顾问技能模型

适应人群为咨询行业从业者、咨询团队管理者、想提升咨询技能的职场人士及咨询公司培训人员。主要内容围绕咨询顾问技能模型展开,核心包括五大核心能力(解决问题能力,涵盖洞察力、分析技巧、问题构建等,从识别问题实质到构建新分析方法分层次阐述;管理能力,涉及管理他人与…

2025年- H98-Lc206--51.N皇后(回溯)--Java版

1.题目描述2.思路 二维数组集合 (1&#xff09;N皇后规则 1&#xff09;不能同行&#xff08;同一行不能出现2个皇后&#xff09; 2&#xff09;不能同列&#xff08;同一列不能出现2个皇后&#xff09; 3&#xff09;不能说45度或135度&#xff08;斜对角线不能出现2个皇后&am…

5G + AI + 云:电信技术重塑游戏生态与未来体验

在数字娱乐蓬勃发展的今天&#xff0c;游戏产业已然成为科技创新的前沿阵地。电信网络也经历了一场深刻的蜕变&#xff0c;从最初仅仅是 “内容传输管道”&#xff0c;摇身一变成为与游戏深度绑定的技术共生体。5G 不断刷新着体验的边界&#xff0c;AI 彻底颠覆传统的创作模式&…

【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks

【React Hooks】封装的艺术&#xff1a;如何编写高质量的 React 自-定义 Hooks 所属专栏&#xff1a; 《前端小技巧集合&#xff1a;让你的代码更优雅高效》 上一篇&#xff1a; 【React State】告别 useState 滥用&#xff1a;何时应该选择 useReducer 作者&#xff1a; 码力…

华为GaussDB的前世今生:国产数据库崛起之路

在数据库领域&#xff0c;华为GaussDB已成为一颗耀眼的明星&#xff0c;为企业核心业务数字化转型提供坚实的数据底座。但这并非一蹴而就&#xff0c;其背后是长达二十余年的技术沉淀、战略投入与持续创新。本文将深入探寻华为GaussDB的历史沿革与核心技术细节&#xff0c;展现…

数据结构初阶(16)排序算法——归并排序

2.4 归并排序 归并排序&#xff08;Merge Sort&#xff09;是基于分治思想的经典排序算法。核心逻辑&#xff1a; 分而治之——把复杂排序问题拆分成简单子问题解决&#xff0c;再合并子问题的结果。联系链表的合并&#xff1a;两个有序链表l1、l2创建新链表l3&#xff08;带头…