Skip to content
第 6 章 ⏱ 12 分钟阅读

第 6 章:Elasticsearch 入门 ​

学习目标 ​

  • 理解 ES 是什么、能做什么
  • 启动 ES + Kibana
  • 掌握 Index / Document / Mapping 基本概念
  • 用 Spring Boot 集成 ES

一、Elasticsearch 是什么 ​

Elasticsearch(ES)是一个分布式全文搜索引擎,底层基于 Lucene,常用于:

  • 站内搜索(商品、文章)
  • 日志分析(ELK)
  • APM / 监控数据存储
  • 向量检索(AI 时代新场景)

和 MySQL 的对比:

MySQLElasticsearch
DatabaseIndex
TableIndex(同义词)
RowDocument
ColumnField
SchemaMapping
事务不支持事务
JOIN有限支持(嵌套/父子)

二、安装 ES ​

Docker 启动(推荐) ​

bash
docker run -d \
  --name es \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -e "xpack.security.enabled=false" \
  docker.elastic.co/elasticsearch/elasticsearch:8.11.0

验证 ​

bash
curl http://localhost:9200
# 返回 cluster_name、version 等 JSON

Kibana(可视化) ​

bash
docker run -d --name kibana \
  -p 5601:5601 \
  -e ELASTICSEARCH_HOSTS=http://es:9200 \
  docker.elastic.co/kibana/kibana:8.11.0

访问 http://localhost:5601。

⚠️ 坑 1:ES 8.x 默认开启 xpack 安全认证,Docker 单机测试必须 xpack.security.enabled=false 或额外配证书。 ⚠️ 坑 2:ES 对内存敏感,堆内存至少 -Xms 和 -Xmx 设成一样,避免动态扩容卡顿。

三、核心概念 ​

3.1 倒排索引 ​

ES 用倒排索引加速全文搜索:

text
文档:
  1: "我喜欢 Java"
  2: "Java 是最好的语言"

倒排索引:
  我   → [1]
  喜欢 → [1]
  Java → [1, 2]
  是   → [2]
  最好 → [2]
  的   → [2]
  语言 → [2]

查 "Java" 直接拿到 [1, 2],比 LIKE '%Java%' 快几个数量级。

3.2 Cluster / Node / Shard ​

  • Cluster:集群,多个 Node
  • Node:一个 ES 进程
  • Index:索引(逻辑概念)
  • Shard:分片,Index 物理上分 N 份,水平扩展
  • Replica:副本,每个 Shard 的备份,高可用

四、基础操作 ​

4.1 创建 Index ​

bash
PUT /articles
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

💡 三段拆解:

  • PUT /articles = 创建索引(已存在会报错)
  • number_of_shards: 3 = 主分片数 3,数据切成 3 份并行处理,提性能;创建后不可改
  • number_of_replicas: 1 = 每个主分片备份 1 份,保高可用;可动态调整

生产最小集群:1 副本至少 2 个节点;单节点开发要把副本数设 0,否则集群黄(YELLOW)。

文档路由:写入时按 _id 哈希决定落哪个分片;查询时协调节点把请求转发到所有分片,合并结果返回。

4.2 插入文档 ​

bash
POST /articles/_doc/1
{
  "title": "Redis 入门",
  "content": "Redis 是基于内存的 KV 数据库",
  "views": 100
}

⚠️ 坑 3:_id 不指定就自动生成 UUID;指定了就走"upsert"(已存在则覆盖)。

💡 _doc 是固定写法——ES 7.0+ 统一用 _doc 表示"文档类型"(旧版本的 type 概念已废弃)。路径里能变的只有索引名和文档 ID,_doc / _search / _bulk 等都是 ES API 规定的固定端点。

4.3 查询 ​

bash
GET /articles/_doc/1                    # 按 ID
GET /articles/_search?q=Redis           # 全文搜索

五、Spring Boot 整合 ​

依赖 ​

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置 ​

yaml
spring:
  elasticsearch:
    uris: http://localhost:9200
    username:                 # 单机无认证留空
    password:

实体 ​

java
@Document(indexName = "articles")              // ① 类级别:映射到 articles 索引(等价 PUT /articles)
@Data                                            // Lombok:自动生成 getter/setter/toString
public class Article {
    @Id                                          // ② 主键:对应 ES 文档的 _id,必须是包装类
    private String id;

    @Field(type = FieldType.Text,                // ③ Text=长文本,会分词(用于全文搜索)
           analyzer = "ik_max_word")             //    ik_max_word=中文 IK 分词(细粒度)
    private String title;

    @Field(type = FieldType.Text,                // ④ 同 title,中文内容分词
           analyzer = "ik_max_word")
    private String content;

    @Field(type = FieldType.Integer)             // ⑤ Integer=数值型,不分词,用于范围查询/排序/聚合
    private Integer views;
}

Repository ​

java
// ① 继承 ElasticsearchRepository<实体, ID类型>:自动拿到 CRUD 方法(save/findById/delete...)
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {

    // ② 方法名派生查询:findBy + 字段 + 条件关键字
    //    Spring Data 自动翻译成 ES 查询:title LIKE '%keyword%'
    List<Article> findByTitleContaining(String keyword);

    // ③ 范围查询:views > views 参数
    List<Article> findByViewsGreaterThan(Integer views);
}

⚠️ 坑 4:Spring Data Elasticsearch 的方法名查询有限制,复杂查询用 @Query 或 ElasticsearchOperations。

六、本章小结 ​

要点关键
ES 定位分布式全文搜索引擎,基于 Lucene
核心倒排索引 + 分片 + 副本
Docker 启动注意安全认证和内存配置
Spring 整合spring-boot-starter-data-elasticsearch
IK 分词中文搜索必备,默认 standard 效果差
Repository简单查询够用,复杂用 ES DSL

动手练习 ​

  1. 用 Docker 启动 ES + Kibana
  2. 创建 articles index,插入 3 篇文档,用 _search?q=Java 查
  3. 用 Spring Boot 写一个 ArticleRepository,实现按标题模糊查询

下一章:第 7 章:ES 索引与映射 →

本站基于 VitePress 构建 · 由 StackHub 团队维护