【Java】Elasticsearch详解与Java实战应用
前言
Elasticsearch(简称ES)是一个基于Lucene的分布式搜索和分析引擎,以其强大的全文检索能力、实时性、可扩展性而广受欢迎。本文将全面介绍Elasticsearch的核心概念、使用方法,以及在Java项目中的集成和实战应用,帮助您快速掌握ES的开发技能。
1. Elasticsearch基础概念
1.1 什么是Elasticsearch
Elasticsearch是一个开源的分布式搜索和分析引擎,具有以下特点:
- 分布式:支持集群部署,自动分片和副本
- 实时性:近实时搜索和分析
- RESTful API:通过HTTP接口操作
- 全文检索:基于Lucene,支持复杂的搜索查询
- JSON文档:使用JSON格式存储数据
- 高可用:自动故障转移和恢复
1.2 核心概念
与关系型数据库的对比
| Elasticsearch | MySQL | 说明 |
|---|---|---|
| Index(索引) | Database(数据库) | 数据的容器 |
| Type(类型,7.x已废弃) | Table(表) | 数据的分类 |
| Document(文档) | Row(行) | 一条数据记录 |
| Field(字段) | Column(列) | 数据的属性 |
| Mapping(映射) | Schema(模式) | 数据结构定义 |
| DSL查询 | SQL | 查询语言 |
基本概念详解
1. 索引(Index)
1 | 索引是文档的容器,类似于数据库 |
2. 文档(Document)
1 | { |
3. 映射(Mapping)
1 | { |
4. 分片(Shard)
- 主分片(Primary Shard):索引数据被分成多个分片
- 副本分片(Replica Shard):主分片的备份,提高可用性和查询性能
5. 节点(Node)
- 主节点(Master Node):管理集群状态
- 数据节点(Data Node):存储数据,执行搜索
- 协调节点(Coordinating Node):路由请求
1.3 数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| text | 全文检索字段,会分词 | 文章内容、商品描述 |
| keyword | 精确匹配字段,不分词 | 邮箱、ID、标签 |
| integer/long | 整数 | 年龄、数量 |
| float/double | 浮点数 | 价格、评分 |
| boolean | 布尔值 | 是否上架 |
| date | 日期 | 创建时间 |
| object | 对象 | 嵌套的JSON对象 |
| nested | 嵌套对象数组 | 订单明细 |
| geo_point | 地理位置 | 经纬度 |
2. Elasticsearch安装与配置
2.1 Docker安装(推荐)
1 | # 拉取Elasticsearch镜像 |
2.2 传统安装
Linux/macOS:
1 | # 下载 |
Windows:
1 | # 下载zip包并解压 |
2.3 配置文件(elasticsearch.yml)
1 | # 集群名称 |
3. RESTful API基础操作
3.1 索引操作
创建索引:
1 | # 创建索引 |
查看索引:
1 | # 查看所有索引 |
删除索引:
1 | DELETE http://localhost:9200/user_index |
3.2 文档操作
创建文档:
1 | # 指定ID创建 |
查询文档:
1 | # 根据ID查询 |
更新文档:
1 | # 全量更新(覆盖) |
删除文档:
1 | DELETE http://localhost:9200/user_index/_doc/1 |
3.3 批量操作
1 | # 批量操作 |
4. 查询DSL
4.1 基础查询
查询所有(match_all):
1 | GET /user_index/_search |
精确匹配(term):
1 | GET /user_index/_search |
全文检索(match):
1 | GET /user_index/_search |
多字段查询(multi_match):
1 | GET /user_index/_search |
4.2 复合查询
布尔查询(bool):
1 | GET /user_index/_search |
布尔查询说明:
must:必须匹配,影响评分filter:必须匹配,不影响评分(性能更好)should:可选匹配,影响评分must_not:必须不匹配,不影响评分
4.3 范围查询
1 | GET /product_index/_search |
4.4 模糊查询
前缀查询(prefix):
1 | GET /user_index/_search |
通配符查询(wildcard):
1 | GET /user_index/_search |
模糊查询(fuzzy):
1 | GET /user_index/_search |
4.5 排序、分页、高亮
1 | GET /user_index/_search |
4.6 聚合查询
统计聚合:
1 | GET /product_index/_search |
分组聚合:
1 | GET /product_index/_search |
5. Java客户端集成
5.1 添加依赖
Maven依赖(Spring Boot):
1 | <dependencies> |
5.2 配置文件
application.yml:
1 | spring: |
5.3 配置类
1 | import co.elastic.clients.elasticsearch.ElasticsearchClient; |
5.4 实体类
1 | import lombok.Data; |
5.5 Repository接口
1 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; |
5.6 Service层实现
1 | import co.elastic.clients.elasticsearch.ElasticsearchClient; |
5.7 分页结果类
1 | import lombok.AllArgsConstructor; |
5.8 Controller层
1 | import lombok.RequiredArgsConstructor; |
6. 中文分词器(IK Analyzer)
6.1 安装IK分词器
1 | # 进入ES容器 |
6.2 IK分词器使用
两种分词模式:
- ik_max_word(最细粒度):会将文本做最细粒度的拆分
- ik_smart(智能分词):会做最粗粒度的拆分
测试分词:
1 | # ik_max_word |
6.3 自定义词典
创建自定义词典文件:
1 | # 进入IK配置目录 |
添加自定义词:
1 | 弹幕 |
配置IK:
1 | <!-- IKAnalyzer.cfg.xml --> |
7. 实战案例
7.1 商品搜索系统
商品实体类:
1 |
|
商品搜索Service:
1 |
|
搜索DTO:
1 |
|
7.2 日志分析系统
1 |
|
8. 性能优化
8.1 索引优化
1. 合理设置分片数:
1 | // 小索引:1-2个分片 |
2. 禁用不需要的功能:
1 | PUT /my_index |
3. 使用批量操作:
1 | // 批量索引,提高性能 |
8.2 查询优化
1. 使用filter代替query:
1 | // filter不计算评分,性能更好 |
2. 使用term查询代替match:
1 | // keyword字段使用term查询 |
3. 限制返回字段:
1 | GET /my_index/_search |
8.3 硬件优化
1. 内存配置:
1 | # 堆内存设置为物理内存的50%,最大不超过32GB |
2. 使用SSD:
1 | SSD比HDD快10-100倍 |
3. 增加节点:
1 | 水平扩展:增加数据节点 |
9. 监控与运维
9.1 集群健康检查
1 | # 查看集群健康状态 |
9.2 常用监控指标
1 |
|
9.3 备份与恢复
1 | # 创建快照仓库 |
10. 最佳实践
10.1 索引设计
合理规划索引结构
- 避免过度分片
- 使用别名管理索引
- 定期清理旧数据
选择合适的数据类型
- 精确匹配用keyword
- 全文检索用text
- 数值范围查询用数值类型
优化映射配置
- 禁用不需要的功能
- 合理设置分词器
- 使用动态模板
10.2 查询优化
使用合适的查询类型
- 精确匹配用term
- 全文检索用match
- 多条件用bool
利用缓存
- filter查询会被缓存
- 常用查询使用filter
分页优化
- 深度分页使用scroll或search_after
- 避免使用from+size进行深度分页
10.3 安全建议
启用安全认证
1
2xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true设置访问控制
1
2
3
4
5
6# 创建用户
POST /_security/user/my_user
{
"password": "password",
"roles": ["my_role"]
}限制网络访问
1
network.host: 127.0.0.1 # 只允许本地访问
11. 总结
11.1 关键要点
| 主题 | 要点 |
|---|---|
| 核心概念 | Index、Document、Mapping、Shard |
| 数据类型 | text、keyword、数值、日期等 |
| 查询DSL | match、term、bool、range、聚合 |
| Java集成 | Spring Data ES、Elasticsearch Java Client |
| 中文分词 | IK Analyzer(ik_max_word、ik_smart) |
| 性能优化 | 批量操作、filter查询、合理分片 |
| 监控运维 | 健康检查、备份恢复、性能监控 |
11.2 学习建议
- 理解核心概念:索引、文档、映射、分片
- 掌握查询DSL:各种查询类型和组合
- 实践Java集成:Spring Boot + ES
- 学习性能优化:索引设计、查询优化
- 关注版本更新:ES更新较快,关注新特性
11.3 推荐资源
官方文档:
书籍:
- 《Elasticsearch权威指南》
- 《深入理解Elasticsearch》
- 《Elasticsearch实战》
在线资源:
工具:
- Kibana:数据可视化和管理
- Logstash:数据采集和处理
- Beats:轻量级数据采集器
参考资源
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Uwakeme!
评论



