--- title: "Easysearch SQL 查询入门" date: 2026-02-20 lastmod: 2026-02-20 description: "Easysearch SQL 查询入门指南,详解 /_sql 接口、基础查询语法、GROUP BY 聚合、常用函数,帮助传统 SQL 用户快速上手。" tags: ["SQL 查询", "聚合分析", "REST API"] summary: "简介 # 对于许多习惯了传统关系型数据库(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." --- ## 简介 对于许多习惯了传统关系型数据库(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 对象。 **示例:** ```bash 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 或其他数据分析工具。 **示例(查看文本表格):** ```bash POST /_sql?format=txt { "query": "SELECT name, age, city FROM accounts WHERE age > 30 LIMIT 5" } ``` _输出:_ ```latex name|age|city John Doe|35|New York Jane Smith|32|London ... ``` --- ## 2. 基础查询语法 在 Easysearch 中,**索引(Index)** 相当于关系型数据库中的 **表(Table)**,**文档(Document)** 相当于 **行(Row)**,而 **字段(Field)** 则相当于 **列(Column)**。 ### 2.1 SELECT:检索数据 最基本的查询是选择字段。 - **查询所有字段:** ```sql SELECT * FROM kibana_sample_data_logs LIMIT 10 ``` - **查询特定字段:**(推荐做法,性能更好) ```sql SELECT clientip, response, url FROM kibana_sample_data_logs LIMIT 10 ``` ### 2.2 WHERE:过滤数据 使用 `WHERE` 子句对数据进行筛选。Easysearch 支持标准的比较运算符和逻辑运算符。 - **数值比较:** ```sql SELECT * FROM products WHERE price > 100 AND price <= 500 ``` - **精确匹配:** ```sql SELECT * FROM logs WHERE status = 404 ``` - **字符串匹配:** ```sql SELECT * FROM users WHERE city = 'Beijing' ``` - **模糊匹配(LIKE):** 使用 `%` 代表任意多个字符,`_` 代表一个字符。 ```sql SELECT * FROM articles WHERE title LIKE '%Easysearch%' ``` ### 2.3 ORDER BY:结果排序 默认情况下,搜索结果可能按相关性评分排序。使用 `ORDER BY` 可以按指定字段排序。 ```sql 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 基础分组统计 统计不同状态码的数量: ```sql SELECT response, COUNT(*) as count FROM kibana_sample_data_logs GROUP BY response ``` ### 3.2 多字段分组与指标计算 按国家和操作系统分组,并计算平均字节大小: ```sql 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 的分组): ```sql 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()` 等,用于处理时间序列数据。 **示例:按日期直方图统计(每天的日志量)** ```sql 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 的 `LIMIT` 和 `OFFSET` 同样受限于 Easysearch 的 `max_result_window` 设置(默认 10,000 条)。如果需要导出大量数据,建议结合游标或 Scroll API(但在 SQL 层面通常用于分析场景)。 ## 总结 通过 Easysearch 的 SQL 支持,企业可以: - **降低门槛**:让熟悉 SQL 的 BI 分析师和传统 DBA 直接操作搜索型数据库。 - **提升效率**:快速编写用于排查故障或业务统计的 Ad-hoc 查询。 - **无缝集成**:更容易与支持 SQL 接口的第三方可视化工具集成。 现在,您已经掌握了基础,快去您的 Easysearch 集群上试着跑一条 `SELECT` 语句吧!