一、索引的生命周期操作 (CRUD与配置)
1. 创建索引 (Create)
创建索引是定义数据蓝图的第一步。最佳实践是始终在创建时显式指定 Mapping 和 Settings,而不是依赖动态映射。
基础命令:
bash
PUT /my_first_index
这将创建一个使用所有默认配置(1个主分片,1个副本)的索引。
高级创建(架构师推荐方式):
bash
# 创建一个用于文章搜索的索引,明确指定 settings 和 mappings
PUT /article_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "1s"
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word", # 使用中文分词器
"search_analyzer": "ik_smart"
},
"author": {
"type": "keyword" # 用于精确匹配和聚合
},
"publish_date": {
"type": "date"
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
},
"word_count": {
"type": "integer"
}
}
}
}
返回值解读: { "acknowledged" : true, "shards_acknowledged" : true, "index" : "article_index" }
表示创建成功。
2. 查询索引信息 (Read)
-
查看单个索引的详细信息(Mapping + Settings):
bashGET /article_index
-
仅查看索引的 Mapping:
bashGET /article_index/_mapping
-
仅查看索引的 Settings(包含默认值):
bashGET /article_index/_settings
-
查看多个索引的信息:
bashGET /article_index,another_index/_settings
-
查看所有索引(常用于健康检查):
bash# 查看所有索引的状态、分片、文档数等概览信息 GET _cat/indices?v
输出示例:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open article_index 7y4XjW0rQa6X4EiD7 3 1 0 0 1.1kb 1.1kb
3. 修改索引配置 (Update)
注意: 并非所有配置都可修改。number_of_shards
和大多数静态设置一经创建就无法更改。但一些动态设置可以实时修改,最常用的是调整副本数。
-
动态修改副本数: 在流量高峰时增加副本以提高读取吞吐量,在夜间减少副本以节省资源。
bashPUT /article_index/_settings { "number_of_replicas": 2 }
-
动态修改刷新间隔: 在进行大规模批量导入时,临时增大刷新间隔以提升写入性能。
bash# 导入开始前,暂停刷新 PUT /article_index/_settings { "refresh_interval": -1 } # ... 执行批量导入操作 (e.g., using _bulk API) ... # 导入完成后,恢复刷新 PUT /article_index/_settings { "refresh_interval": "1s" }
4. 删除索引 (Delete)
删除操作是不可逆的 ,会立即释放磁盘空间。执行此命令务必谨慎!
bash
DELETE /article_index
返回值: { "acknowledged" : true }
保护机制: 为了防止误删,可以通过设置 action.destructive_requires_name: true
(在 elasticsearch.yml
中)来禁止使用通配符(如 DELETE *
)或 _all
删除索引。
二、索引数据的操作 (文档CRUD)
索引的最终目的是存储和检索数据(文档)。
1. 写入/更新文档
-
指定文档ID写入 (Index API):
bashPUT /article_index/_doc/1 # 指定文档ID为1 { "title": "Elasticsearch 入门教程", "author": "张三", "publish_date": "2024-05-20", "content": "这是一篇关于ES的详细教程...", "word_count": 1000 }
-
不指定文档ID写入 (Create API): ES 会自动生成一个唯一 ID。
bashPOST /article_index/_doc/ { "title": "另一个文章", ... }
2. 查询文档
-
根据ID查询文档:
bashGET /article_index/_doc/1
-
复杂搜索 (Search API): 这是 ES 的核心功能。
bashGET /article_index/_search { "query": { "bool": { "must": [ { "match": { "title": "教程" } } ], "filter": [ { "range": { "word_count": { "gte": 500 } } } ] } }, "sort": [ { "publish_date": { "order": "desc" } } ], "from": 0, "size": 10 }
3. 删除文档
-
根据ID删除:
bashDELETE /article_index/_doc/1
-
根据查询条件删除 (Delete By Query API): 慎用! 它会删除所有匹配查询的文档。
bashPOST /article_index/_delete_by_query { "query": { "range": { "publish_date": { "lt": "2020-01-01" } } } }
三、高级运维与管理操作
1. 打开/关闭索引
-
关闭索引: 索引被关闭后,不再占用除磁盘空间外的任何资源(CPU、内存句柄),无法进行任何读写操作。常用于归档历史数据。
bashPOST /article_index/_close
-
打开索引:
bashPOST /article_index/_open
2. 索引别名 (Alias) 操作
别名是生产环境的必备特性,它提供了极大的灵活性。
-
创建别名:
bashPOST /_aliases { "actions": [ { "add": { "index": "article_index_2024_05", "alias": "current_articles" } } ] }
-
原子化操作:无缝切换别名指向(零停机维护)
这是别名最强大的功能。假设我们有一个新索引
article_index_2024_06
要上线,想将current_articles
别名从旧索引指向新索引。bashPOST /_aliases { "actions": [ { "remove": { # 先移除旧索引 "index": "article_index_2024_05", "alias": "current_articles" } }, { "add": { # 再添加新索引(这是一个原子操作) "index": "article_index_2024_06", "alias": "current_articles" } } ] }
你的应用程序始终访问
current_articles
,对后端的索引切换无感知。
3. 索引模板 (Index Template)
用于自动为匹配特定模式的新索引应用预定义的 Settings 和 Mappings。对于时序数据(如日志)至关重要。
bash
PUT _index_template/my_logs_template
{
"index_patterns": ["logs-*"], # 匹配所有以 `logs-` 开头的索引
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"refresh_interval": "30s"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"level": { "type": "keyword" },
"message": { "type": "text" }
}
}
},
"priority": 1
}
之后,当你创建 logs-app-2024.05.20
时,它会自动拥有模板中定义的配置。
4. 监控与维护
-
查看索引分片分配和状态:
bashGET _cat/indices/article_index?v&s=pri.store.size:desc&h=index,pri,rep,pri.store.size,status
-
强制段合并 (Force Merge): 将 Lucene 分段合并为更少、更大的段,可以显著提升查询速度并减少磁盘空间 。但这是一个 I/O 密集型操作,应在业务低峰期对只读索引(如历史归档索引)执行。
bashPOST /article_index/_forcemerge?max_num_segments=1
-
清理缓存:
bashPOST /article_index/_cache/clear
-
刷新 (Refresh) 与 冲洗 (Flush):
bash# 手动刷新,使当前已写入但未刷新的数据立即可搜 POST /article_index/_refresh # 手动执行flush,将内存中的translog数据持久化到磁盘 POST /article_index/_flush
总结:架构师的操作视角
对索引的操作远不止简单的增删改查。一个资深架构师的视角是:
- 设计先行 :在
PUT index
之前,就用纸笔或设计文档规划好 Mapping 和 Settings。 - 别名无处不在:所有应用程序都通过别名访问索引,为未来的数据迁移、索引重建和滚动升级留下余地。
- 自动化生命周期 :对日志、监控等时序数据,使用索引模板 (Index Template) + 滚动创建 (Rollover) + ILM 策略 实现全自动化管理。
- 运维可观测 :熟练使用
_cat
API 和监控工具(如 Kibana)来观察索引的健康度、性能和资源使用情况。 - 谨慎执行写操作 :
DELETE
、force_merge
、close
等操作具有破坏性或高开销,需有严格的审批或自动化流程。