JAVA高级工程师--Elasticsearch安装以及内置分词器、IK分词器

一、下载ES

ES官网:https://www.elastic.co/https://www.elastic.co/cn/https://www.elastic.co/

下载地址:https://www.elastic.co/cn/downloads/elasticsearch

我是选择docker安装:https://www.docker.elastic.co/r/elasticsearch

二、ES版本

1.如何选择版本

springboot集成了有es:Spring Boot Starter Data Elasticsearch

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-elasticsearch

m1那个肯定不能选哈。

复制代码
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
			<version>4.0.2</version>
		</dependency>

它其中的:

所以只能选择es 7.17.15.

2.版本对应关系

https://docs.spring.io/spring-data/elasticsearch/docs/4.4.0/reference/html/

三、docker安装ES

https://www.docker.elastic.co/r/elasticsearch?limit=50&offset=600&show_snapshots=false

复制代码
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.15

创建目录并且挂载:

复制代码
mkdir -p /home/elasticsearch7/config
mkdir -p /home/elasticsearch7/data
mkdir -p /home/elasticsearch7/plugins

设置es可以被远程任何的计算机访问,也就是设置bindip 0.0.0.0 同理redis和mysql都是这样的。

复制代码
vim elasticsearch.yml

http.host: 0.0.0.0

懒得做docker compose了,所以直接用

docker启动ES命令

复制代码
docker run --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPS="-Xms64m -Xmx128m" \
-v /home/elasticsearch7/config/:/usr/share/elasticsearch/config \
-v /home/elasticsearch7/data:/usr/share/elasticsearch/data \
-v /home/elasticsearch7/plugins:/usr/share/elasticsearch/plugins \
--restart=always \
-d elasticsearch:7.17.15

参数释义:

  • docker run: 运行一个容器,每个容器相互隔离,他都是独立的运行环境,是一个完整的实例。
  • --name elasticsearch:为容器取名,这个名字随意。
  • -p 9200:9200 -p 9300:9300:把es容器自己的端口映射到虚拟主机,这样我们才能访问,这是端口映射,对外暴露。(9200是我们通过rest接口请求的端口,9300是内部通信端口,es集群之间会相互通信,他们有心跳机制)
  • -e "discovery.type=single-node": 单节点形式运行
  • -e ESJAVAOPS="-Xms64m -Xmx128m": 设置内存大小,如果不设置,es会占用虚拟机的全部内存,初始64m,最大128m,也够用了。
  • -v:文件路径的挂载。(数据库文件,日志,配置文件)

自动重启

复制代码
docker update elasticsearch --restart=always

重启docker

复制代码
systemctl restart docker

查看日志

复制代码
docker logs elasticsearch

因为es启动是不能使用root的,我们以前使用源码安装的时候就是这样,必须要创建新的用户才行。所以这里也是一样的。我们需要为自己目录添加权限给es

复制代码
chmod -R 777 /home/elasticsearch7/

测试访问

复制代码
http://192.168.1.xx1:9200/

遇到好多问题:

(1)Exception in thread "main" java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.options

at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)

复制代码
# 1. 完全清理
docker rm -f elasticsearch
sudo rm -rf /home/elasticsearch7

# 2. 重新创建目录
sudo mkdir -p /home/elasticsearch7/data
sudo chown -R 1000:1000 /home/elasticsearch7

# 3. 使用 Docker 卷存储配置(让Docker管理配置)
# 先运行一个容器让它生成默认配置
docker run -d --name es-temp \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms64m -Xmx128m" \
  -e "xpack.security.enabled=false" \
  elasticsearch:7.17.15 sleep 60

# 4. 复制配置出来
docker cp es-temp:/usr/share/elasticsearch/config /tmp/es-config
sudo mv /tmp/es-config /home/elasticsearch7/config
docker rm -f es-temp

# 5. 修改配置
sudo tee /home/elasticsearch7/config/elasticsearch.yml > /dev/null << 'EOF'
cluster.name: "docker-elasticsearch"
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
discovery.type: single-node
EOF

# 6. 设置权限
sudo chown -R 1000:1000 /home/elasticsearch7/config
sudo chmod -R 755 /home/elasticsearch7/config

# 7. 运行最终容器
docker run --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms64m -Xmx128m" \
  -v /home/elasticsearch7/config:/usr/share/elasticsearch/config \
  -v /home/elasticsearch7/data:/usr/share/elasticsearch/data \
  --restart=unless-stopped \
  -d elasticsearch:7.17.15

(2)uncaught exception in thread [main] java.lang.IllegalArgumentException: setting [cluster.initial_master_nodes] is not allowed when [discovery.type] is set to [single-node]

复制代码
# 1. 停止容器
docker stop elasticsearch
docker rm elasticsearch

# 2. 修改配置文件,移除 cluster.initial_master_nodes
sudo tee /home/elasticsearch7/config/elasticsearch.yml > /dev/null << 'EOF'
cluster.name: "docker-elasticsearch"
network.host: 0.0.0.0
http.port: 9200
# 注意:单节点模式不能设置 cluster.initial_master_nodes
# cluster.initial_master_nodes: ["node-1"]  # 注释掉或删除这行
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
discovery.type: single-node
EOF

# 3. 重新启动
docker run --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx1024m" \
  -v /home/elasticsearch7/config:/usr/share/elasticsearch/config \
  -v /home/elasticsearch7/data:/usr/share/elasticsearch/data \
  --restart=unless-stopped \
  -d elasticsearch:7.17.15

四、安装 ES-Head 插件

Elasticsearch Head 插件 是一个用于 Elasticsearch 的 Web 可视化管理和监控工具。它提供了一个直观的图形界面来查看和管理 Elasticsearch 集群,可以对集群进行傻瓜式操作。

es-head主要有三个方面的操作:

  1. 显示集群的拓扑,并且能够执行索引和节点级别操作
  2. 搜索接口能够查询集群中原始json或表格格式的检索数据
  3. 能够快速访问并显示集群的状态
  4. 有一个输入窗口,允许任意调用RESTful API。这个接口包含几个选项,可以组合在一起以产生有趣的结果;
    1. 请求方法(get、put、post、delete),查询json数据,节点和路径
    2. 支持JSON验证器
    3. 支持重复请求计时器
    4. 支持使用javascript表达式变换结果
    5. 收集结果的能力随着时间的推移(使用定时器),或比较的结果
    6. 能力图表转换后的结果在一个简单的条形图(包括时间序列)

1.git地址

https://github.com/mobz/elasticsearch-head

https://github.com/mobz/elasticsearch-head#running-with-built-in-server

2.安装

(1)谷歌插件安装方式(推荐)

我想安装es head谷歌插件,资源有,但是就是安装说有问题,不行。换成源码启动

(2)源码启动

复制代码
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start

http://localhost:9100/


(3)docker安装

https://hub.docker.com/

找到elasticsearch head镜像。

然后docker安装。

复制代码
for Elasticsearch 5.x: docker run -p 9100:9100 mobz/elasticsearch-head:5
for Elasticsearch 2.x: docker run -p 9100:9100 mobz/elasticsearch-head:2
for Elasticsearch 1.x: docker run -p 9100:9100 mobz/elasticsearch-head:1
for fans of alpine there is mobz/elasticsearch-head:5-alpine

我访问不到docker镜像库只能使用源码启动

3.解决跨域问题

Connecting to elasticsearch连接时,发现始终未连接,因为还需解决跨域问题。

写在这里:

这个地址是前面安装es创建的:

创建了一个索引,然后:

五.ES配套工具

1). 数据可视化工具(Kibana 的替代/补充)

工具 类别 特点 适用场景
Kibana Elastic官方 深度集成ES,功能全面 Elastic Stack 标准可视化
Grafana 第三方 多数据源支持,图表丰富 多数据源监控、时序数据
ElasticHD 第三方开源 轻量级,中文界面 简单查看ES数据
Dejavu 第三方开源 专注于数据浏览和查询 开发调试、数据管理

2). 集群管理工具(Head 的替代)

工具 类别 特点 适用场景
Elasticsearch Head 浏览器插件 轻量、快速查看 开发环境快速检查
Cerebro 独立应用 功能强大,支持集群操作 生产环境集群管理
Elasticvue 浏览器插件 现代UI,支持认证 需要认证的集群
Kopf (已弃用) 插件 旧版集群管理工具 历史项目

3). 数据收集工具(Beats 的同类)

工具 类别 特点 适用场景
Filebeat Elastic官方 日志文件收集 日志收集
Metricbeat Elastic官方 系统指标收集 系统监控
Fluentd/Fluent Bit CNCF项目 多数据源,云原生 Kubernetes 环境
Logstash Elastic官方 功能强大,支持处理 复杂数据处理
Vector 第三方 高性能,可观测性 高性能需求
Telegraf InfluxData 指标收集,插件多 InfluxDB 生态

六、elasticsearch - 分词与内置分词器

1.什么是分词

把文本转换为一个个的单词,分词称之为analysis。es默认只对英文语句做分词,中文不支持,每个中文字都会被拆分为独立的个体。

2.内置分词器

  • standard:默认分词,单词会被拆分,大小会转换为小写。

  • simple:按照非字母分词。大写转为小写。

  • whitespace:按照空格分词。忽略大小写。

  • stop:去除无意义单词,比如the/a/an/is...

  • keyword:不做分词。把整个文本作为一个单独的关键词。

整体看,更适合英文。

分词器 分词规则 示例 "The Quick Brown-Foxes" 输出结果 优点 缺点
standard(默认) 1. 按单词边界分词 2. 移除标点符号 3. 转换为小写 4. 支持多语言 ["the", "quick", "brown", "foxes"] 1. 通用性强 2. 支持多语言 3. 标准化处理 1. 可能过于通用 2. 不支持中文分词 通用英文搜索 • 文档全文检索 • 日志分析 • 多语言内容
simple 1. 按非字母字符分词 2. 转换为小写 3. 丢弃非字母字符 ["the", "quick", "brown", "foxes"] 1. 简单高效 2. 内存占用低 1. 功能有限 2. 无法处理数字+字母混合 简单英文文本 • 纯字母内容 • 性能敏感场景 • 简单标签系统
whitespace 1. 仅按空格分词 2. 保留大小写 3. 保留标点符号 ["The", "Quick", "Brown-Foxes"] 1. 保留原始格式 2. 处理特殊字符 1. 大小写敏感 2. 标点影响搜索 保留格式文本 • 代码搜索 • URL/路径搜索 • 大小写敏感内容
stop 1. 同standard分词 2. 移除停用词(the, a, an等) 3. 转换为小写 ["quick", "brown", "foxes"] 1. 减少索引大小 2. 提升搜索精度 3. 移除噪声词 1. 停用词列表固定 2. 可能误删重要词 内容优化搜索 • 文章/博客搜索 • 文档检索系统 • 优化存储空间
keyword 1. 不进行分词 2. 整个文本作为一个词项 3. 保留原始大小写 ["The Quick Brown-Foxes"] 1. 精确匹配 2. 保留完整格式 3. 支持聚合 1. 无法部分匹配 2. 索引体积大 精确值匹配 • ID/编号搜索 • 分类标签 • 聚合分析字段

3.接口工具测试

postman

分词结果:

复制代码
{
    "tokens": [
        {
            "token": "快",
            "start_offset": 0,
            "end_offset": 1,
            "type": "<IDEOGRAPHIC>",
            "position": 0
        },
        {
            "token": "乐",
            "start_offset": 1,
            "end_offset": 2,
            "type": "<IDEOGRAPHIC>",
            "position": 1
        },
        {
            "token": "星",
            "start_offset": 2,
            "end_offset": 3,
            "type": "<IDEOGRAPHIC>",
            "position": 2
        },
        {
            "token": "球",
            "start_offset": 3,
            "end_offset": 4,
            "type": "<IDEOGRAPHIC>",
            "position": 3
        },
        {
            "token": "也",
            "start_offset": 4,
            "end_offset": 5,
            "type": "<IDEOGRAPHIC>",
            "position": 4
        },
        {
            "token": "有",
            "start_offset": 5,
            "end_offset": 6,
            "type": "<IDEOGRAPHIC>",
            "position": 5
        },
        {
            "token": "快",
            "start_offset": 6,
            "end_offset": 7,
            "type": "<IDEOGRAPHIC>",
            "position": 6
        },
        {
            "token": "乐",
            "start_offset": 7,
            "end_offset": 8,
            "type": "<IDEOGRAPHIC>",
            "position": 7
        },
        {
            "token": "杯",
            "start_offset": 8,
            "end_offset": 9,
            "type": "<IDEOGRAPHIC>",
            "position": 8
        },
        {
            "token": "happy",
            "start_offset": 9,
            "end_offset": 14,
            "type": "<ALPHANUM>",
            "position": 9
        },
        {
            "token": "happy",
            "start_offset": 15,
            "end_offset": 20,
            "type": "<ALPHANUM>",
            "position": 10
        },
        {
            "token": "你",
            "start_offset": 21,
            "end_offset": 22,
            "type": "<IDEOGRAPHIC>",
            "position": 11
        },
        {
            "token": "是",
            "start_offset": 22,
            "end_offset": 23,
            "type": "<IDEOGRAPHIC>",
            "position": 12
        },
        {
            "token": "oh",
            "start_offset": 23,
            "end_offset": 25,
            "type": "<ALPHANUM>",
            "position": 13
        },
        {
            "token": "我",
            "start_offset": 26,
            "end_offset": 27,
            "type": "<IDEOGRAPHIC>",
            "position": 14
        },
        {
            "token": "说",
            "start_offset": 27,
            "end_offset": 28,
            "type": "<IDEOGRAPHIC>",
            "position": 15
        },
        {
            "token": "yeah",
            "start_offset": 28,
            "end_offset": 32,
            "type": "<ALPHANUM>",
            "position": 16
        }
    ]
}

我们可以看到标准分词器,标点符号是抛弃了的,中文是单个字,英文,大写会转小写。

复制代码
{
    "tokens": [
        {
            "token": "happy",
            "start_offset": 0,
            "end_offset": 5,
            "type": "word",
            "position": 0
        },
        {
            "token": "happy",
            "start_offset": 6,
            "end_offset": 11,
            "type": "word",
            "position": 1
        },
        {
            "token": "你是oh",
            "start_offset": 12,
            "end_offset": 16,
            "type": "word",
            "position": 2
        },
        {
            "token": "我说",
            "start_offset": 17,
            "end_offset": 19,
            "type": "word",
            "position": 3
        },
        {
            "token": "don",
            "start_offset": 20,
            "end_offset": 23,
            "type": "word",
            "position": 4
        },
        {
            "token": "t",
            "start_offset": 24,
            "end_offset": 25,
            "type": "word",
            "position": 5
        },
        {
            "token": "yeah",
            "start_offset": 26,
            "end_offset": 30,
            "type": "word",
            "position": 6
        }
    ]
}

七、IK中文分词器

IK 分词器是 Elasticsearch 中最流行的中文分词器插件

1.官网及安装方式

Github:

https://github.com/medcl/elasticsearch-analysis-ik

下载:

https://github.com/infinilabs/analysis-ik/releases

https://release.infinilabs.com/analysis-ik/stable/

我打算下载个新的,看看。但是不行哈。

在选择Elasticsearch IK分词器版本时,‌必须确保其与Elasticsearch的主版本号完全一致‌,这是保证插件正常加载和稳定运行的首要前提。 ‌

IK分词器的版本号与Elasticsearch版本号严格绑定,例如:

  • Elasticsearch 7.6.2 需搭配 ik-7.6.2.zip
  • Elasticsearch 8.4.3 需搭配 ik-8.4.3.zip
  • Elasticsearch 8.17.3 需搭配 ik-8.17.3.zip ‌16

若版本不匹配,Elasticsearch在启动时将因插件校验失败而无法正常运行。 ‌

2.安装ik

在es路径下加一个plugins/ik,将下载的ik包解压后放进去。

路径不能错,启动命令中的挂载地址:

重新启动es


报了个错:

, "message": "error updating geoip database [GeoLite2-City.mmdb]", "cluster.uuid": "aOAcG6bXTEuvQoj8yXLPWg", "node.id": "a3IlBEsPQs-uMspZnLy4zg" , "stacktrace": ["java.net.SocketTimeoutException: Connect timed out", "at sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:546) ~[?:?]", "at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:592) ~[?:?]", "at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?]", "at java.net.Socket.connect(Socket.java:751) ~[?:?]", "at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304) ~[?:?]", "at sun.net.NetworkClient.doConnect(NetworkClient.java:178) ~[?:?]", "at sun.net.www.http.HttpClient.openServer(HttpClient.java:531) ~[?:?]", "at sun.net.www.http.HttpClient.openServer(HttpClient.java:636) ~[?:?]", "at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) ~[?:?]", "at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:377) ~[?:?]", "at

我在配置文件中,增加

复制代码
ingest.geoip.downloader.enabled: false

3.两种分词模式

模式 算法特点 分词 粒度 示例 "我们是社会主义接班人" 输出结果 优点 缺点 适用场景
ik_smart 最小切分算法 粗粒度 ["我们", "是", "社会主义", "接班人"] 1. 词典匹配最优路径 2. 分词数量少 3. 语义完整性好 1. 搜索精度高 2. 索引体积小 3. 查询速度快 1. 可能漏掉长词 2. 召回率较低 搜索场景 • 用户查询分词 • 搜索建议 • 精准匹配
ik_max_word 最细粒度切分 细粒度 ["我们", "是", "社会", "社会主义", "主义", "接班", "接班人"] 1. 穷举所有可能分词 2. 覆盖所有词汇 3. 分词数量多 1. 召回率高 2. 覆盖全面 3. 不漏词 1. 索引体积大 2. 查询噪声多 3. 性能开销大 索引场景 • 文档内容索引 • 全文检索 • 高召回需求

4.接口工具测试

复制代码
{
    "tokens": [
        {
            "token": "你",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "是",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "happy",
            "start_offset": 3,
            "end_offset": 8,
            "type": "ENGLISH",
            "position": 2
        },
        {
            "token": "我",
            "start_offset": 9,
            "end_offset": 10,
            "type": "CN_CHAR",
            "position": 3
        },
        {
            "token": "的",
            "start_offset": 10,
            "end_offset": 11,
            "type": "CN_CHAR",
            "position": 4
        },
        {
            "token": "最爱",
            "start_offset": 11,
            "end_offset": 13,
            "type": "CN_WORD",
            "position": 5
        },
        {
            "token": "精神食粮",
            "start_offset": 13,
            "end_offset": 17,
            "type": "CN_WORD",
            "position": 6
        }
    ]
}
相关推荐
186******205312 小时前
项目开发基础知识:从概念到落地的全流程指南
大数据·人工智能
说私域2 小时前
AI智能名片商城小程序数据清洗的持续运营策略与实践研究
大数据·人工智能·小程序·流量运营·私域运营
Howie Zphile2 小时前
Git 拉 NocoBase 2.0 beta(next 分支),并“每天自动更新 + 自动编译 + 自动重启”
大数据·git·elasticsearch
sunshine8852 小时前
合规性管理:财务安全与业务连续性的双重保障
大数据·运维·人工智能
lusasky2 小时前
Claude Code v2.1.0+ 版本集成LSP
大数据·数据库·人工智能
历程里程碑3 小时前
子串----和为K的子数组
大数据·python·算法·leetcode·elasticsearch·搜索引擎·哈希算法
Kratzdisteln3 小时前
【1902】process_assignment_pdf()
大数据·人工智能·pdf
wxl7812273 小时前
2026年人工智能发展趋势:效率重构、生态协同与规范前行
大数据·人工智能·重构
九河云3 小时前
数字韧性时代,华为云CBR为业务连续性注入“免疫基因”
大数据·人工智能·安全·机器学习·华为云