- REST API (最常用):通过发送 HTTP 请求到 Elasticsearch 的不同端点来执行各种操作,这是与 Elasticsearch 交互的标准方式。
- Elasticsearch SQL (便捷查询):一种类似 SQL 的查询语言,可以让你用熟悉的 SQL 语法来查询数据。
下面我将详细介绍这两种方式,并提供大量常用命令示例。

REST API (核心方式)
所有 REST API 请求都遵循一个基本模式:
curl -X<HTTP_METHOD> -u<USER>:<PASSWORD> "<NODE_IP>:<PORT>/<API_ENDPOINT>" -H "Content-Type: application/json" -d'<JSON_BODY>'
参数解释:
curl: 一个强大的命令行工具,用于发送 HTTP 请求。-X<HTTP_METHOD>: 指定 HTTP 方法,如GET(查询),POST(创建/查询),PUT(更新/创建),DELETE(删除)。-u<USER>:<PASSWORD>: (可选,如果开启了安全认证) 用于 Basic Authentication。-u elastic:changeme。"<NODE_IP>:<PORT>/<API_ENDPOINT>": Elasticsearch 节点的地址和要访问的 API 端点。http://localhost:9200/_cat/indices。-H "Content-Type: application/json": 声明请求体的内容类型是 JSON。-d'<JSON_BODY>': (可选,对于需要数据的请求,如 POST/PUT) 请求体的 JSON 数据。
常用 REST API 命令示例
假设你的 Elasticsearch 运行在 localhost:9200,并且开启了安全认证(默认用户 elastic,密码 changeme)。
集群和节点信息
-
获取集群健康状态
curl -u elastic:changeme "localhost:9200/_cluster/health?pretty"
pretty: 参数让 JSON 输出格式化,更易读。
-
获取所有节点信息
(图片来源网络,侵删)curl -u elastic:changeme "localhost:9200/_cat/nodes?v&pretty"
v: (verbose) 显示详细列表。
-
获取所有索引列表
curl -u elastic:changeme "localhost:9200/_cat/indices?v&pretty"
索引 管理
-
创建一个索引
curl -u elastic:changeme -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d' { "settings": { "number_of_shards": 1, "number_of_replicas": 1 } } ' -
删除一个索引
curl -u elastic:changeme -X DELETE "localhost:9200/my_index?pretty"
-
获取索引设置
(图片来源网络,侵删)curl -u elastic:changeme "localhost:9200/my_index/_settings?pretty"
-
更新索引设置 (将副本数改为2)
curl -u elastic:changeme -X PUT "localhost:9200/my_index/_settings" -H 'Content-Type: application/json' -d' { "number_of_replicas": 2 } '
文档 操作
假设我们有一个名为 my_index 的索引,其类型为 _doc (Elasticsearch 7.x 之后,一个索引只建议一种类型,且默认为 _doc)。
-
创建/索引一个文档 (指定 ID)
curl -u elastic:changeme -X PUT "localhost:9200/my_index/_doc/1?pretty" -H 'Content-Type: application/json' -d' { "user": "kimchy", "post_date": "2009-11-15T14:12:12", "message": "Trying out Elasticsearch" } '- ID
1已存在,此操作会覆盖该文档。
- ID
-
创建一个文档 (自动生成 ID)
curl -u elastic:changeme -X POST "localhost:9200/my_index/_doc?pretty" -H 'Content-Type: application/json' -d' { "user": "john", "post_date": "2025-10-27T10:00:00", "message": "Hello from Elasticsearch" } ' -
获取一个文档
curl -u elastic:changeme "localhost:9200/my_index/_doc/1?pretty"
-
更新一个文档 (部分更新)
curl -u elastic:changeme -X POST "localhost:9200/my_index/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d' { "doc": { "message": "Updated message for Elasticsearch" } } ' -
删除一个文档
curl -u elastic:changeme -X DELETE "localhost:9200/my_index/_doc/1?pretty"
搜索 操作
-
使用
GET进行简单搜索 (查询所有文档)curl -u elastic:changeme "localhost:9200/my_index/_search?pretty"
-
使用
POST进行带条件的搜索curl -u elastic:changeme -X POST "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d' { "query": { "match": { "message": "Elasticsearch" } }, "sort": [ { "post_date": "desc" } ], "from": 0, "size": 10 } 'query: 定义查询条件。match: 一个标准查询,用于分析文本字段。sort: 结果排序。from和size: 用于分页。
-
使用
bool查询进行复杂搜索curl -u elastic:changeme -X POST "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d' { "query": { "bool": { "must": [ { "match": { "message": "Elasticsearch" } } ], "filter": [ { "range": { "post_date": { "gte": "2025-01-01" } } } ] } } } 'bool: 组合多个查询子句。must: 必须匹配所有子句 (类似AND)。filter: 必须匹配,但不计算相关度,结果可以被缓存。
Elasticsearch SQL
Elasticsearch 提供了一个 JDBC/ODBC 兼容的接口,让你可以直接用 SQL 查询 Elasticsearch 中的数据。
执行 SQL 查询
通过 /_sql 端点执行。
-
执行一个简单的 SQL 查询
curl -u elastic:changeme -X POST "localhost:9200/_sql?pretty" -H 'Content-Type: application/json' -d' { "query": "SELECT * FROM my_index LIMIT 5" } ' -
执行带条件的 SQL 查询
curl -u elastic:changeme -X POST "localhost:9200/_sql?pretty" -H 'Content-Type: application/json' -d' { "query": "SELECT user, message FROM my_index WHERE message LIKE '%Elasticsearch%' ORDER BY post_date DESC" } '
将 SQL 转换为 Query DSL
这对于理解 SQL 背后的 Elasticsearch 查询逻辑非常有用。
curl -u elastic:changeme -X POST "localhost:9200/_sql/translate?pretty" -H 'Content-Type: application/json' -d'
{
"query": "SELECT user, message FROM my_index WHERE message LIKE '%Elasticsearch%' ORDER BY post_date DESC"
}
'
这个命令会返回等价的 Query DSL JSON,帮助你学习 ES 的查询语法。
其他执行方式
除了命令行,你还可以通过以下方式执行命令:
-
Kibana Dev Tools: 这是 最推荐 的交互式方式,Kibana 是 Elasticsearch 的官方可视化工具,其内置的 Dev Tools 提供了一个强大的控制台。
- 你可以直接在 Dev Tools 的控制台中输入 REST API 命令(无需
curl)或 SQL 查询,并立即看到格式化的结果,这是开发和调试的首选工具。
- 你可以直接在 Dev Tools 的控制台中输入 REST API 命令(无需
-
编程语言客户端: Elasticsearch 为多种主流编程语言提供了官方客户端(如 Java, Python, Go, JavaScript/Node.js, .NET, PHP, Ruby),使用客户端可以更方便地将 Elasticsearch 集成到你的应用程序中。
-
Python 示例 (
elasticsearch-py):from elasticsearch import Elasticsearch es = Elasticsearch(["http://localhost:9200"], basic_auth=("elastic", "changeme")) # 创建文档 doc = { "user": "python_user", "message": "Hello from Python client" } es.index(index="my_index", id=2, document=doc) # 搜索文档 res = es.search(index="my_index", query={"match": {"message": "Python"}}) print(f"Found {res['hits']['total']['value']} documents.")
-
-
Elasticsearch 插件: 一些第三方插件可能提供自己的命令行工具或执行接口。
| 方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| REST API (curl) | 自动化脚本、CI/CD 流程、服务器端操作 | 标准通用,可集成在任何脚本中 | 命令冗长,调试不便 |
| Elasticsearch SQL | 有 SQL 背景的用户,快速数据查询 | 语法简单直观 | 功能不如 Query DSL 灵活和强大 |
| Kibana Dev Tools | 开发、调试、日常查询 | 交互式,语法高亮,结果格式化,自动补全 | 需要启动 Kibana 环境 |
| 编程语言客户端 | 应用程序集成 | 类型安全,易于管理连接,性能好 | 需要编写代码 |
对于初学者和日常使用,强烈建议从 Kibana Dev Tools 开始,它能让你快速理解 Elasticsearch 的工作方式,对于生产环境的自动化任务,REST API (curl) 和 编程客户端 是最佳选择。
