ElasticSearch讲解-基础安装篇
ElasticSearch讲解-基础安装篇
概念
开源分布式搜索引擎
基于Lucene(Java语言的搜索引擎类库,Apache公司)实现
Lucene只限于java语言开发,ES基于Lucene封装,提供Restful接口,可被任何语言调用
ES涉及到:
- 搜索引擎数据库
- 全文搜索、日志分析、实时分析
- 分词器
- 倒排索引
简单来说,ES就是能帮助我们在数据库中快速检索到指定内容,底层也就是因为倒排索引的存在
各种模糊查询、搜索栏等都会用到ES
ELK技术栈
ELK:ElasticSearch + Kibana + Logstash + Beats
ELK广泛用于日志数据分析、实时监控等领域
| 层级 | 组件 | 角色 | 主要功能 |
|---|---|---|---|
| 采集层 | Beats | 轻量级数据采集器 | 收集日志、指标、网络数据等 |
| 处理层 | Logstash | 数据流水线处理器 | 过滤、解析、转换、丰富数据 |
| 存储层 | Elasticsearch | 分布式搜索分析引擎 | 存储、索引、搜索、分析数据 |
| 展示层 | Kibana | 数据可视化平台 | 图表展示、仪表盘、数据探索 |
Beats + Logstash获取数据,存入ES
Kibana根据ES中的数据生成可视化界面
扩展部分:
Beats
├── Filebeat(日志文件采集)
├── Metricbeat(系统指标采集)
├── Packetbeat(网络数据采集)
├── Heartbeat(服务可用性监控)
├── Auditbeat(审计数据采集)
└── Winlogbeat(Windows事件日志)
输入 → 过滤器 → 输出
├── 输入插件:Beats, Kafka, File, HTTP
├── 过滤插件:Grok, Mutate, Date, GeoIP
└── 输出插件:Elasticsearch, Kafka, Email
Elasticsearch 集群
├── 节点管理
├── 分片与副本
├── 索引管理
└── 搜索分析
Kibana 功能模块
├── Discover(数据探索)
├── Visualize(图表可视化)
├── Dashboard(仪表盘)
├── Canvas(实时数据展示)
└── Machine Learning(机器学习)
Elastic Stack(更详细)
├── [Beats] - 数据采集
├── [Logstash] - 数据处理
├── [Elasticsearch] - 数据存储与搜索
├── [Kibana] - 数据可视化
├── [APM] - 应用性能监控
├── [Machine Learning] - 机器学习
└── [Security] - 安全分析
正向索引
mysql中的中即正向索引
如果使用mysql来实现检索、模糊查询等
就会对表进行一行行判断是否符合需要,符合则放入结果集
但mysql中模糊查询通常会(如果模糊查询中固定开头,则索引有效)导致索引失效,因此走全表扫描,效率极低
倒排索引
ES中为了加快检索速度,因此引入倒排索引
概念:
先将存入的文档分割成词条,然后构成具有倒排索引的表
文档:mysql中的行,相当于ES中的文档
词条:根据文档进行分词得到词条
倒排索引:创建表存储词条和有着该词条的所有文档id,并根据词条创建索引,即倒排索引
那么查询时,只需要将用户的查询条件也分词,然后去表中找到对应的词条,输出所有的文档id即可
这种方式和使用大模型时配置rag有点类似:先将知识转为向量(词条)存入向量库(存词条和文档id的表)
再将用户输入内容(用户查询条件)转为向量(词条),再去向量库匹配对应的知识(去表中匹配文档id)
最后将知识和用户输入内容一起交给大模型处理
ES结构
文档:ES中的文档对应mysql中的一行数据,每个文档对应一个Json
字段:Json中的字段,相当于mysql中的列
索引:ES中相同类型文档的集合,相当于mysql中的表
映射:ES索引中对文档的字段的约束,相当于mysql中的表结构约束
DSL:ES提供的Json风格的请求语句,用于操作ES,实现CRUD,即mysql中的sql
但我们并不直接使用DSL,而是使用ES提供的RestAPI,也就是基于DSL封装好的
Mysql:擅长事务类型操作,可确保数据的安全和一致性
ES:擅长海量数据的检索、分析、计算
安装
es&kibana
kibana是可视化界面,让kibana连接上es后,我们可以在kibana中直接编写DSL,来操作kibana绑定的es
首先获取es、kibana的镜像,可以通过podman Desktop快速下载(需要先下载podman Desktop并配置podman machine、WSL2、podman)
然后启动es、kibana作为容器,并确保他们容器网络互联
因为要配置网络环境,用Podman Desktop反而不好做,因此用命令实现:
# 创建一个网络环境
podman network create es-kibana-net
# 启动 Elasticsearch
podman run -d \
--name elasticsearch \
--network es-kibana-net \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "xpack.security.enabled=false" \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/elasticsearch:8.11.3 # 明确指定标签
# 启动 Kibana
podman run -d \
--name kibana \
--network es-kibana-net \
-p 5601:5601 \
-e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" \
docker.m.daocloud.io/kibana:8.11.3
容器启动后访问端口:
ES:9200
kibana:5601
先访问ES,确保返回Json数据

再访问kibana,kibana会去连接ES,若出现可视化界面,则成功:

IK分词器
接下来需要安装IK分词器(解决中文分词的问题,否则默认是每个汉字都被分为一个词条)
方法一:
进入到ES容器
podman exec -it elasticsearch /bin/bash
下载:
# 注意:版本号要和 ES 完全一致
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.11.3/elasticsearch-analysis-ik-8.11.3.zip
然后重启容器即可
# 退出容器
exit
# 重启 ES 容器
podman restart elasticsearch
方法二:
因为网络问题,容器无法直接连接github,因此我们可以通过steam++加速来访问github,手动下载压缩包,然后导入到容器内部
# 将 ZIP 包复制到容器内插件目录(从WSL复制到ES容器中)
podman cp /mnt/c/Users/shany/Downloads/elasticsearch-analysis-ik-8.11.3.zip elasticsearch:/usr/share/elasticsearch/plugins/
# 进入容器解压、重启
podman exec -it elasticsearch bash
cd /usr/share/elasticsearch/plugins/
mkdir ik && unzip elasticsearch-analysis-ik-8.11.3.zip -d ik
rm -f elasticsearch-analysis-ik-8.11.3.zip
exit
podman restart elasticsearch
重启后,通过 Kibana 的 Dev Tools 来验证 IK 分词器是否已成功加载
执行以下命令:
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "我爱北京天安门"
}
如果返回的结果是分词后的数组(如 ["我", "爱", "北京", "天安门"]),则说明 IK 分词器已经成功安装并可以正常使用了
如图:

关于IK分词器,如上图
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "我爱北京天安门"
}
这里的analyzer可选:
- ik_max_word(粒度更小,存储压力更大,重复多)
- ik_smart(粗粒度)
IK分词器会依赖字典来进行分词,如果不配置字典,那么很多特定词语、网络用语等都无法被IK分词器识别到(字典扩展)
同时也可能需要禁用敏感词汇(字典禁用)
对于字典的操作只需要修改IK分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:
<!-- 扩展字典 -->
<entry key="ext_dict">ext.dic</entry>
<!-- 禁用字典 -->
<entry key="ext_stopwords">stopword.dic</entry>
使用
黑马教程
ES官方提供不同语言的客户端来操作ES,这些客户端也就是封装了DSL语句,通过http请求(RestAPI)发送给ES
其中Java Rest Client包括:
- Java Low Level Rest Client
- Java High Level Rest Client(RestHighLevelClient)等
项目中要使用需要有ES、Mysql、Kibana,配置好相关信息后
引入RestHighLevelClient(客户端)
我们通过调用客户端提供的API,来操作ES
但注意,RestHighLevelClient只适用于ES 7.x 及之前,我此时使用ES 8.11.3
ES 8.x 及以后要使用新的客户端:Elasticsearch Java Client(ES官方提供的)
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
</dependency>
当前项目是springboot,因此不需填写版本号
Spring官方
以上我是在看黑马教程中了解到的,但或许我们可以直接用下面的方式(Spring官方提供的):
使用Spring官方基于elasticsearch-java再度封装的:
如果使用上面的elasticsearch-java,就需要手动创建配置类来创建和配置客户端,然后直接调用客户端RestAPI
用下面的就可以像使用redis一样,直接拿到客户端ElasticsearchRestTemplate,底层还是RestAPI,但Spring封装后更方便
用下面的则只需要配置yml不用配置类
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
spring:
elasticsearch:
uris: http://localhost:9200
# 如果有认证
username: elastic
password: your_password
# 连接超时设置
connection-timeout: 10s
socket-timeout: 30s
其次,需要确保springboot中定义的ES的版本和我们自己安装的ES版本对应,若不对应,则需要显示覆盖
<properties>
<!-- 强制指定 ES 版本与我们实际安装的服务端一致 -->
<elasticsearch.version>8.11.3</elasticsearch.version>
</properties>
简单来说
如果你想熟悉底层、自定义配置、非spring项目,可以用RestHighLevelClient或elasticsearch-java(看你的ES版本)
如果你只想快速使用,则spring-boot-starter-data-elasticsearch更方便(Spring基于elasticsearch-java封装)
有了spring-boot-starter-data-elasticsearch和yml,我们就可以直接在需要的位置自动注入ElasticsearchRestTemplate来操作ES
但还有另一种方法:使用Repository
直接使用ElasticsearchRestTemplate 和 使用Repository,这两种方式看起来可能不太好理解
但其实就是类似Mybaits 和 Mybaits-plus
前者手动写SQl
后者通过指定实体类后自动生成crud等简单方法,可以直接调用方法操作Mysql
特性 ElasticsearchRestTemplate Repository 编程风格 类似 MyBatis 类似 MyBatis-Plus 使用方式 手动构建查询 方法名自动生成查询 灵活性 ⭐⭐⭐⭐⭐ ⭐⭐⭐ 开发效率 ⭐⭐⭐ ⭐⭐⭐⭐⭐ 学习成本 较高 较低 适用场景 复杂查询、聚合、自定义逻辑 简单CRUD、标准查询
Java应用
↓
Repository 或 ElasticsearchRestTemplate(使用方法)
↓
Elasticsearch Java Client (elasticsearch-java,ES官方客户端)
↓
HTTP REST API (端口9200)
↓
Elasticsearch 服务端
| 方法名自动生成查询 |
| 灵活性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 开发效率 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 学习成本 | 较高 | 较低 |
| 适用场景 | 复杂查询、聚合、自定义逻辑 | 简单CRUD、标准查询 |
Java应用
↓
Repository 或 ElasticsearchRestTemplate(使用方法)
↓
Elasticsearch Java Client (elasticsearch-java,ES官方客户端)
↓
HTTP REST API (端口9200)
↓
Elasticsearch 服务端
更多推荐


所有评论(0)