SQL 查询

SQL 查询 #

Easysearch SQL 插件让熟悉关系型数据库的用户无需学习 Query DSL 即可查询数据。插件将 SQL 语句翻译为原生 Easysearch DSL 执行,支持丰富的 SQL 语法——包括聚合、JOIN、子查询、全文搜索函数、窗口函数等。

快速开始 #

POST /_sql
{
  "query": "SELECT firstname, lastname, balance FROM accounts WHERE balance > 10000 ORDER BY balance DESC LIMIT 10"
}

响应(JDBC 格式,默认):

{
  "schema": [
    {"name": "firstname", "type": "text"},
    {"name": "lastname", "type": "text"},
    {"name": "balance", "type": "long"}
  ],
  "datarows": [
    ["Amber", "Duke", 39225],
    ["Nanette", "Bates", 32838]
  ],
  "total": 2,
  "size": 2,
  "status": 200
}

REST API #

查询端点 #

方法路径说明
POST/_sql执行 SQL 查询
POST/_sql/_explain将 SQL 翻译为 Easysearch DSL(不执行)
POST/_sql/_cursor/close关闭游标/Scroll 上下文

请求体 #

POST /_sql
{
  "query": "SELECT * FROM my_index WHERE age > 30",
  "fetch_size": 50
}
参数类型说明
queryStringSQL 查询语句
fetch_sizeInteger游标分页大小。为 0 或不传时返回全部结果;大于 0 时启用游标分页
cursorString游标 ID,用于获取后续分页结果
parametersArray预编译参数(预留)

查询参数 #

通过 URL 参数控制输出格式和行为:

参数说明
format输出格式:jdbc(默认)、jsoncsvraw/txt
pretty美化 JSON 输出
flat控制字段展平方式
separatorCSV 分隔符
_score是否在结果中包含相关性评分
_id是否在结果中包含文档 ID
_type是否在结果中包含文档类型

输出格式 #

JDBC 格式(默认)——结构化 JSON,含 schema 元信息:

POST /_sql
{
  "query": "SELECT firstname, age FROM accounts LIMIT 2"
}
{
  "schema": [
    {"name": "firstname", "type": "text"},
    {"name": "age", "type": "integer"}
  ],
  "datarows": [
    ["Amber", 32],
    ["Hattie", 36]
  ],
  "total": 2, "size": 2, "status": 200
}

CSV 格式

POST /_sql?format=csv
{
  "query": "SELECT firstname, age FROM accounts LIMIT 2"
}
firstname,age
Amber,32
Hattie,36

纯文本表格rawtxt):

POST /_sql?format=raw
{
  "query": "SELECT firstname, age FROM accounts LIMIT 2"
}
firstname | age
----------+----
Amber     | 32
Hattie    | 36

查询执行计划 #

使用 _explain 端点查看 SQL 如何被翻译为 Easysearch DSL:

POST /_sql/_explain
{
  "query": "SELECT firstname FROM accounts WHERE age > 30"
}
{
  "from": 0,
  "size": 200,
  "query": {
    "bool": {
      "filter": [{
        "bool": {
          "must": [{
            "range": {
              "age": {"from": 30, "include_lower": false}
            }
          }]
        }
      }]
    }
  },
  "_source": {
    "includes": ["firstname"]
  }
}

游标分页 #

对于大结果集,使用 fetch_size 启用游标分页(基于 Scroll API 实现):

POST /_sql
{
  "query": "SELECT * FROM my_index ORDER BY timestamp",
  "fetch_size": 100
}

响应中包含 cursor 字段:

{
  "schema": [...],
  "datarows": [...],
  "cursor": "d:eyJhIjp7fSwi..."
}

获取下一页:

POST /_sql
{
  "cursor": "d:eyJhIjp7fSwi..."
}

当所有数据返回完毕后,响应中不再包含 cursor 字段。也可以主动关闭游标释放服务端资源:

POST /_sql/_cursor/close
{
  "cursor": "d:eyJhIjp7fSwi..."
}

支持的 SQL 语句 #

语句说明
SELECT数据检索,完整语法支持(WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、子查询、JOIN、窗口函数等)
SHOW TABLES LIKE列出匹配模式的索引
DESCRIBE TABLES LIKE ... COLUMNS LIKE查看索引字段映射
DELETE按条件删除文档(默认禁用,需手动开启)

SHOW 语句 #

列出匹配模式的索引:

SHOW TABLES LIKE 'account%'

DESCRIBE 语句 #

查看索引字段映射,可用 COLUMNS LIKE 过滤字段名:

DESCRIBE TABLES LIKE 'accounts' COLUMNS LIKE '%name%'

DELETE 语句 #

⚠️ DELETE 默认禁用,需设置 easysearch.sql.delete.enabled: true 后方可使用。

DELETE FROM accounts WHERE age > 50

数据类型映射 #

SQL 类型Easysearch 类型说明
BOOLEANboolean布尔值
BYTEbyte8 位整数
SHORTshort16 位整数
INTEGERinteger32 位整数
LONGlong64 位整数
FLOATfloat单精度浮点数
DOUBLEdouble双精度浮点数
STRINGkeyword精确值字符串
TEXTtext全文分析字符串
DATEdate日期
TIME时间
DATETIME / TIMESTAMPdate日期时间
OBJECTobject嵌套 JSON 对象
NESTEDnested嵌套文档数组
GEO_POINTgeo_point经纬度坐标
IPipIP 地址
BINARYbinary二进制数据

类型之间的隐式转换遵循层级关系:BYTE → SHORT → INTEGER → LONG → FLOAT → DOUBLE。可通过 CAST() 函数进行显式类型转换。

插件设置 #

设置项类型默认值说明
easysearch.sql.enabledBooleantrue启用/禁用 SQL 插件
easysearch.sql.slowlogInteger2(秒)慢查询日志阈值
easysearch.sql.cursor.keep_aliveTimeValue1m游标 Scroll 上下文保持时间
easysearch.sql.delete.enabledBooleanfalse是否允许 DELETE 语句
easysearch.sql.query.size_limitInteger200默认结果集大小上限
easysearch.sql.query.response.formatStringjdbc默认响应格式
easysearch.sql.metrics.rollingwindowLong3600(秒)指标统计滚动窗口
easysearch.sql.metrics.rollingintervalLong60(秒)指标统计滚动间隔

以上设置均为动态设置,支持运行时更新:

PUT /_sql/settings
{
  "persistent": {
    "easysearch.sql.enabled": true,
    "easysearch.sql.slowlog": 5,
    "easysearch.sql.query.size_limit": 500
  }
}

文档导航 #

  1. 基础查询:SELECT、FROM、WHERE、ORDER BY、LIMIT 等基本语法
  2. 全文搜索:在 SQL 中使用 MATCH、SCORE 等全文搜索函数
  3. 复杂查询:子查询、JOIN、CASE WHEN 等高级语法
  4. 聚合查询:GROUP BY、HAVING、聚合函数、FILTER 子句
  5. 内置函数:数学、字符串、日期、条件、类型转换函数参考
  6. SQL-JDBC:通过 JDBC 驱动连接 Easysearch