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

使用 SQL 语法执行查询操作,对 Easysearch 索引中的数据进行检索和分析。

API 格式 #

POST /_sql
POST /_sql/_explain

API 作用 #

该 API 允许用户使用 SQL 语法查询 Easysearch 索引,支持:

  • 执行 SELECT 查询语句
  • 获取查询执行计划(使用 /_explain 端点)
  • 使用准备语句(Prepared Statements)和参数化查询
  • 使用游标(Cursor)进行分页查询
  • 多种响应格式(JSON、JDBC、CSV 等)

注意:该 API 仅支持 POST 方法,不支持 GET 方法。

API 参数 #

路径说明 #

路径描述
/_sql执行 SQL 查询
/_sql/_explain获取 SQL 查询的执行计划
/_sql/close关闭游标

请求体参数 #

参数类型是否必填默认值描述
queryString-SQL 查询语句,例如:SELECT * FROM my_index WHERE field > 100
fetch_sizeInteger0每批获取的行数。设置为大于 0 的值时启用游标模式
parametersArray-准备语句的参数数组

parameters 参数结构 #

"parameters": [
  {
    "type": "STRING",
    "value": "parameter_value"
  }
]

支持的参数类型:

  • STRING
  • KEYWORD
  • DATE
  • BOOLEAN
  • BYTESHORTINTEGERLONG
  • FLOATDOUBLE
  • NULL

查询参数 #

参数类型是否必填默认值描述
formatStringjdbc响应格式。可选值:jdbcjsoncsvrawtable
prettyBooleanfalse是否格式化 JSON 输出
escapeBooleanfalse是否转义特殊字符
sanitizeBooleantrue是否清理输出内容

请求示例 #

基本 SQL 查询 #

POST /_sql
{
  "query": "SELECT * FROM my_index WHERE age > 25"
}

使用准备语句 #

POST /_sql
{
  "query": "SELECT * FROM my_index WHERE age > ? AND name = ?",
  "parameters": [
    {
      "type": "INTEGER",
      "value": "25"
    },
    {
      "type": "STRING",
      "value": "John"
    }
  ]
}

使用游标分页 #

POST /_sql
{
  "query": "SELECT * FROM large_index",
  "fetch_size": 1000
}

获取执行计划 #

POST /_sql/_explain
{
  "query": "SELECT count(*) FROM my_index WHERE status = 'active'"
}

响应示例 #

JDBC 格式响应(默认) #

{
  "schema": [
    {
      "name": "name",
      "alias": null,
      "type": "keyword"
    },
    {
      "name": "age",
      "alias": null,
      "type": "integer"
    }
  ],
  "datarows": [
    ["Alice", 30],
    ["Bob", 25],
    ["Charlie", 35]
  ],
  "total": 3,
  "size": 3,
  "status": 200
}

JSON 格式响应 #

{
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "hits": [
      {
        "_id": "1",
        "_source": {
          "name": "Alice",
          "age": 30
        }
      },
      {
        "_id": "2",
        "_source": {
          "name": "Bob",
          "age": 25
        }
      }
    ]
  }
}

游标响应 #

{
  "schema": [
    {
      "name": "id",
      "alias": null,
      "type": "long"
    }
  ],
  "datarows": [[1], [2], [3], [4], [5]],
  "cursor": "cursor_id_here",
  "total": 1000,
  "size": 5,
  "status": 200
}

执行计划响应 #

{
  "name": "ProjectOperator",
  "description": {
    "fields": "[count(*)]"
  },
  "children": [
    {
      "name": "TableScanOperator",
      "description": {
        "request": "GET my_index/_search"
      }
    }
  ]
}

响应字段说明 #

JDBC 格式响应字段 #

字段类型描述
schemaArray结果集的列定义(字段名、类型)
schema[].nameString字段名称
schema[].typeString字段类型
datarowsArray数据行数组,每行是一个值数组
totalInteger总行数
sizeInteger当前返回的行数
cursorString游标 ID(用于获取下一页)
statusIntegerHTTP 状态码

错误响应 #

{
  "error": {
    "type": "SqlParseException",
    "reason": "Failed to parse SQL query",
    "details": "line 1:10: no viable alternative at input 'SELECT FRO'"
  },
  "status": 400
}

功能要求 #

SQL 功能需要在配置中启用:

  • plugins.sql.enabled = true
  • rest.action.multi.allow_explicit_index = true

如果任一设置为 false,API 将返回 “SQL feature disabled” 错误。

注意事项 #

  1. 仅支持 POST 方法:该 API 不支持 GET 方法,所有请求必须使用 POST
  2. 游标超时:游标有默认超时时间,超时后需要重新查询
  3. 性能考虑:复杂 SQL 查询可能消耗较多资源,建议添加适当的过滤条件
  4. 字段映射:SQL 查询中的表名对应 Easysearch 的索引名
  5. 类型转换:确保参数类型与字段类型匹配,否则可能导致查询失败