Elasticsearch从基础到精通全指南
本文系统介绍了Elasticsearch(ES)的核心概念与实战应用。主要内容包括:基础概念(索引、文档、分片等组件解析)、环境搭建指南(单节点部署与Kibana配置)、CRUD操作示例(索引创建、文档增删改查)、进阶功能(自定义映射、分片优化)以及高级查询(布尔组合查询、聚合分析)和性能优化技巧(冷热分离、查询缓存)。通过架构图、配置示例和实战代码,帮助开发者快速掌握ES从入门到精通的完整知识体
·
一、ES基础概念(入门必懂)
1. 核心组件
| 组件 | 作用说明 | 类比关系 |
|---|---|---|
| 索引(Index) | 存储相似结构数据的集合(非关系型表) | 类似MySQL的Database |
| 文档(Document) | 索引中的最小数据单元(JSON格式) | 类似MySQL的Row |
| 字段(Field) | 文档中的属性 | 类似MySQL的Column |
| 分片(Shard) | 索引的拆分单元(水平扩展) | 类似数据库分表 |
| 副本(Replica) | 分片的备份(高可用+负载均衡) | 类似数据备份 |
2. 核心架构图(简化版)
二、ES基础使用(上手实操)
1. 环境搭建(以7.17版本为例)
(1)单节点部署(Windows)
- 下载安装包:ES官网
- 解压后修改配置(config/elasticsearch.yml):
cluster.name: my-first-cluster # 集群名 node.name: node-1 # 节点名 network.host: 0.0.0.0 # 允许外部访问 http.port: 9200 # HTTP端口 discovery.type: single-node # 单节点模式 - 启动:双击bin/elasticsearch.bat
- 验证:访问
http://localhost:9200,返回如下表示成功:{ "name" : "node-1", "cluster_name" : "my-first-cluster", "version" : { "number" : "7.17.0" } }
(2)可视化工具(Kibana)
- 下载对应版本Kibana,修改config/kibana.yml:
elasticsearch.hosts: ["http://localhost:9200"] # 关联ES地址 - 启动后访问
http://localhost:5601,进入Dev Tools(控制台)操作ES。
2. 基础CRUD操作(用Kibana控制台)
(1)创建索引(Index)
PUT /user_index # 索引名(小写)
{
"settings": {
"number_of_shards": 1, # 主分片数(默认5,单节点建议1)
"number_of_replicas": 0 # 副本数(单节点建议0,否则报错)
}
}
(2)添加文档(Document)
POST /user_index/_doc/1 # 文档ID=1(不指定则自动生成)
{
"name": "张三",
"age": 25,
"gender": "男",
"address": "北京市朝阳区"
}
(3)查询文档
- 按ID查询:
GET /user_index/_doc/1 - 简单匹配查询(查地址含“北京”的用户):
GET /user_index/_search { "query": { "match": { "address": "北京" } } }
(4)修改/删除文档
# 修改(全量更新)
PUT /user_index/_doc/1
{
"name": "张三",
"age": 26, # 年龄从25改为26
"gender": "男",
"address": "北京市朝阳区"
}
# 删除
DELETE /user_index/_doc/1
三、ES进阶配置(功能深化)
1. 自定义映射(Mapping)
默认映射会自动识别字段类型,复杂场景需手动配置(如分词、日期格式):
PUT /article_index
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1,
"analysis": { # 自定义分词器(中文分词用ik)
"analyzer": {
"my_ik_analyzer": {
"type": "ik_max_word" # ik细粒度分词
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text", # 可分词文本(用于搜索)
"analyzer": "my_ik_analyzer",
"fields": {
"keyword": {
"type": "keyword", # 不分词(用于排序/聚合)
"ignore_above": 256
}
}
},
"content": { "type": "text", "analyzer": "my_ik_analyzer" },
"publish_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, # 自定义日期格式
"author": { "type": "keyword" }
}
}
}
映射配置图说明:article_index索引中,title字段同时支持“分词搜索”(text类型)和“精确匹配”(keyword子字段),publish_time指定日期格式避免解析错误,content用IK分词器适配中文搜索。
2. 分片与副本优化(集群场景)
(1)分片配置原则
- 单分片大小建议10-50GB(太大影响恢复速度)
- 分片数=节点数×1.5~3(避免分片不均)
(2)动态调整副本数(集群扩容后)
PUT /article_index/_settings
{
"number_of_replicas": 2 # 副本数从1改为2(提升可用性)
}
分片副本架构图:
subgraph 集群(3节点)
A[节点1] --> A1[article_index-分片0(主)]
A --> A2[article_index-分片1(副本)]
B[节点2] --> B1[article_index-分片1(主)]
B --> B2[article_index-分片0(副本)]
C[节点3] --> C1[article_index-分片0(副本)]
C --> C2[article_index-分片1(副本)]
四、ES高级实战(精通必备)
1. 复杂查询与聚合分析
(1)布尔查询(多条件组合)
查询“2023年发布且作者为‘李四’,内容含‘Elasticsearch’”的文章:
GET /article_index/_search
{
"query": {
"bool": {
"must": [ # 必须满足
{ "match": { "content": "Elasticsearch" } },
{ "term": { "author": "李四" } } # keyword类型用term查询(精确匹配)
],
"filter": [ # 过滤(不影响评分,性能更高)
{ "range": { "publish_time": { "gte": "2023-01-01 00:00:00" } } }
]
}
},
"sort": [ { "publish_time": { "order": "desc" } } ], # 按发布时间倒序
"from": 0, "size": 10 # 分页(第1页,10条/页)
}
(2)聚合分析(统计维度)
统计“每个作者的文章数量”并按数量排序:
GET /article_index/_search
{
"size": 0, # 不返回具体文档,只返回聚合结果
"aggs": {
"author_article_count": { # 聚合名称(自定义)
"terms": {
"field": "author", # 按author字段分组
"size": 10, # 返回前10个分组
"order": { "_count": "desc" } # 按数量倒序
}
}
}
}
聚合结果示意图:
| 作者 | 文章数量 |
|---|---|
| 李四 | 25 |
| 王五 | 18 |
| 张三 | 12 |
2. 性能优化技巧
(1)索引层优化
- 冷热分离:将历史数据(冷数据)迁移到低配置节点,热数据用高配置节点
- 关闭无用功能:如不需要实时统计,关闭
fielddata:"properties": { "unused_field": { "type": "text", "fielddata": false # 关闭fielddata } }
(2)查询层优化
- 优先用
filter代替must(filter结果缓存,不计算评分) - 避免通配符开头查询(如
*search,会导致全表扫描) - 大结果集用
scroll或search_after(替代深分页from/size)
3. 集群监控与故障处理
(1)集群健康检查
GET /_cluster/health
# 健康状态:green(所有分片可用)> yellow(副本不可用)> red(主分片不可用)
(2)节点故障转移
当主节点故障时,ES会自动从候选节点(node.master: true)中选举新主节点,配置候选节点:
# elasticsearch.yml
node.master: true # 允许成为主节点候选
node.data: true # 同时作为数据节点(小规模集群推荐)
node.ingest: true # 允许处理数据预处理
五、学习路径总结
- 入门阶段:掌握基础概念→完成单节点部署→熟练CRUD操作
- 进阶阶段:自定义映射→分片副本配置→复杂查询(布尔/范围查询)
- 精通阶段:聚合分析→性能优化→集群管理→故障处理
建议按“实操→问题→解决”的循环学习,比如先尝试搭建集群,遇到分片分配错误时,再回头深入理解分片副本机制。
更多推荐
所有评论(0)