响应格式

SQL 插件提供了 jdbccsvrawjson 响应格式,这些格式适用于不同的用途。jdbc 格式被广泛使用,因为它提供模式信息并增加了更多功能,例如分页。除了 JDBC 驱动程序外,各种客户端都可以从详细且格式良好的响应中受益。

JDBC 格式

默认情况下,SQL 插件以标准的 JDBC 格式返回响应。此格式为需要模式和结果集都格式良好的 JDBC 驱动程序和客户端提供。

示例请求

以下查询未指定响应格式,因此格式设置为 jdbc

POST _plugins/_sql
{
  "query" : "SELECT firstname, lastname, age FROM accounts ORDER BY age LIMIT 2"
}

示例响应

在响应中,schema 包含字段名称和类型,datarows 字段包含结果集:

{
  "schema": [
    {
      "name": "firstname",
      "type": "text"
    },
    {
      "name": "lastname",
      "type": "text"
    },
    {
      "name": "age",
      "type": "integer"
    }
  ],
  "datarows": [
    [
      "Nanette",
      "Bates",
      28
    ],
    [
      "Amber",
      "Duke",
      32
    ]
  ],
  "total": 2,
  "size": 2,
  "status": 200
}

如果发生任何类型的错误,UDB-SX 会返回错误消息。

以下查询搜索不存在的字段 unknown

POST /_plugins/_sql
{
  "query" : "SELECT unknown FROM accounts"
}

响应包含错误消息和错误原因:

{
  "error":{
    "reason":"Invalid SQL query",
    "details":"can't resolve Symbol(namespace=FIELD_NAME, name=unknown) in type env",
    "type":"SemanticCheckException"
    },
    "status": 400
}

UDB-SX DSL JSON 格式

如果将格式设置为 json,则返回原始的 UDB-SX 响应(JSON 格式)。因为这是 UDB-SX 的原生响应,所以需要额外的努力来解析和解释它。

示例请求

以下查询将响应格式设置为 json

POST _plugins/_sql?format=json
{
  "query" : "SELECT firstname, lastname, age FROM accounts ORDER BY age LIMIT 2"
}

示例响应

响应是来自 UDB-SX 的原始响应:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": null,
    "hits": [
      {
        "_index": "accounts",
        "_id": "13",
        "_score": null,
        "_source": {
          "firstname": "Nanette",
          "age": 28,
          "lastname": "Bates"
        },
        "sort": [
          28
        ]
      },
      {
        "_index": "accounts",
        "_id": "1",
        "_score": null,
        "_source": {
          "firstname": "Amber",
          "age": 32,
          "lastname": "Duke"
        },
        "sort": [
          32
        ]
      }
    ]
  }
}

CSV 格式

您还可以指定以 CSV 格式返回结果。

示例请求

POST /_plugins/_sql?format=csv
{
  "query" : "SELECT firstname, lastname, age FROM accounts ORDER BY age"
}

示例响应

firstname,lastname,age
Nanette,Bates,28
Amber,Duke,32
Dale,Adams,33
Hattie,Bond,36

在 CSV 格式中清理结果

默认情况下,UDB-SX 根据以下规则清理标题单元格(字段名称)和数据单元格(字段内容):

  • 如果单元格以 +-=@ 开头,清理程序会在单元格开头插入一个单引号 (')。

  • 如果单元格包含一个或多个逗号 (,),清理程序会用双引号 (") 包围该单元格。

示例

以下查询索引一个单元格以特殊字符开头或包含逗号的文档:

PUT /userdata/_doc/1?refresh=true
{
  "+firstname": "-Hattie",
  "=lastname": "@Bond",
  "address": "671 Bristol Street, Dente, TN"
}

您可以使用以下查询请求 CSV 格式的结果:

POST /_plugins/_sql?format=csv
{
  "query" : "SELECT * FROM userdata"
}

在响应中,以特殊字符开头的单元格前缀为 '。包含逗号的单元格被引号包围:

'=lastname,address,'+firstname
'@Bond,"671 Bristol Street, Dente, TN",'-Hattie

要跳过清理,请将 sanitize 查询参数设置为 false:

POST /_plugins/_sql?format=csv&sanitize=false
{
  "query" : "SELECT * FROM userdata"
}

响应包含原始 CSV 格式的结果:

=lastname,address,+firstname
@Bond,"671 Bristol Street, Dente, TN",-Hattie

Raw 格式

您可以使用 raw 格式将结果通过管道传递给其他命令行工具进行后处理。

示例请求

POST /_plugins/_sql?format=raw
{
  "query" : "SELECT firstname, lastname, age FROM accounts ORDER BY age"
}

示例响应

firstname|lastname|age
Nanette  |Bates   |28 
Amber    |Duke    |32 
Dale     |Adams   |33 
Hattie   |Bond    |36 

默认情况下,UDB-SX 根据以下规则清理 raw 格式的结果:

  • 如果数据单元格包含一个或多个竖线字符 (|),清理程序会用双引号包围该单元格。

示例

以下查询索引一个字段中包含竖线字符 (|) 的文档:

PUT /userdata/_doc/1?refresh=true
{
  "+firstname": "|Hattie",
  "=lastname": "Bond|",
  "|address": "671 Bristol Street| Dente| TN"
}

您可以使用以下查询请求 raw 格式的结果:

POST /_plugins/_sql?format=raw
{
  "query" : "SELECT * FROM userdata"
}

查询返回包含 | 字符的单元格,并用引号包围:

"|address"                     |=lastname|address|+firstname
"671 Bristol Street| Dente| TN"|"Bond|"  |       |"|Hattie"