
Elasticsearch SQL 是 Elasticsearch 提供的一项功能,允许用户使用类似 SQL 的语法对存储在 Elasticsearch 索引中的数据进行查询。它通过将 SQL 查询翻译为 Elasticsearch 的原生查询语言(Query DSL),结合了 SQL 的熟悉语法和 Elasticsearch 的高效搜索能力。这项功能自 Elasticsearch 6.3 版本引入,最初为实验性功能,现已成为许多用户查询数据的首选方式。
Elasticsearch SQL 在 6.3 版本中首次引入,作为 X-Pack 的一部分(部分功能需要商业许可证)。随着版本迭代,功能逐渐稳定,支持的命令和函数不断扩展。截至最新版本(例如 8.x),Elasticsearch SQL 已广泛应用于生产环境,但仍有一些限制(如不支持 JOIN 操作)。
要使用 Elasticsearch SQL,需确保 Elasticsearch 集群已启用 X-Pack 功能。以下是基本设置步骤:
elasticsearch.yml 配置文件中启用 X-Pack(默认包含 SQL 功能)。http://localhost:9200 确认集群运行正常。Elasticsearch SQL 支持通过 REST API 执行查询。以下是一个简单示例:
此查询返回 library 索引中发布日期早于 2000 年的书籍信息,结果以文本格式输出。
Elasticsearch 提供了一个独立的 SQL 命令行工具,位于 bin 目录下。启动方式如下:
./bin/elasticsearch-sql-cli https://localhost:9200
若集群启用了安全认证,需提供用户名和密码:
./bin/elasticsearch-sql-cli https://sql_user:strongpassword@localhost:9200
启动后,可直接输入 SQL 查询,例如:
SELECT * FROM library WHERE page_count > ORDER BY page_count DESC;
Elasticsearch 提供 JDBC 驱动,允许通过 Java 应用程序或 BI 工具(如 Tableau)连接。下载驱动后,配置连接字符串如下:
String url = "jdbc:elasticsearch://localhost:9200";
Connection conn = DriverManager.getConnection(url, "username", "password");
Elasticsearch SQL 将 SQL 的概念映射到 Elasticsearch 的术语,以下是主要对应关系:
SQL 术语 | Elasticsearch 术语 | 描述 |
|---|---|---|
列(Column) | 字段(Field) | 数据的命名条目,SQL 列为单值,Elasticsearch 字段可能包含多值。 |
行(Row) | 文档(Document) | 包含列/字段的数据记录,文档比行更灵活。 |
表(Table) | 索引(Index) | 查询的目标实体。 |
模式(Schema) | 隐式 | SQL 模式用于命名空间和安全,Elasticsearch 通过角色控制访问。 |
数据库(Catalog) | 集群实例 | SQL 为一组模式/表,Elasticsearch 为集群中的索引集合。 |
Elasticsearch SQL 支持大多数 Elasticsearch 数据类型,并提供了一些 SQL 专用的运行时类型。以下是部分映射:
Elasticsearch 类型 | Elasticsearch SQL 类型 | SQL 类型 | 精度 |
|---|---|---|---|
boolean | boolean | BOOLEAN | 1 |
integer | integer | INTEGER | 10 |
keyword | keyword | VARCHAR | 32,766 |
date | datetime | TIMESTAMP | 29 |
geo_point | geo_point | - | 52 |
SQL 专用类型(如 DATE、TIME)通过 CAST 或 CONVERT 在查询中使用。
Elasticsearch SQL 支持一组 SQL 命令,主要用于查询和元数据操作。常见命令包括:
SHOW FUNCTIONS。SELECT 查询:
SELECT OriginCityName, DestCityName
FROM flights
WHERE FlightTimeHour > AND OriginCountry='US'
ORDER BY FlightTimeHour DESC
LIMIT ;
DESCRIBE 索引:
DESCRIBE flights;
SHOW 函数:
SHOW FUNCTIONS LIKE 'A%';
Elasticsearch SQL 提供约 142 个内置函数,分为以下类型:
函数类型 | 数量 | 示例 |
|---|---|---|
聚合(AGGREGATE) | 19 | AVG, COUNT, MAX |
条件(CONDITIONAL) | 9 | CASE, COALESCE |
标量(SCALAR) | 112 | CURDATE, ABS, ROUND |
分组(GROUPING) | 1 | HISTOGRAM |
评分(SCORE) | 1 | SCORE |
更多内容请查看:https://www.elastic.co/guide/en/elasticsearch/reference/8.18/sql-functions.html
聚合函数:
SELECT AVG(FlightTimeHour) AS avg_flight_time
FROM flights
GROUP BY OriginCityName;
标量函数:
SELECT ROUND(DistanceMiles) AS distance
FROM flights
LIMIT ;
Elasticsearch SQL 支持全文搜索功能,通过 MATCH 和 QUERY 操作符实现。例如:
SELECT *
FROM flights
WHERE MATCH(OriginCityName, 'Barcelona');
支持特定于 Elasticsearch 的函数,如 SCORE(),用于返回结果的相关性评分。
以下是一些实际场景的查询示例:
查找长途航班:
SELECT timestamp, FlightNum, OriginCityName, DestCityName,
ROUND(DistanceMiles/FlightTimeHour) AS speed
FROM flights
WHERE DAY_OF_WEEK(timestamp) <=
ORDER BY speed DESC
LIMIT ;
翻译为 DSL:
POST /_sql/translate
{
"query": "SELECT OriginCityName FROM flights WHERE FlightTimeHour > 5 LIMIT 10"
}
LIMIT 限制结果集大小。EXPLAIN 检查查询性能。Elasticsearch SQL 可与 Kibana 的 Canvas 工具结合,用于创建动态数据可视化。例如,通过 SQL 查询聚合数据并生成图表。
通过 JDBC 或 ODBC 驱动,Elasticsearch SQL 可连接到 Tableau、Power BI 等工具,方便数据分析。
Elasticsearch SQL 为熟悉 SQL 的用户提供了一个强大的接口,结合了 Elasticsearch 的搜索能力和 SQL 的易用性。尽管存在一些限制,但通过合理的数据建模和查询优化,它能满足多种分析需求。建议用户参考官方文档深入学习,并结合实际场景实践。