1. 从零到一:为什么我们需要掌握 Elasticsearch 的 curl 命令
如果你刚开始接触 Elasticsearch,打开 Kibana 的 Dev Tools 界面,看到那些简洁的 JSON 查询语句,可能会觉得一切都很美好。但当你需要写一个自动化脚本、在服务器上快速排查问题,或者在没有图形界面的环境下操作集群时,你就会立刻意识到,那些在 Dev Tools 里点一下就能执行的请求,背后到底是什么。没错,就是 HTTP 请求,而curl就是那个在命令行里帮你发送这些请求的“瑞士军刀”。
我见过不少开发者,对 Elasticsearch 的 DSL 语法很熟,但一离开 Kibana 就有点手足无措。他们知道要查询match某个字段,但不知道如何用命令行把这个请求发出去。这就像是一个优秀的厨师,只知道用高级灶具,却不会生火。掌握curl命令操作 Elasticsearch,本质上是在掌握与 ES 集群“直接对话”的能力。这份能力让你不依赖任何特定工具,在任何环境(生产服务器、CI/CD 流水线、Docker 容器)下都能自如地管理你的数据和集群。
更重要的是,curl命令是理解 Elasticsearch REST API 的绝佳途径。每一个在 Kibana 中执行的查询,都可以被“翻译”成一条curl命令。理解了这个,你就打通了从应用层到传输层的任督二脉。无论是调试一个复杂的聚合查询,还是编写一个备份脚本,抑或是集成到其他系统中,你都能心中有数。今天,我们就抛开所有图形界面,回归最本质的 HTTP,把 Elasticsearch 的常用curl操作命令彻底捋清楚。
2. 基础准备:你的 curl 与 Elasticsearch 环境
在开始挥舞curl这把利器之前,我们需要确保工具和环境就位。这不仅仅是安装,还包括一些关键的配置和理解,能让你在后续操作中少踩很多坑。
2.1 curl 工具本身:不止是能发请求
大多数 Linux/macOS 系统都预装了curl,Windows 10 及以上版本也可以在 PowerShell 或 WSL 中使用。首先,验证一下你的curl是否可用以及版本:
curl --version你需要关注的是它是否支持 HTTPS(这对于连接安全的 ES 集群至关重要)以及支持的协议列表。一个现代、功能完整的curl是基础。如果系统没有,安装也很简单:
- Ubuntu/Debian:
sudo apt update && sudo apt install curl - CentOS/RHEL:
sudo yum install curl - macOS: 通常已预装,或可通过
brew install curl安装更新版本。 - Windows: 推荐使用 Git for Windows 自带的 Git Bash,它包含了
curl;或者直接在 PowerShell 中安装。
2.2 Elasticsearch 的访问端点与认证
这是最容易出错的一步。你需要知道你的 Elasticsearch 服务在哪里,以及如何访问它。
确定地址和端口:默认情况下,一个本地启动的 Elasticsearch 的 HTTP 服务地址是
http://localhost:9200。如果你的 ES 运行在别的机器、使用了别的端口(比如 9201),或者是在 Docker 容器内,你需要相应地修改这个地址。例如,Docker 容器映射到宿主机的 9200 端口:http://localhost:9200;如果是远程服务器:http://your-server-ip:9200。处理认证(如果启用):从 Elasticsearch 8.0 开始,默认启用了安全特性,包括 HTTPS 和用户认证。这对于生产环境是好事,但对初学者可能是个障碍。如果你的集群启用了安全认证,你的
curl命令需要携带用户名和密码。- 基础认证(Basic Auth):这是最常见的方式。使用
-u参数。
系统会提示你输入密码(如果直接在命令中写明,密码会出现在历史记录中,有一定风险)。对于自动化脚本,你可能需要将密码放在环境变量或加密文件中。curl -u elastic:your_password http://localhost:9200
- 基础认证(Basic Auth):这是最常见的方式。使用
处理 HTTPS 和证书:如果 ES 使用了自签名证书(默认安全配置如此),
curl默认会拒绝连接,报错SSL certificate problem: self signed certificate。你有几种选择:- 使用
-k或--insecure参数:这会跳过证书验证。仅限测试环境,生产环境绝对不要用,因为它使连接面临中间人攻击风险。curl -k -u elastic:password https://localhost:9200 - 指定 CA 证书:这是正确的方式。你需要获取 Elasticsearch 生成的 CA 证书(通常在 ES 配置目录下,如
config/certs/http_ca.crt),然后在curl中使用它。curl --cacert /path/to/http_ca.crt -u elastic:password https://localhost:9200
- 使用
一个万能的测试命令,可以帮你确认以上所有配置是否正确,就是访问集群的根端点:
# 无安全版本 curl http://localhost:9200 # 有安全、自签名证书版本(测试用) curl -k -u elastic:your_password https://localhost:9200 # 有安全、指定证书版本(推荐) curl --cacert ./http_ca.crt -u elastic:your_password https://localhost:9200如果返回一个包含cluster_name、version等信息的 JSON,恭喜你,通道打通了。
2.3 让输出更可读:格式化 JSON 的必备技巧
Elasticsearch 的所有响应都是 JSON 格式。直接在命令行看压缩成一行的 JSON 简直是噩梦。我们有几种美化方法:
- 使用
curl的-s和-S参数组合:-s是静默模式(不显示进度条),-S是当有错误时显示错误信息。通常一起用:-sS。 - 管道到
jq工具:jq是一个强大的命令行 JSON 处理器。安装后(apt install jq/yum install jq/brew install jq),你可以轻松地格式化并提取字段。
那个curl -sS http://localhost:9200 | jq ..代表整个 JSON 对象,jq会把它漂亮地打印出来。你还可以用它做过滤,比如jq ‘.version.number’只查看版本号。 - 使用 Python 的
json.tool:如果系统没有jq,通常有 Python。curl -sS http://localhost:9200 | python -m json.tool # 或 python3 curl -sS http://localhost:9200 | python3 -m json.tool
从现在起,为了可读性,我们的示例命令会假设你使用了某种美化方法,但在命令中可能省略管道部分,你需要根据自己环境添加。
3. 集群与索引管理:查看状态与核心操作
当你能连通集群后,第一件事就是了解它的健康状况和结构。这些命令是你日常运维的“眼睛”。
3.1 集群健康检查:第一道防线
_cluster/healthAPI 是你检查集群状态的入口。它的响应颜色(green,yellow,red)直接反映了集群的健康度。
curl -sS -X GET “http://localhost:9200/_cluster/health?pretty”关键参数pretty是 Elasticsearch 提供的简易 JSON 美化参数,在命令末尾加上?pretty即可,比用外部工具更方便,但功能不如jq强大。
响应中的关键字段:
status:green(所有主分片和副本分片都正常),yellow(所有主分片正常,但部分副本分片未分配,通常是单节点集群的默认状态),red(有主分片未分配,数据已丢失)。number_of_nodes/number_of_data_nodes: 节点数。active_primary_shards/active_shards: 活跃的分片数。unassigned_shards: 未分配的分片数,yellow或red状态的根源。
你可以获取更详细的、按索引统计的健康信息:
curl -sS -X GET “http://localhost:9200/_cluster/health?level=indices&pretty”3.2 节点与集群状态信息
查看集群中有哪些节点,以及它们的角色(master, data, ingest等):
curl -sS -X GET “http://localhost:9200/_cat/nodes?v&pretty”这里的_catAPI 返回的是表格化的文本,更简洁。v参数表示显示表头(verbose)。你可以用_catAPI 查看很多信息,如_cat/indices,_cat/shards,_cat/allocation等。
查看详细的集群状态和设置(信息量巨大,谨慎使用):
curl -sS -X GET “http://localhost:9200/_cluster/state?pretty” | head -100 # 只看前100行3.3 索引的完整生命周期操作
索引是 Elasticsearch 中数据的顶层容器。以下操作涵盖了它的生老病死。
1. 列出所有索引:
curl -sS -X GET “http://localhost:9200/_cat/indices?v&pretty”这会显示索引名、健康状态、状态(open/close)、文档数、存储大小等。_cat/indices是日常查看最常用的命令。
2. 创建索引:创建索引时可以指定分片数、副本数以及字段映射(mapping)。
# 最简单方式,使用默认设置(1主分片,1副本) curl -sS -X PUT “http://localhost:9200/my_index” -H ‘Content-Type: application/json’ -d’ { “settings”: { “number_of_shards”: 3, “number_of_replicas”: 1 }, “mappings”: { “properties”: { “title”: { “type”: “text” }, “author”: { “type”: “keyword” }, “content”: { “type”: “text” }, “publish_date”: { “type”: “date” } } } } ‘这里有几个要点:
-X PUT:指定 HTTP 方法为 PUT。-H ‘Content-Type: application/json’:至关重要。告诉 Elasticsearch 你发送的数据是 JSON 格式。几乎所有发送 Body 的curl命令都需要这个头。-d’…’:指定要发送的数据(Body)。用单引号包裹整个 JSON 字符串,这样里面的双引号才能被正确解析。JSON 体定义了索引的配置。
3. 查看索引的详细映射和设置:
# 查看映射 curl -sS -X GET “http://localhost:9200/my_index/_mapping?pretty” # 查看设置 curl -sS -X GET “http://localhost:9200/my_index/_settings?pretty”4. 删除索引(危险操作!):
curl -sS -X DELETE “http://localhost:9200/my_index”注意:删除索引是不可逆的,会清除所有数据。生产环境操作前务必三思。你可以通过关闭索引来暂时禁用,而不是删除。
# 关闭索引 curl -sS -X POST “http://localhost:9200/my_index/_close” # 打开索引 curl -sS -X POST “http://localhost:9200/my_index/_open”5. 索引别名管理:别名像一个指向一个或多个索引的软链接,常用于零停机重建索引或分区管理。
# 为索引添加别名 curl -sS -X POST “http://localhost:9200/_aliases” -H ‘Content-Type: application/json’ -d’ { “actions”: [ { “add”: { “index”: “my_index_v1”, “alias”: “my_index” } } ] } ‘ # 切换别名(原子操作,先移除旧索引,再添加新索引) curl -sS -X POST “http://localhost:9200/_aliases” -H ‘Content-Type: application/json’ -d’ { “actions”: [ { “remove”: { “index”: “my_index_v1”, “alias”: “my_index” }}, { “add”: { “index”: “my_index_v2”, “alias”: “my_index” }} ] } ‘4. 文档的增删改查:数据操作基石
文档是 Elasticsearch 中存储的基本数据单元。对文档的操作是最高频的 API。
4.1 索引(新增或全量替换)文档
使用PUT或POST方法向/<index>/_doc/<id>端点发送数据。如果指定了<id>,则为索引操作;如果不指定,ES 会自动生成一个 ID。
# 指定文档 ID 为 1 (PUT 方法) curl -sS -X PUT “http://localhost:9200/my_index/_doc/1” -H ‘Content-Type: application/json’ -d’ { “title”: “Elasticsearch Guide”, “author”: “Zhang San”, “content”: “This is a comprehensive guide...”, “publish_date”: “2023-10-27”, “views”: 150 } ‘ # 让 ES 自动生成文档 ID (POST 方法) curl -sS -X POST “http://localhost:9200/my_index/_doc” -H ‘Content-Type: application/json’ -d’ { “title”: “Another Article”, “author”: “Li Si” } ‘成功响应会包含“_id”和“result”: “created”(新增)或“updated”(替换)。
重要区别:PUT /index/_doc/id是全量替换。如果文档已存在,它会用新文档完全覆盖旧文档,旧文档的所有字段都将被新文档替换。如果你只想更新部分字段,需要使用更新 API。
4.2 查询文档
1. 根据 ID 获取:
curl -sS -X GET “http://localhost:9200/my_index/_doc/1?pretty”2. 判断文档是否存在(只返回 HTTP 状态码,不返回内容):
curl -sS -o /dev/null -w “%{http_code}\n” “http://localhost:9200/my_index/_doc/1” # 返回 200 表示存在,404 表示不存在3. 搜索文档(核心功能):搜索使用_search端点,查询体使用 Elasticsearch 的 Query DSL。
# 最简单的 match 查询:在 content 字段中匹配 “guide” curl -sS -X GET “http://localhost:9200/my_index/_search?pretty” -H ‘Content-Type: application/json’ -d’ { “query”: { “match”: { “content”: “guide” } } } ‘ # 多字段搜索 (multi_match) curl -sS -X GET “http://localhost:9200/my_index/_search?pretty” -H ‘Content-Type: application/json’ -d’ { “query”: { “multi_match”: { “query”: “elasticsearch”, “fields”: [“title”, “content^2”] # content 字段权重加倍 } }, “from”: 0, # 分页起始 “size”: 10 # 返回条数 } ‘ # 布尔组合查询 (bool) curl -sS -X GET “http://localhost:9200/my_index/_search?pretty” -H ‘Content-Type: application/json’ -d’ { “query”: { “bool”: { “must”: [ { “match”: { “content”: “guide” } } ], “filter”: [ { “range”: { “publish_date”: { “gte”: “2023-01-01” } }}, { “term”: { “author”: “Zhang San” } } ], “must_not”: [ { “term”: { “status”: “deleted” } } ] } }, “sort”: [ { “publish_date”: { “order”: “desc” } }, { “_score”: { “order”: “desc” } } ], “_source”: [“title”, “author”, “publish_date”] # 只返回指定字段 } ‘4.3 更新文档
更新 API 允许你部分更新文档,而不是全量替换。它内部会先获取文档,应用更新脚本,然后重新索引。
# 更新特定字段 (doc) curl -sS -X POST “http://localhost:9200/my_index/_update/1” -H ‘Content-Type: application/json’ -d’ { “doc”: { “views”: 200, # 更新 views 字段 “tags”: [“search”, “database”] # 新增 tags 字段 } } ‘ # 使用脚本更新 (script) - 例如,将 views 字段加 1 curl -sS -X POST “http://localhost:9200/my_index/_update/1” -H ‘Content-Type: application/json’ -d’ { “script”: { “source”: “ctx._source.views += params.increment”, “lang”: “painless”, “params”: { “increment”: 1 } } } ‘注意:更新操作要求文档存在,否则会失败(返回 404)。你可以通过“upsert”参数实现“存在则更新,不存在则插入”。
curl -sS -X POST “http://localhost:9200/my_index/_update/2” -H ‘Content-Type: application/json’ -d’ { “script”: { “source”: “ctx._source.views += params.increment”, “params”: { “increment”: 1 } }, “upsert”: { # 如果文档 2 不存在,则插入这个新文档 “title”: “New Article”, “views”: 1 } } ‘4.4 删除文档
# 根据 ID 删除 curl -sS -X DELETE “http://localhost:9200/my_index/_doc/1” # 根据查询条件删除 (Delete By Query API) - 谨慎使用! curl -sS -X POST “http://localhost:9200/my_index/_delete_by_query” -H ‘Content-Type: application/json’ -d’ { “query”: { “range”: { “publish_date”: { “lt”: “2020-01-01” } } } } ‘_delete_by_query会先执行查询,然后删除匹配的所有文档。对于大量数据,这是一个耗时操作,并且可能对集群性能产生影响。
5. 批量与高级操作:提升效率的关键
单条文档操作在数据量面前效率低下。Elasticsearch 提供了强大的批量 API 来处理成批的操作。
5.1 批量操作(Bulk API)
Bulk API 允许你在一个请求中执行多个索引、创建、更新、删除操作。它的格式有严格要求:每一行是一个 JSON 对象(描述操作类型和元数据),紧接着的一行是操作的数据(对于 index, create, update 操作)。
数据体需要以NDJSON(Newline Delimited JSON) 格式发送,即每行一个独立的 JSON 对象,用换行符\n分隔。
curl -sS -X POST “http://localhost:9200/_bulk?pretty” -H ‘Content-Type: application/x-ndjson’ -d’ { “index” : { “_index” : “my_index”, “_id” : “1001” } } { “title”: “Bulk Insert 1”, “author”: “BulkUser” } { “create” : { “_index” : “my_index”, “_id” : “1002” } } { “title”: “Bulk Create 2”, “author”: “BulkUser” } { “update” : { “_index” : “my_index”, “_id” : “1001” } } { “doc” : { “views”: 999 } } { “delete” : { “_index” : “my_index”, “_id” : “1002” } } ‘关键点:
- Content-Type:必须是
application/x-ndjson。 - 操作顺序:每一对行组成一个操作。第一行是“动作行”,第二行是“数据行”(delete 操作没有数据行)。
- 性能:批量大小需要权衡。太大可能导致内存压力和超时,太小则失去了批量意义。通常建议每批 5-15 MB,文档数在 1000-5000 之间,需要通过测试找到最佳值。
- 错误处理:Bulk 响应中会包含每个子操作的结果。即使部分操作失败,整个请求也可能返回 200。你必须检查响应体中的
“errors”: true字段以及每个项目的“error”详情。
5.2 使用文件进行批量操作
对于非常大的数据导入,将数据写入一个 NDJSON 文件,然后让curl从文件读取,比在命令行中嵌入大段数据要可靠得多。
- 创建一个文件
bulk_data.ndjson:{ “index”: { “_index”: “my_index”, “_id”: “2001” } } { “title”: “From File 1”, “count”: 1 } { “index”: { “_index”: “my_index”, “_id”: “2002” } } { “title”: “From File 2”, “count”: 2 } - 使用
curl的–data-binary参数发送文件内容,并正确设置Content-Type:
注意curl -sS -X POST “http://localhost:9200/_bulk?pretty” -H ‘Content-Type: application/x-ndjson’ —data-binary “@bulk_data.ndjson”@符号,它告诉curl从后面指定的文件中读取数据。
5.3 刷新与冲洗:控制可见性与持久化
Elasticsearch 为了性能,数据写入后并不会立即可查,也不会立即持久化到磁盘。这里涉及两个重要概念:
刷新(Refresh):将内存中的缓冲区(In-memory buffer)内容写入到新的段(Segment)中,并使其可被搜索。默认间隔是 1 秒。你可以手动触发刷新。
# 刷新特定索引 curl -sS -X POST “http://localhost:9200/my_index/_refresh” # 刷新所有索引 curl -sS -X POST “http://localhost:9200/_refresh”在批量导入大量数据后,可以先不刷新以提升导入速度,导入完成后再手动刷新一次,这样比每秒自动刷新一次效率高得多。
冲洗(Flush):将内存中的事务日志(Translog)持久化到磁盘,并清空一个旧的 Translog。这保证了数据在发生硬件故障时的持久性。Translog 默认每 5 秒或在每次索引、删除、更新请求后同步到磁盘(
index.translog.durability设置为request时)。你也可以手动触发。curl -sS -X POST “http://localhost:9200/my_index/_flush”
一个实用的批量导入模式:
# 1. 关闭索引的自动刷新,提升写入速度 curl -sS -X PUT “http://localhost:9200/my_large_index/_settings” -H ‘Content-Type: application/json’ -d’ { “index”: { “refresh_interval”: “-1” } } ‘ # 2. 执行批量导入 (使用文件) curl -sS -X POST “http://localhost:9200/_bulk” -H ‘Content-Type: application/x-ndjson’ —data-binary “@huge_data.ndjson” # 3. 导入完成后,恢复自动刷新并手动触发一次刷新 curl -sS -X PUT “http://localhost:9200/my_large_index/_settings” -H ‘Content-Type: application/json’ -d’ { “index”: { “refresh_interval”: “1s” } } ‘ curl -sS -X POST “http://localhost:9200/my_large_index/_refresh”5.4 重新索引与任务管理
重新索引(Reindex):用于将数据从一个索引复制到另一个索引,常用于索引重建、数据迁移、版本升级。
curl -sS -X POST “http://localhost:9200/_reindex?pretty” -H ‘Content-Type: application/json’ -d’ { “source”: { “index”: “old_index” }, “dest”: { “index”: “new_index” } } ‘Reindex 是异步任务,对于大数据量,它会返回一个任务 ID。你可以用任务 API 来查看进度。
# 提交一个 Reindex 任务,并等待它完成 (wait_for_completion=false) curl -sS -X POST “http://localhost:9200/_reindex?wait_for_completion=false&pretty” -H ‘Content-Type: application/json’ -d’ { “source”: { “index”: “old_index” }, “dest”: { “index”: “new_index” } } ‘ # 响应会包含一个任务ID,如 “task”: “abcdefg:12345” # 使用任务 API 查看该任务详情 curl -sS -X GET “http://localhost:9200/_tasks/abcdefg:12345?pretty”查看和管理任务:
# 查看所有正在运行的任务 curl -sS -X GET “http://localhost:9200/_tasks?detailed=true&pretty” # 取消一个任务 curl -sS -X POST “http://localhost:9200/_tasks/abcdefg:12345/_cancel”6. 实战排坑:curl 操作 Elasticsearch 的常见问题与技巧
即使命令格式正确,在实际操作中你依然会遇到各种“坑”。这里分享一些我踩过之后总结的经验。
6.1 JSON 格式与引号转义:命令行里的“语法地狱”
在命令行中编写多行 JSON 是痛苦的。单引号’、双引号”和反斜杠\的转义规则因 Shell 而异。
最佳实践:使用 Heredoc 或外部文件。
- 对于简单的单行 JSON,可以用单引号包裹整个 JSON 字符串,这样 JSON 内部的双引号就不需要转义(正如我们之前的例子)。
- 对于复杂或多行 JSON,将其写入一个临时文件是最安全的方式。
使用# 1. 将查询写入文件 query.json cat > query.json << ‘EOF’ { “query”: { “bool”: { “must”: { “match”: { “content”: “error” } }, “filter”: { “range”: { “@timestamp”: { “gte”: “now-1h”, “lte”: “now” } } } } }, “aggs”: { “per_minute”: { “date_histogram”: { “field”: “@timestamp”, “calendar_interval”: “1m” } } } } EOF # 2. 使用 curl 从文件读取数据 curl -sS -X GET “http://localhost:9200/logs-*/_search?pretty” -H ‘Content-Type: application/json’ —data-binary “@query.json”—data-binary而不是-d可以保留文件中的换行符,对于某些严格解析的 API 更可靠。
常见错误:
- “Unexpected character (‘-’ (code 45))”:这通常是因为
-d后面的 JSON 字符串格式不对,或者Content-Type头没有正确设置为application/json。 - “Content-Type header [application/x-www-form-urlencoded] is not supported”:忘记加
-H ‘Content-Type: application/json’头,curl默认会使用application/x-www-form-urlencoded。
6.2 处理 HTTPS 与自签名证书的“信任危机”
如前所述,对于启用了 HTTPS 和自签名证书的集群,最简单的测试方法是-k,但生产脚本中绝不能这样。你应该:
- 将 CA 证书(如
http_ca.crt)下载到你的客户端机器。 - 在
curl命令中通过—cacert参数指定它。 - 或者,将 CA 证书添加到系统的信任存储中(具体方法因操作系统而异),这样所有工具(包括
curl)都会自动信任它。
在脚本中安全地使用密码:在命令行中明文写密码 (-u user:password) 非常不安全。你可以:
- 使用
-u user:然后让curl交互式提示输入密码(不适合自动化)。 - 将密码放在环境变量中:
export ES_PASSWORD=‘your_secret_password’ curl —cacert ./http_ca.crt -u “elastic:${ES_PASSWORD}” https://es-host:9200 - 使用
curl的-K或—config选项从配置文件读取密码,并设置文件权限为 600。
6.3 超时、重试与性能调优
默认情况下,curl没有超时限制。对于一个无响应的 ES 节点,你的脚本可能会一直挂起。
- 设置超时:使用
—max-time或-m参数(单位:秒)。curl -m 30 … # 30秒后超时 - 连接超时:使用
—connect-timeout参数(单位:秒)。curl —connect-timeout 5 … # 连接阶段5秒超时 - 失败重试:对于非幂等操作(如 POST),重试需谨慎。对于 GET 等幂等操作,可以使用
—retry。curl —retry 3 —retry-delay 2 … # 失败后重试3次,每次间隔2秒
针对 Bulk API 的性能调优:
- 监控 Bulk 响应中的
“took”(耗时)和错误率。如果错误率上升或耗时激增,可能是批次太大或集群压力过大。 - 调整
curl的—tcp-nodelay和—compressed参数(如果 ES 支持压缩)。 - 考虑使用并行
curl进程或多个连接来提升吞吐量,但要小心不要压垮集群。可以使用像parallel或xargs这样的工具。
6.4 结果过滤与脚本化处理
curl返回的 JSON 通常需要进一步处理才能用于脚本。jq是你的最佳伙伴。
# 1. 提取集群状态 curl -sS http://localhost:9200/_cluster/health | jq -r ‘.status’ # 2. 列出所有索引名(每行一个) curl -sS http://localhost:9200/_cat/indices?h=index # 3. 结合 _cat API 和 jq 进行复杂过滤 (例如,找出状态为 yellow 的索引) curl -sS http://localhost:9200/_cat/indices?format=json | jq -r ‘.[] | select(.health==“yellow”) | .index’ # 4. 解析搜索结果的 hits 数组 curl -sS -X GET “http://localhost:9200/my_index/_search” -H ‘Content-Type: application/json’ -d ‘{“query”:{“match_all”:{}},“size”:1}’ | jq ‘.hits.hits[]._source’将jq与 Shell 脚本结合,你可以构建出非常强大的自动化运维工具。例如,一个定期检查集群健康并发送告警的脚本,其核心就是curl获取状态,jq解析,然后判断逻辑。