简介 #
对于许多习惯了传统关系型数据库(RDBMS)的开发者和数据分析师来说,Elasticsearch 强大的 JSON DSL(Domain Specific Language)语法虽然功能丰富,但学习曲线较陡峭。
INFINI Easysearch 作为一款自主可控的分布式近实时搜索与分析引擎,深刻理解用户的这一痛点。它内置了强大的 SQL 支持,允许用户使用标准的 SQL 语法来查询和聚合数据。这意味着你可以用最熟悉的 SELECT * FROM table 方式来探索 Easysearch 中的海量数据,实现**“零开发投入”**的快速上手。
本文将介绍 Easysearch 的 SQL REST API 接口以及基础查询语法,帮助你快速开启 SQL 搜索之旅。
1. 核心接口:SQL REST API #
Easysearch 提供了一个专门的 /_sql 端点,用于接收和处理 SQL 请求。通过这个 REST 接口,你可以将 SQL 语句发送给集群,并获取 JSON、CSV 或文本格式的结果。
1.1 基本请求格式 #
使用 POST 方法向 /_sql 发送请求。请求体是一个包含 query 字段的 JSON 对象。
示例:
POST /_sql?format=txt
{
"query": "SELECT * FROM my_index LIMIT 10"
}
# 也可以直接使用
SELECT * FROM my_index LIMIT 10
1.2 响应格式控制 #
通过 URL 参数 format,你可以控制返回数据的格式,这对于调试和对接不同系统非常有用:
format=json:默认格式,适合程序解析(包含元数据)。format=txt:文本表格格式,适合在命令行或 Kibana Dev Tools 中直接查看,可读性最强。format=csv:逗号分隔值,适合导出数据到 Excel 或其他数据分析工具。
示例(查看文本表格):
POST /_sql?format=txt
{
"query": "SELECT name, age, city FROM accounts WHERE age > 30 LIMIT 5"
}
输出:
name|age|city
John Doe|35|New York
Jane Smith|32|London
...
2. 基础查询语法 #
在 Easysearch 中,索引(Index) 相当于关系型数据库中的 表(Table),文档(Document) 相当于 行(Row),而 字段(Field) 则相当于 列(Column)。
2.1 SELECT:检索数据 #
最基本的查询是选择字段。
- 查询所有字段:
SELECT * FROM kibana_sample_data_logs LIMIT 10
- 查询特定字段:(推荐做法,性能更好)
SELECT clientip, response, url FROM kibana_sample_data_logs LIMIT 10
2.2 WHERE:过滤数据 #
使用 WHERE 子句对数据进行筛选。Easysearch 支持标准的比较运算符和逻辑运算符。
- 数值比较:
SELECT * FROM products WHERE price > 100 AND price <= 500
- 精确匹配:
SELECT * FROM logs WHERE status = 404
- 字符串匹配:
SELECT * FROM users WHERE city = 'Beijing'
- 模糊匹配(LIKE):
使用%代表任意多个字符,_代表一个字符。
SELECT * FROM articles WHERE title LIKE '%Easysearch%'
2.3 ORDER BY:结果排序 #
默认情况下,搜索结果可能按相关性评分排序。使用 ORDER BY 可以按指定字段排序。
SELECT timestamp, machine.os, memory
FROM "metricbeat-*"
WHERE memory > 0.8
ORDER BY timestamp DESC
LIMIT 20
注意:在 SQL 语句中引用带有特殊符号(如连字符
-)的索引名称时,建议使用双引号""将索引名括起来,如上面的"metricbeat-*"。
3. 聚合分析(GROUP BY) #
Easysearch 的强大之处在于分析,SQL 语法同样支持通过 GROUP BY 进行分组统计,这在底层会转换为 Easysearch 的 Aggregations。
3.1 基础分组统计 #
统计不同状态码的数量:
SELECT response, COUNT(*) as count
FROM kibana_sample_data_logs
GROUP BY response
3.2 多字段分组与指标计算 #
按国家和操作系统分组,并计算平均字节大小:
SELECT geo.src, machine.os, AVG(bytes) as avg_bytes, MAX(bytes) as max_bytes
FROM kibana_sample_data_logs
GROUP BY geo.src, machine.os
LIMIT 20
3.3 HAVING 子句 #
使用 HAVING 对聚合后的结果进行过滤(例如,只显示数量大于 100 的分组):
SELECT clientip, COUNT(*) as access_count
FROM kibana_sample_data_logs
GROUP BY clientip
HAVING access_count > 100
ORDER BY access_count DESC
4. 常用 SQL 函数 #
Easysearch SQL 支持多种函数来增强查询能力:
- 聚合函数:
COUNT,SUM,AVG,MAX,MIN。 - 数学函数:
ROUND,FLOOR,CEIL,ABS等。 - 日期函数:
YEAR(),MONTH(),DAYOFMONTH()等,用于处理时间序列数据。
示例:按日期直方图统计(每天的日志量)
SELECT YEAR(timestamp) as year, MONTH(timestamp) as month, COUNT(*)
FROM logs
GROUP BY YEAR(timestamp), MONTH(timestamp)
5. 局限性与最佳实践 #
虽然 SQL 极大地降低了使用门槛,但在使用 Easysearch SQL 时需注意以下几点:
- 翻译机制:SQL 请求在 Easysearch 内部会被“翻译”为原生的 DSL 查询。对于极其复杂的嵌套查询或特定的全文检索打分需求,原生 DSL 可能提供更细粒度的控制。
- 性能优化:尽量避免
SELECT *,只查询需要的字段可以减少网络开销和反序列化成本。 - 深分页:SQL 的
LIMIT和OFFSET同样受限于 Easysearch 的max_result_window设置(默认 10,000 条)。如果需要导出大量数据,建议结合游标或 Scroll API(但在 SQL 层面通常用于分析场景)。
总结 #
通过 Easysearch 的 SQL 支持,企业可以:
- 降低门槛:让熟悉 SQL 的 BI 分析师和传统 DBA 直接操作搜索型数据库。
- 提升效率:快速编写用于排查故障或业务统计的 Ad-hoc 查询。
- 无缝集成:更容易与支持 SQL 接口的第三方可视化工具集成。
现在,您已经掌握了基础,快去您的 Easysearch 集群上试着跑一条 SELECT 语句吧!





