📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

简介 #

对于许多习惯了传统关系型数据库(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 时需注意以下几点:

  1. 翻译机制:SQL 请求在 Easysearch 内部会被“翻译”为原生的 DSL 查询。对于极其复杂的嵌套查询或特定的全文检索打分需求,原生 DSL 可能提供更细粒度的控制。
  2. 性能优化:尽量避免 SELECT *,只查询需要的字段可以减少网络开销和反序列化成本。
  3. 深分页:SQL 的 LIMITOFFSET 同样受限于 Easysearch 的 max_result_window 设置(默认 10,000 条)。如果需要导出大量数据,建议结合游标或 Scroll API(但在 SQL 层面通常用于分析场景)。

总结 #

通过 Easysearch 的 SQL 支持,企业可以:

  • 降低门槛:让熟悉 SQL 的 BI 分析师和传统 DBA 直接操作搜索型数据库。
  • 提升效率:快速编写用于排查故障或业务统计的 Ad-hoc 查询。
  • 无缝集成:更容易与支持 SQL 接口的第三方可视化工具集成。

现在,您已经掌握了基础,快去您的 Easysearch 集群上试着跑一条 SELECT 语句吧!