首页/数据/NoSQL 速查/Elasticsearch SQL 查询
Elasticsearch89 条

Elasticsearch SQL 查询

SQL 接口让熟悉 SQL 的用户直接查询索引:SELECT/FROM/WHERE/GROUP BY/ORDER BY/LIMIT 的子集可用,translate 接口能看到等价的 DSL。

NoSQL 速查数据更新于 2026-10-13

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 的查询可能拉回大量行;给导出或临时分析用的语句一定显式限制条数并加上时间或状态条件。

易错点

  • SQL 与原生 DSL 并非全功能对等,性能敏感查询先用 translate 检查生成的 DSL
  • curl 里双引号需要转义,脚本化时建议用请求体文件避免转义错误
  • 把 SQL 当在线业务查询通道:它面向分析,缺少业务侧需要的精细控制
  • 索引名或字段名含短横线、大小写不一致时不加双引号会报语法错误

数据来源与参考

  • Elasticsearch Guide: SQL APIs
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌