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数据

image-20251125163716368

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

image-20251125163640889


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 分词器已经成功安装并可以正常使用了

如图:

image-20251125170635351

关于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

特性ElasticsearchRestTemplateRepository
编程风格类似 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 服务端

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐