还记得之前用 Elasticsearch 时,面对 DSL 查询语法的崩溃瞬间吗?bool must嵌套terms再套range,多层 JSON 结构能把人绕晕。而从 Elasticsearch 6.3.0 版本开始,官方终于引入了 SQL 支持 —— 这不是简单的语法糖,而是让 ES 拥有了像 MySQL 一样用 SQL 查询的能力。
虽然 6.3.0 版本只是实验性支持,直到 6.7 版本才正式「转正」,但这个功能直接戳中了无数后端开发者的痛点:不需要重新学习 DSL,用熟悉的 SQL 就能玩转 ES 海量数据。现在最新的 8.18 版本中,ES SQL 已经进化出 REST API、JDBC 驱动等全套生态,甚至能对接 Tableau、Superset 等 BI 工具,彻底打破了搜索与分析的壁垒。
一、数据准备
创建library索引并插入三本经典科幻小说的数据:
PUT /library/_bulk?refresh
{"index":{"_id": "Leviathan Wakes"}}
{"name": "Leviathan Wakes", "author": "James S.A. Corey", "release_date": "2011-06-02", "page_count": 561}
{"index":{"_id": "Hyperion"}}
{"name": "Hyperion", "author": "Dan Simmons", "release_date": "1989-05-26", "page_count": 482}
{"index":{"_id": "Dune"}}
{"name": "Dune", "author": "Frank Herbert", "release_date": "1965-06-01", "page_count": 604}
代码拆解:
_bulkAPI支持批量操作,?refresh参数确保数据立即可查每本书通过
_id唯一标识(这里用书名当ID)字段包含书名、作者、出版日期和页数,其中
release_date是ES的date类型
二、用REST API执行SQL查询
数据准备好后,试试用SQL查询2000年前出版的图书。在Kibana的DevTools中执行:
POST /_sql?format=txt
{
"query": "SELECT * FROM library WHERE release_date < '2000-01-01'"
}
关键参数解析:
/_sql是ES SQL的REST API端点,所有SQL查询都通过这个路径发送?format=txt指定返回格式为文本表格,也可以用json获取结构化数据SQL语句和MySQL几乎一样:
SELECT *查询所有字段,WHERE过滤出版日期
三、查询结果解读
1. 文本格式(format=txt)
执行后会得到清晰的表格输出:
name | author | release_date | page_count
--------------+---------------------+--------------+------------
Hyperion | Dan Simmons | 1989-05-26 | 482
Dune | Frank Herbert | 1965-06-01 | 604
这种格式适合快速查看结果,尤其是在命令行或日志中。
2. JSON格式(format=json)
如果需要程序解析结果,用JSON格式更友好

四、进阶查询:从简单过滤到复杂聚合
1. 按作者分组统计页数总和
想知道每位作者的书总共有多少页?用GROUP BY和SUM聚合:
SELECT author, SUM(page_count) as total_pages
FROM library
GROUP BY author
ORDER BY total_pages DESC
结果:

2. 排序与限制结果数量
查询页数最多的两本书:
SELECT name, page_count
FROM library
ORDER BY page_count DESC
LIMIT 2
结果:
name | page_count
--------+------------
Dune | 604
Leviathan Wakes | 561
五、隐藏技巧:让SQL查询更高效
1. 避免SELECT *,只查需要的字段
-- 推荐写法:减少网络传输
SELECT name, release_date FROM library
ES文档可能包含大量字段,按需查询能提升性能。
2. 利用日期函数处理时间字段
-- 提取出版年份并统计
SELECT
EXTRACT(YEAR FROM release_date) as year,
COUNT(*) as book_count
FROM library
GROUP BY year
EXTRACT(YEAR FROM date)是ES SQL支持的日期函数,和PostgreSQL语法类似。
六、生产环境注意事项
索引优化:对
release_date、author等常用过滤字段创建索引,提升查询速度分页查询:大数据量时用
LIMIT和OFFSET分页,避免一次性加载全量数据
七、什么时候选择ES SQL?
用熟悉的SQL语法操作ES数据
对接Tableau、Power BI等BI工具
快速导出数据到Excel或数据库
评论区