Elasticsearch SQL 是什么
Elasticsearch SQL 让熟悉 SQL 的人直接查询索引:SELECT、FROM、WHERE、GROUP BY、ORDER BY、LIMIT、HAVING 的子集可用,表名即索引名,支持通配符与部分内置函数。查询走 _sql 接口,format 参数决定返回格式(txt、json、csv 等);_sql/translate 会返回等价的原生查询 DSL,适合先用 SQL 探索、再把翻译结果落到正式查询里。它是只读、面向分析的接口,复杂 JOIN 与部分聚合函数并不支持。
基本信息
| 查询接口 | POST /_sql?format=txt 或 format=json |
|---|---|
| 翻译接口 | POST /_sql/translate 返回等效 DSL |
| 表名 | 索引名,含通配符或短横线时要加双引号 |
| 字段名 | 大小写敏感或含特殊字符时用双引号 |
| 能力边界 | 只读、面向分析,复杂 JOIN 与部分函数不支持 |
| 接入方式 | JDBC / ODBC 驱动可供 BI 工具直连 |
典型使用场景
- 快速探索数据:不熟悉 DSL 的人用 SQL 直接看索引里的分布
- 生成等价 DSL:先用 SQL 把逻辑写通,再用 translate 得到原生查询
- BI 工具接入:通过 JDBC 让报表工具直接查询索引
- 临时核对:排障时用一句 SQL 统计文档数与状态分布
- 新人交接:把复杂聚合用 SQL 表达出来,比读 DSL 更容易理解
查询与翻译
查询与翻译
POST /_sql?format=txt
{
"query": "SELECT status, COUNT(*) AS cnt FROM \"logs-*\" WHERE status = 200 GROUP BY status ORDER BY cnt DESC LIMIT 5"
}
# 翻译成等价 DSL,确认性能与语义后再上线
POST /_sql/translate
{
"query": "SELECT status FROM \"logs-*\" ORDER BY status LIMIT 3"
}接口与写法读法
| 项 | 含义 | 注意 |
|---|---|---|
| _sql | 执行查询 | format 决定返回格式 |
| _sql/translate | 返回等效 DSL | 性能敏感查询先看生成结果 |
| 表名 | 索引名 | 含通配符或短横线需双引号 |
| 字段 | 文档字段 | 大小写不符时同样要双引号 |
| LIMIT | 返回行数 | 不加限制可能返回大量行 |
SQL 与原生 DSL 并非全功能对等:脚本字段、部分聚合与复杂 JOIN 在 SQL 里没有对应写法,性能敏感查询应先用 translate 检查生成的 DSL 是否符合预期。
用 curl 直接写 SQL 需要转义双引号,脚本化时建议把请求体放进文件或改用驱动,避免转义错误掩盖真正的问题。
返回行数会同时受 LIMIT 与集群默认行数设置影响,不写 LIMIT 的查询可能拉回大量行;给导出或临时分析用的语句一定显式限制条数并加上时间或状态条件。