Elasticsearch作为分布式搜索与分析引擎,对外暴露的是一套基于HTTP的REST API。在没有安装专用客户端或可视化工具的情况下,系统自带的curl命令就能完成绝大多数管理性和数据性的交互。理解curl与ES REST API的配合方式,不仅有助于日常排障,也能将索引维护动作直接写进Shell脚本实现自动化。

环境准备与基础请求结构
在调用Elasticsearch REST API之前,首先要确认服务监听的地址与端口。默认安装下,ES会绑定在9200端口,通过HTTP协议提供JSON格式的响应。使用curl时,最基本的结构是curl -X<HTTP方法> <URL>,其中HTTP方法对应索引的增删改查动作,例如GET用于查询,PUT用于创建,POST用于提交数据,DELETE用于删除。
由于ES接收和返回的数据通常是JSON,当请求携带请求体时,必须显式声明Content-Type: application/json头,否则服务器可能拒绝处理或给出格式错误提示。在curl中通过-H参数添加请求头,用-d参数传递JSON字符串。如果ES启用了安全认证,还需要加上-u username:password。下面是一段检查集群健康状态的示例,不需要请求体,仅用GET方法访问_cluster/health路径。
# 查看集群健康状态 curl -X GET "http://127.0.0.1:9200/_cluster/health?pretty" # 带认证和JSON头查看节点信息 curl -u elastic:password -X GET "http://127.0.0.1:9200/_cat/nodes?v"
上面的pretty参数会让返回的JSON自动缩进,方便在终端阅读。在实际脚本中如果要做后续解析,通常去掉该参数并用jq等工具处理。理解这种基础结构是后续所有索引与查询操作的前提,因为无论多复杂的DSL,最终都封装在某一个HTTP方法与URL组合之下。
创建索引与写入文档的curl示例
创建索引可以直接用PUT方法访问索引名路径,并在请求体中定义字段映射。如果不指定映射,ES会自动根据写入的数据推断类型,但在生产环境中显式声明可以避免字段类型混乱。下面的例子创建一个名为blog的索引,设定title为文本类型,views为整数类型。
# 创建 blog 索引并定义映射
curl -X PUT "http://127.0.0.1:9200/blog"
-H "Content-Type: application/json"
-d '
{
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" },
"views": { "type": "integer" }
}
}
}'
索引创建完成后,写入单条文档可以使用POST方法指向索引名/_doc,由ES自动生成文档ID;也可以在_doc/后手动指定ID用PUT写入。下面的命令向blog索引插入一篇文章,并指定ID为1。
# 写入指定ID的文档
curl -X PUT "http://127.0.0.1:9200/blog/_doc/1"
-H "Content-Type: application/json"
-d '
{
"title": "Elasticsearch入门",
"content": "使用curl调用REST API很方便",
"views": 10
}'
这种单条写入方式适合调试,但在数据量较大时效率偏低。ES提供了_bulk接口,允许在一次HTTP请求中携带多行JSON动作,大幅减少网络往返。批量写入时,每一行描述动作元数据,紧接着一行是文档内容,两者都要以换行符结束。使用curl的--data-binary参数配合文件可以避免引号转义问题。
# bulk 批量写入,内容存于 bulk.txt
# bulk.txt 中每行结尾必须有换行
# {"index":{"_index":"blog"}}
# {"title":"文章二","content":"批量导入","views":5}
curl -X POST "http://127.0.0.1:9200/_bulk"
-H "Content-Type: application/json"
--data-binary @bulk.txt
查询与删除操作的REST API调用
最常用的查询是通过_search接口发送查询DSL。简单匹配可以用URI请求参数,复杂条件则放在请求体里。下面的示例在blog索引中搜索标题包含“入门”的文档,使用match查询。
# 使用 match 查询
curl -X GET "http://127.0.0.1:9200/blog/_search"
-H "Content-Type: application/json"
-d '
{
"query": {
"match": {
"title": "入门"
}
}
}'
如果只想删除某一条记录,可以用DELETE方法加文档ID;删除整个索引则直接DELETE索引名。注意删除索引是不可恢复的操作,脚本中执行前最好先确认。以下命令分别删除ID为1的文档和整个blog索引。
# 删除单条文档 curl -X DELETE "http://127.0.0.1:9200/blog/_doc/1" # 删除整个索引 curl -X DELETE "http://127.0.0.1:9200/blog"
除了基础增删改查,ES还提供_count统计文档数、_update局部更新等接口,调用规律都一致:选对HTTP方法、拼对路径、带好JSON体与请求头。当返回结果中出现"errors": false或"acknowledged": true时,说明curl发出的REST请求已被ES正确处理。熟练运用这些示例,就可以在不依赖第三方库的情况下完成ES日常运维与数据操作。
ElasticsearchcurlREST_API修改时间:2026-08-18 06:56:28