目 录CONTENT

文章目录

【入门篇】 10.聊聊ElasticSearch 如何支持SQL

冰点
2023-06-20 / 0 评论 / 0 点赞 / 19 阅读 / 7480 字

还记得之前用 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}

代码拆解:

  • _bulk API支持批量操作,?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语法类似。

六、生产环境注意事项

  1. 索引优化:对release_date、author等常用过滤字段创建索引,提升查询速度

  2. 分页查询:大数据量时用LIMIT和OFFSET分页,避免一次性加载全量数据

七、什么时候选择ES SQL?

  • 用熟悉的SQL语法操作ES数据

  • 对接Tableau、Power BI等BI工具

  • 快速导出数据到Excel或数据库

0

评论区