写点什么

大数据 -172 Elasticsearch 索引操作与 IK 分词器落地实战:7.3/8.15 全流程速查

作者:武子康
  • 2025-12-03
    山东
  • 本文字数:3120 字

    阅读完需:约 10 分钟

大数据-172 Elasticsearch 索引操作与 IK 分词器落地实战:7.3/8.15 全流程速查

TL;DR

  • 场景:在单机或小集群环境,完成索引 CRUD、健康检查与 IK 远程词典配置。

  • 结论:IK 必须与 ES 版本匹配;重启后用 _analyze 校验;索引观测用 _cat/indices 更稳。

  • 产出:可直接复用的命令清单、远程词典部署要点、常见故障定位与修复表。


版本矩阵

注意事项

  1. 代码相关部分(如命令、文件名)使用反引号 ` 包裹。

  2. 表格对齐通过调整列宽和文本换行优化可读性。

  3. 版本号与命令混合的单元格通过分行或括号注明保持清晰。


索引操作

创建索引库

Elasticsearch 采用 Rest 风格 API,因此其 API 就是一次 HTTP 请求,你可以用任何工具来发起 HTTP 请求。语法:


PUT /索引名称{  "settings": {    "属性名": "属性值"  }}
复制代码


settings:就是索引库设置,其中可以索引库的各种属性,比如分片数、副本数等。目前我们不设置,先默认即可。示例:


PUT /wzkicu-index
复制代码


执行结果如下图:


判断索引是否存在

单个索引

语法:


GET /索引名称
复制代码


示例:


GET /wzkicu-index
复制代码


执行结果如下图所示:


多个索引

语法:


GET /索引名称1,2,3,4,5...
复制代码


示例:


GET /wzkicu-index,wzkicu,wzk
复制代码


执行结果如下图所示:(这里有不存在的索引,所以 404 了)


所有索引

方式 1:


GET _all
复制代码


执行结果如下图所示:



方式 2:


GET /_cat/indices?v
复制代码


执行结果如下图所示:



这里的 health 列,表示:


  • 绿色:索引的所有分片都正常分配

  • 黄色:至少有一个副本没有得到正确的分配

  • 红色:至少有一个主分片没有得到正常的分配

打开索引

语法:


POST /索引名称/_open
复制代码


示例:


POST /wzkicu-index/_open
复制代码


执行结果如下图:


关闭索引

语法:


POST /索引名称/_close
复制代码


示例:


POST /wzkicu-index/_close
复制代码


执行结果如下图:


删除索引

语法:


DELETE /索引名称1,2,3,4,5...
复制代码


示例:


DELETE /wzkicu-index
复制代码


执行结果如下图所示:


IK 分词器

下载项目

官方地址在这里,是 GitHub 开源的项目,安装方式很多,我这里就直接用官方的方式安装了:


https://github.com/infinilabs/analysis-ik/releases/tag/Latest
复制代码


页面是这样的:


安装插件

cd /opt/servers/elasticsearch-7.3.0/bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.3.0
复制代码


执行结果如下图所示,我们需要重启 ES:


重启 ES

重启过程,启动完毕:


分词测试

IK 分词器两种分词模式:


  • ik_max_word 模式 (最常用)(会将文本最细粒度的拆分)

  • ik_smart 模式 (会做最粗粒度的拆分)


暂时不细追究语法,先学习测试,再后续研究。

ik_max_word

POST _analyze{  "analyzer": "ik_max_word",  "text": "山东省青岛市黄岛区"}
复制代码


我们的到的结果是:


{  "tokens": [    {      "token": "山东省",      "start_offset": 0,      "end_offset": 3,      "type": "CN_WORD",      "position": 0    },    {      "token": "山东",      "start_offset": 0,      "end_offset": 2,      "type": "CN_WORD",      "position": 1    },    {      "token": "省",      "start_offset": 2,      "end_offset": 3,      "type": "CN_CHAR",      "position": 2    },    {      "token": "青岛市",      "start_offset": 3,      "end_offset": 6,      "type": "CN_WORD",      "position": 3    },    {      "token": "青岛",      "start_offset": 3,      "end_offset": 5,      "type": "CN_WORD",      "position": 4    },    {      "token": "市",      "start_offset": 5,      "end_offset": 6,      "type": "CN_CHAR",      "position": 5    },    {      "token": "黄岛区",      "start_offset": 6,      "end_offset": 9,      "type": "CN_WORD",      "position": 6    },    {      "token": "黄岛",      "start_offset": 6,      "end_offset": 8,      "type": "CN_WORD",      "position": 7    },    {      "token": "区",      "start_offset": 8,      "end_offset": 9,      "type": "CN_CHAR",      "position": 8    }  ]}
复制代码


执行的结果如下图所示:


ik_smart

POST _analyze{  "analyzer": "ik_smart",  "text": "山东省青岛市黄岛区"}
复制代码


执行的结果是:


{  "tokens": [    {      "token": "山东省",      "start_offset": 0,      "end_offset": 3,      "type": "CN_WORD",      "position": 0    },    {      "token": "青岛市",      "start_offset": 3,      "end_offset": 6,      "type": "CN_WORD",      "position": 1    },    {      "token": "黄岛区",      "start_offset": 6,      "end_offset": 9,      "type": "CN_WORD",      "position": 2    }  ]}
复制代码


执行的结果如下图所示:


提出问题

在实际环境中,有很多时候并不能够准确的理解我们断词断句,有时候有些词我们想要它拆分,有些词我们希望它不拆分。那我们怎么办呢?

词典使用

扩展词

不进行分词,告诉引擎这是一个词。

停用词

有些词在文本中出现的频率非常高,但对本文的语义会产生很大的影响,例如:呢、了、啊等等,英语中也有类似于 a 、the、of 等等。这样的词称为停用词。停用词经常会过滤掉,不会被索引,在检索过程中,如果用户的查询词中含有停用词,系统会自动过滤掉。停用词可以加快索引的速度、减少索引库的大小。


扩展词、停用词应该统一维护,避免集群中多台导致节点各自维护自己的一份。这里我们计划使用 Web 的方式,将 dict 词库共享给分词器等。

分词服务

配置 Web 我这里使用 Nginx,你也可以使用 Tomcat:


apt install nginx
复制代码


安装过程如下图所示:



访问页面:http://h121.wzk.icu,可以看到 Nginx 顺利运行:



编写 dict 内容:


vim /var/www/html/stop_dict.dic
复制代码


向其中写入的内容如下:



复制代码


同理,我们写入 ext_dict.dic:


vim /var/www/html/ext_dict.dic
复制代码


我们访问对应的页面,可以拿到对应的 Web 文件:


配置分词器

# 这里看自己的版本 我选了好几个cd /opt/servers/elasticsearch-8.15.0/plugins/analysis-ikmkdir configvim IKAnalyzer.cfg.xml
复制代码


写入如下的内容:


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties>  <comment>IK Analyzer 扩展配置</comment>  <!--用户可以在这里配置自己的扩展字典 -->  <entry key="ext_dict"></entry>  <!--用户可以在这里配置自己的扩展停止词字典-->  <entry key="ext_stopwords"></entry>  <!--用户可以在这里配置远程扩展字典 -->  <entry key="remote_ext_dict">http://h121.wzk.icu/ext_dict.dic</entry>  <!--用户可以在这里配置远程扩展停止词字典-->  <entry key="remote_ext_stopwords">http://h121.wzk.icu/stop_dict.dic</entry></properties>
复制代码


对应的截图如下所示:


重启服务

重启 ES 服务,测试效果。

错误速查

其他系列

🚀 AI 篇持续更新中(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!AI 研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地🔗 AI模块直达链接

💻 Java 篇持续更新中(长期更新)

Java-180 Java 接入 FastDFS:自编译客户端与 Maven/Spring Boot 实战 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务已完结,Dubbo 已完结,MySQL 已完结,MongoDB 已完结,Neo4j 已完结,FastDFS 已完结,OSS 正在更新... 深入浅出助你打牢基础!🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解🔗 大数据模块直达链接

发布于: 刚刚阅读数: 6
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-172 Elasticsearch 索引操作与 IK 分词器落地实战:7.3/8.15 全流程速查_Java_武子康_InfoQ写作社区