第 6 章:Elasticsearch 入门
学习目标
- 理解 ES 是什么、能做什么
- 启动 ES + Kibana
- 掌握 Index / Document / Mapping 基本概念
- 用 Spring Boot 集成 ES
一、Elasticsearch 是什么
Elasticsearch(ES)是一个分布式全文搜索引擎,底层基于 Lucene,常用于:
- 站内搜索(商品、文章)
- 日志分析(ELK)
- APM / 监控数据存储
- 向量检索(AI 时代新场景)
和 MySQL 的对比:
| MySQL | Elasticsearch |
|---|---|
| Database | Index |
| Table | Index(同义词) |
| Row | Document |
| Column | Field |
| Schema | Mapping |
| 事务 | 不支持事务 |
| 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 等 JSONKibana(可视化)
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 |
动手练习
- 用 Docker 启动 ES + Kibana
- 创建
articlesindex,插入 3 篇文档,用_search?q=Java查 - 用 Spring Boot 写一个
ArticleRepository,实现按标题模糊查询
下一章:第 7 章:ES 索引与映射 →