Elasticsearch
是一个基于的,是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息等,而文档数据会被序列化为json格式后存储在ELasticsearch中:而json文档中往往包含很多的字段(Field),类似于数据库中的列。支持(搜索文章、日志、商品等)支持(JSON 文档形式)支持(类似数据库的分组统计):可以横向扩展,适合大规模数据。Logstash / Beats(采集)、K
一.什么是Elasticsearch?如何通过倒排索引查找数据?
Elasticsearch (简称 ES) 是一个基于 Lucene 的 分布式搜索引擎,是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息等,而文档数据会被序列化为json格式后存储在ELasticsearch中:

而json文档中往往包含很多的字段(Field),类似于数据库中的列。
特点:
-
支持 全文检索(搜索文章、日志、商品等)
-
支持 结构化数据存储(JSON 文档形式)
-
支持 分析与聚合(类似数据库的分组统计)
-
高可扩展:可以横向扩展,适合大规模数据。
生态:Logstash / Beats(采集)、Kibana(可视化)、Elastic APM(性能监控)、Fleet/Agent(统一管理)。
与关系型数据库(RDBMS)的差异:ES 更像“搜索与分析数据库”,不支持事务与强一致 ACID,但在搜索、全文、聚合与大规模横向扩展上表现出色。
核心概念:

我们将Mysql与Elasticsearch进行统一对比:
|
MySQL |
Elasticsearch |
说明 |
|---|---|---|
|
Table |
Index |
索引(index),就是文档的集合,类似数据库的表(table) |
|
Row |
Document |
文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
|
Column |
Field |
字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
|
Schema |
Mapping |
Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
|
SQL |
DSL |
DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
Mysql主要擅长事务类型操作,可以确保数据的安全和一致性;而Elasticsearch擅长对海量数据的搜索、分析、计算。
所以经过上面内容分析,我们在淘宝中搜索商品等场景可以使用Elasticsearch这个技术,而这个技术主要使用倒排索引查找内容:

如下图:



二.下载安装Elasticsearch与Kibana:
Elasticsearch下载链接:Download Elasticsearch | Elastic
https://www.elastic.co/downloads/elasticsearch
首先拉取 elasticsearch 与 kibana 镜像:
docker pull elasticsearch:8.17.1
docker pull kibana:8.17.1
随后创建并且启动容器:
# 1、创建文件目录
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
# 2、配置文件(这里的host: 0.0.0.0 中间是有空格的。如果无,启动失败)
echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml
# 还需要在/mydata/elasticsearch/config/elasticsearch.yml内写入关闭安全设置
# 关闭安全认证和 TLS
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
# 3、创建启动(外部文件映射)
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:8.17.1
之后需要赋予文件权限:
chown -R 700:700 /mydata/elasticsearch/data
随后重启 Elasticsearch:
docker restart elasticsearch
随后访问:http://虚拟机IP地址:9200/

随后可以通过postman使用Get测试:http://虚拟机IP地址:9200/_cat/nodes

由于开发中主要使用kibana通过api对elasticsearch进行索引和搜索操作,所以我们使用下面命令创建Kibana:(注意!!!更换自己的虚拟机IP地址)
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.88.138:9200 -p 5601:5601 \
-d kibana:8.17.1
随后访问 http://192.168.88.138:5601/app/home#/?_g=0

三.在Springboot项目中使用Elasticsearch:
在开始集成前,必须确保 Spring Data Elasticsearch、Elasticsearch 服务器和 SpringBoot 版本兼容:
| SpringBoot 版本 | Spring Data Elasticsearch 版本 | Elasticsearch 版本 |
|---|---|---|
| 2.7.x | 4.4.x | 7.17.x |
| 3.0.x | 5.0.x | 8.5.x |
| 3.1.x | 5.1.x | 8.7.x |
|
3.2.x |
5.2.x |
9.5.x |
|
3.3.x |
5.3.x |
9.8.x |
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Data Elasticsearch 8 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
随后编写 application.yml 配置文件:
spring:
elasticsearch:
uris: http://192.168.88.138:9200 # ES 地址
⚠️ 注意:
-
Elasticsearch 8.x 默认开启 安全认证(用户名/密码),安装时你会看到
elastic用户和初始密码。 -
如果你关闭了安全认证,可以不用写
username/password。
随后编写实体类来映射ES索引:
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "article") // 索引名:article
public class Article {
@Id
private String id; // 文档ID
private String title;
private String content;
public Article() {}
public Article(String id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
// getter/setter
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
}
更多推荐



所有评论(0)