一.什么是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 | Elastichttps://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

下面是官网地址:Elasticsearch 客户端 | Spring Data Elasticsearchhttps://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/clients.html

Spring Data Elasticsearch 中文文档 | Spring AI 中文文档https://www.spring-doc.cn/projects/spring-data-elasticsearch首先引入依赖:

<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; }
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐