VEGA 引擎 · 资源数据 API (0.1.0)

Download OpenAPI specification:

Vega Backend Resource 数据子资源(/resources/{id}/data)相关 API。

large_integer 字段通过十进制字符串无损传输。Doris 源端比较、range、out_range、between、 分组、排序和 MIN/MAX 使用数值语义;SUM/AVG 暂不支持。 托管本地索引将其作为 string/keyword 存储和查询,复用既有字符串操作规则, 不支持 large_integer 数值范围或聚合语义;例如 "0100" 不匹配存储文本 "100"。 Dataset 不允许声明 large_integer 字段。 输入推荐使用整数字符串(可含正负号及前导零);非法及越界常量遵循源端 CAST 设置。 区间不重排边界,range/between 为闭区间,out_range 为两端严格外部区间;NULL 边界拒绝。

本规范覆盖两类语义:

  1. 通用资源数据查询:POST /resources/{id}/data + X-HTTP-Method-Override: GET, 对任意 category 的 Resource 执行数据查询(filter + 分页)。
  2. dataset documents 的写/删/访问:POST 的 Override: POST 创建一条文档, PUT /resources/{id}/data 批量完整替换文档,单条 PUT 完整替换一条文档,GET / DELETE 支持按逗号分隔的文档 ID 批量操作; 它们以及 POST 的 Override: DELETE 分支,仅对 Resource.category=dataset 生效。

dataset 不顶层化:dataset 在系统中只是 Resource.category=dataset 的特化形态, 无独立 ID 体系。CRUD 走 /resources/{id},仅 documents 子资源(即本规范)独立 API surface。

端点设计遵循 [vega-backend/CLAUDE.md] 的"端点设计规则"。POST /data 用 X-HTTP-Method-Override 头多分发,是为了兼容现有 query 语义并在同一条路径上 暴露 create / delete-by-filter,避免在仓库内引入新的"动作端点"形态。

错误码:常规操作复用 Resource 系列;条件删除部分完成使用 VegaBackend.Dataset.DeleteIncomplete。单条文档不存在 与 resource 不存在共用 VegaBackend.Resource.NotFound,靠 error_details 区分。

cursor 可通过 DELETE /resources/cursors/{cursor} 提前关闭,详见 raw-query.yaml。默认空闲租约为 1800 秒;单账号 cursor session 默认上限 100,全局默认上限 1000。

Resource 数据多分发端点

必须带 X-HTTP-Method-Override 头,值是 GET / POST / DELETE 之一 (大小写不敏感);缺失或值非法返回 400 VegaBackend.InvalidParameter.OverrideMethod。

三种分支:

Override 行为 category 限制 body schema
GET 列表 / 查询文档 任意(兼容现有通用查询) ResourceDataQueryParams
POST 创建一条文档 dataset 强制 Document(不得传 _id,由后端生成)
DELETE 按 filter 删除文档 dataset 强制 ResourceDataQueryParams(filter_condition 必填非空)

Override: GET 响应:200 + { entries, total_count, paging }。cursor 模式通过 paging.next_cursor 续页;total_count 仅在 need_total=true 时返回。 逻辑视图查询要求 EE 专业版及以上授权;未安装 EE 扩展返回 501, 授权版本不足返回 403 Public.Forbidden。 HANA 源表无 SELECT 权限时返回 403 VegaBackend.Resource.SourceReadForbidden,不暴露驱动原始错误。 已保存的衍生逻辑视图因源字段删除、绑定/类型不匹配、输出 Feature 变化, 或固定过滤条件非法(包括缺值、非法范围、不支持的算子)、无法按当前 schema/index 配置构造时, 返回 400 VegaBackend.LogicalView.DefinitionInvalid。 description 包含可识别的相关字段及编辑视图的修复提示;error_details 包含 fields(源字段名数组;输出绑定使用 original_name,过滤条件使用 field 名称)及 reason (source_field_mismatch、source_feature_mismatch、filter_field_missing 或 filter_incompatible)。 普通查询条件非法仍返回 400 查询参数错误;不因条件来自已保存定义而改为 500。 本地索引精确查询值超过 keyword ignore_above 时,返回 HTTP 400 VegaBackend.Resource.QueryValueExceedsKeywordLimit。metadata.field 为请求字段名, metadata.limit 为正整数长度上限,单位为 UTF-16 code units。 客户端按 error_code 判断错误类型,使用 metadata 生成本地化提示,不解析 error_details。 此错误不会自动回源或降级为空结果;调用方可缩短值,或主动设置 ignore_local_index=true (仅支持源查询的资源)。旧版后端的通用 InvalidParameter 错误仍按通用错误处理。 非过滤条件的视图存储结构损坏、源读取及模型服务故障仍按原有错误处理。 已保存的复合逻辑视图在首次查询和 cursor 续页时也暂时返回 501。

Override: POST 响应:201 + { id }。后端生成文档 ID;携带 _id 的 body 返回 400。

Override: DELETE 响应:成功默认返回 204;?return_result=true 时返回 200 和 DeleteByQueryResult。部分失败、版本冲突或超时返回 500 VegaBackend.Dataset.DeleteIncomplete,error_details 包含删除数量及失败结果。 失败时已删除的文档不会回滚,重试前应核验业务状态。 空 filter_condition 返回 400。

非 dataset category 的 resource 调 Override=POST/DELETE → 400 VegaBackend.Resource.InternalError.InvalidCategory。

Authorizations:
OAuth2
path Parameters
id
required
string

Resource ID

query Parameters
return_result
boolean
Default: false

仅 Override=DELETE 生效;true 时成功返回 200 和实际结果,默认保持 204。

header Parameters
X-HTTP-Method-Override
required
string
Enum: "GET" "POST" "DELETE"

必填;值为 GET / POST / DELETE 之一

Request Body schema: application/json
required
One of
object

过滤条件树。叶节点使用 field、operation、value 和 value_from(const/field); and/or 通过 sub_conditions 嵌套。Override=DELETE 时必填且非空。

时间常量:date 为 YYYY-MM-DD;time 为 HH:mm:ss[.fraction]; datetime 支持 RFC3339、YYYY-MM-DD HH:mm:ss[.fraction] 或 int64 整数毫秒时间戳 (JSON 整数或数字字符串)。小数秒支持 1–9 位;无时区 datetime 按服务器 TZ 解释,默认 UTC。 date/datetime 的 before 使用 [正整数间隔, 单位],单位为 year/quarter/month/week/day/hour/minute/second/microsecond 中实际连接器支持的子集, PostgreSQL 还接受其已有的复数单位别名。间隔必须是 int64 范围内的正整数, 日期字符串、未知或空单位均返回 400,不再接受索引旧 [小时数, RFC3339 参考时刻] 格式。 索引支持 year/month/week/day/hour/minute/second,间隔数量上限为 2147483647, 还须满足实际索引字段的时间值域。date_nanos 的边界须位于 1970-01-01T00:00:00Z 至 2262-04-11T23:47:16.854775807Z; 普通 date 使用毫秒值域,不共用 date_nanos 的间隔限制。 超限时保存或执行均明确拒绝,返回 400 VegaBackend.Resource.QueryTimeOutOfRange, 不将条件截断或改写为空结果。索引 before 在服务器时区计算截止时刻, 年/月截断到目标月末,日/周使用 Go 标准库日历运算,小时/分钟按经过时间计算; 时区转换由标准库处理。值域校验和查询使用同一纳秒精度的绝对截止时刻。

可用操作取决于字段类型和查询通道。索引字段比较的日期族两侧均须为 date/datetime/timestamp。 索引 TEXT 的精确及模式匹配要求 keyword Feature。 本地索引常量 !=/not_eq 和 not_in 仅比较具有精确索引值的记录, NULL 或缺失字段不命中;约束位于各自的条件分支内,显式 OR null 仍按该分支求值。 对 string/text 使用 keyword 字段或子字段;原始字符串超过该字段 ignore_above 时, 原值仍保留在 _source,但不写入 keyword 索引和 doc_values,因此也不会命中上述否定条件, 即使查询常量本身未超限。平台新增 string/text keyword 特征的默认上限为 256, 长度单位为 UTF-16 code units,实际限制以索引 mapping 为准。 例如上限 256 时,300 个 ASCII 字符的 body 不会命中 body != "hello" 或 body not_in ["hello"]。这项限制可能使本地索引与源端 SQL 的结果不同; 显式 null/not_null/exist/not_exist 按各自字段的索引存在性求值, 不保证与上述比较条件覆盖全部原始值。 查询常量自身超限则返回 400 VegaBackend.Resource.QueryValueExceedsKeywordLimit, not_in 任一候选值超限也按此处理,与已存储长值不参与比较的行为不同。 日期类 not_in 的存在性约束也计入既有的 1024 条查询子句上限。 需要完整原始值比较时,对支持源查询的 table resource 可设置 ignore_local_index=true; 不会自动回源,dataset 没有原始表查询通道。正文检索可使用已配置全文特征的 match/match_phrase。 contain 在源查询中匹配逗号分隔值的全部给定项, 在索引查询中匹配任一项;索引 not_contain 排除全部给定项。 knn_vector 在索引维度已知时要求输入向量维度匹配。

非法输入或超限返回 HTTP 400,服务端配置或执行故障返回相应 5xx。 已保存的派生视图固定条件非法时返回 VegaBackend.LogicalView.DefinitionInvalid。 索引 datetime 集合最多 1024 个不同时刻;含范围条件的过滤树最多 1024 个查询子句; time 集合展开后最多 65536 项,并受引擎配置限制。 能力与兼容说明。

object (PagingRequest)

首次请求使用 offset 和 limit;cursor 续页以 cursor 定位,need_total 可携带但不会覆盖首次请求冻结值,其余查询参数不得重传。

Array of objects (SortField)

排序字段。派生逻辑视图的非聚合查询支持保留元字段 _score,无需在视图 Schema 中发布;索引通道按真实相关性分数排序,source 表查询忽略该项并保留其余排序项。 聚合查询中,__value 代表实际聚合结果列,即使 aggregation.alias 使用自定义名称。 省略 aggregation 且使用 HAVING count(*) 时,隐式计数输出同样为 __value,可用于排序。 索引分组仅支持按 group_by 字段、实际聚合结果别名或其 __value 引用排序。 对 Schema 中存在但不属于这些输出的普通字段排序,返回 HTTP 400 参数错误, 不再像旧 terms 分组路径一样静默忽略;即使该字段是聚合输入,也不能据此排序。 分组查询保留用户指定的排序优先级和方向,再按 group_by 顺序追加尚未排序的分组键升序, 以保证并列结果在 offset/limit 分页时具有确定顺序;未指定排序时按全部分组键升序。 分组查询的显式排序统一为升序 NULL 在前、降序 NULL 在后;PostgreSQL 源库 与索引路径采用相同规则。普通明细查询保留各连接器已有的 NULL 排序语义。

output_fields
Array of strings

指定输出字段列表。显式指定的字段必须全部合法;任一字段不存在时整单拒绝,返回 HTTP 400 VegaBackend.Query.InvalidParameter.OutputField,不静默删除字段。 字段存在但当前查询通道不支持读取时返回 HTTP 400 VegaBackend.Query.UnsupportedOutputField;默认投影没有可查询字段时返回 HTTP 400 VegaBackend.Query.NoQueryableFields。真实源连接、执行故障不归入这些错误。 省略或传空列表使用默认投影。本地索引通道对 Binary/Other 字段保留 unavailable 展示语义,显式请求与默认投影一致;该占位表示索引中无法读取原值。 聚合查询只能指定分组字段和实际聚合结果别名(未指定 alias 时为 __value); 其他源字段不能作为聚合输出。显式选择仅裁剪结果列,不改变分组、排序、分页、行数或 total。 派生逻辑视图的非聚合查询可指定 _score;索引通道返回真实 相关性分数,source 表查询不返回该元字段,不补零或伪造分数。

binary_mode
string
Default: "metadata"
Enum: "metadata" "content"

Binary 字段的返回形式。省略时按 metadata 处理并返回字节长度;content 返回 Base64 编码内容与字节长度。cursor 续页不得重复传递。

ignore_local_index
boolean
Default: false

是否跳过可用的本地索引并查询表的原始数据源;默认 false。仅对 table resource 生效。cursor 续页不得重复传递。

need_total
boolean
Default: false

是否在响应里携带 total_count。cursor 首次请求的值会被冻结;续页携带的值被忽略。

object (Aggregation)
Array of objects (GroupByItem)

索引分组使用同一 PIT 的 composite 分页,保留 NULL/缺失键及多维 NULL 组合, 输出真正的 JSON null;空字符串、0、-1 和字符串 "NULL" 保持独立。 所有索引分组都要求源端支持 OpenSearch PIT 创建、搜索及关闭 API, 包括省略 aggregation,以及 count_distinct 默认或显式允许近似的查询。 PIT API 从 OpenSearch 2.4 引入,因此低于 2.4 的版本不支持此分组路径; 版本达到 2.4 仍须满足所用 API、参数和读取权限要求,不代表各版本均已验收。 当前不适配 Elasticsearch 的 /_pit API,不能因其支持 PIT 就视为兼容索引分组。 创建 PIT 时源端返回 400/404,转换为 HTTP 400 参数错误;401/403 转换为 源端读取权限错误。不回退到 terms 或自动切换查询通道。 日历分组仅返回存在文档的日期,不补齐缺口。COUNT/COUNT_DISTINCT 忽略空值, 已有分组内度量全为空时计数为 0,SUM/AVG/MIN/MAX 为 null。 SUM/MIN/MAX 的 Decimal 结果先按字段有效 scale 做 HALF_UP 归一化; 输出、HAVING、排序及分页使用同一个归一化值,AVG 保留既有结果精度。 HAVING 在聚合值归一化之后执行,再进行全局排序与 offset/limit 截取。 源库及索引未指定排序时按 group_by 顺序对分组键升序排序,NULL 在前; 显式排序并列时以尚未排序的分组键升序打破并列。索引路径由此替代旧 terms 的默认桶顺序。 每页 1000 桶,单页响应最多 8 MiB,保留分组状态计费预算 16 MiB, 整次执行最多 30 秒(更短请求超时优先),与精确去重共享每进程 4 个扫描槽位。 超预算返回 HTTP 422 VegaBackend.Query.ExecutionBudgetExceeded; 用户 limit 只截取完整计算后的结果,较小 limit 不减少扫描范围,也不绕过预算。 旧 terms 曾返回 top-N 的高基数查询,现在可能因完整扫描超预算而返回 422。 超时、分片失败或扫描不完整不返回部分结果。内部 composite 续页不开放公开聚合 cursor。

object (HavingClause)

Responses

Request samples

Content type
application/json
Example
{
  • "filter_condition": { },
  • "paging": {
    },
  • "sort": [
    ],
  • "output_fields": [
    ],
  • "binary_mode": "metadata",
  • "ignore_local_index": false,
  • "need_total": false,
  • "aggregation": {
    },
  • "group_by": [
    ],
  • "having": {
    }
}

Response samples

Content type
application/json
Example
{
  • "is_approximate": true,
  • "query_source": "local_index",
  • "entries": [
    ],
  • "total_count": 0,
  • "paging": {
    },
  • "warnings": [
    ]
}

按指定 ID 批量完整替换 Dataset 文档(upsert)

仅支持 Dataset。按 entry 的 _id 创建或完整替换文档,未提供的旧字段不保留。 每次提交 1–1000 条,请求体不超过 32 MiB。

_id 必须是非空白的有效 UTF-8 字符串,最多 512 字节,同批不能重复。 ID 校验失败时整批返回 400;任一文档校验或向量生成失败时整批返回错误,不写入文档。

写入结果按输入顺序返回,可能部分成功,请逐条检查 status、error_code 和 retryable。 outcome_unknown 表示可能已经写入,重试前应核验结果,并避免旧数据覆盖新数据。

Authorizations:
OAuth2
path Parameters
id
required
string

Resource ID

Request Body schema: application/json
required
required
Array of objects [ 1 .. 1000 ] items

Responses

Request samples

Content type
application/json
{
  • "entries": [
    ]
}

Response samples

Content type
application/json
{
  • "entries": [
    ]
}

获取一个或多个 dataset 文档

按请求 ID 顺序返回 { "entries": [...] },单 ID 也使用同一响应结构。 默认严格:任一文档不存在即返回 404。?ignore_missing=true 时跳过缺失文档。

category 限制:仅 dataset。Resource 当前不可查询时返回 409,状态优先级和 列表查询一致。

Authorizations:
OAuth2
path Parameters
id
required
string

Resource ID

docid
required
string

文档 ID 或以逗号分隔的文档 ID 列表。服务端会删除空白项并保留首次出现的 ID; 处理后没有 ID 时返回 400。PUT 仅接受单个文档 ID。

query Parameters
ignore_missing
boolean
Default: false

容忍缺失文档,跳过而非返回 404;默认 false

Responses

Response samples

Content type
application/json
{
  • "entries": [
    ]
}

完整替换一个 dataset 文档(upsert)

docid 是目标文档 ID。body 中的 _id 会被路径参数覆盖;文档已存在时完整替换, 不存在时以该 ID 创建,不支持 patch/merge 更新。

对 string / text 字段上的 vector Feature:若 body 显式携带派生字段 <field>_vector,服务端校验后直接使用;否则源文本非空时同步生成向量。生成或 校验失败时不会向 OpenSearch 写入该文档。

category 限制:仅 dataset。

Authorizations:
OAuth2
path Parameters
id
required
string

Resource ID

docid
required
string

文档 ID 或以逗号分隔的文档 ID 列表。服务端会删除空白项并保留首次出现的 ID; 处理后没有 ID 时返回 400。PUT 仅接受单个文档 ID。

Request Body schema: application/json
required
_id
string

文档 ID

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "_id": "string"
}

Response samples

Content type
application/json
{
  • "id": "string"
}

按 ID 删除一个或多个 dataset 文档

默认严格:服务端在删除前核验全部文档,任一不存在即返回 404,且不发起删除。 ?ignore_missing=true 时跳过不存在的文档,仅删除已找到的文档。

这是一请求内的预检语义;预检后发生的并发删除仍可能使底层批量删除失败。 category 限制:仅 dataset。

Authorizations:
OAuth2
path Parameters
id
required
string

Resource ID

docid
required
string

文档 ID 或以逗号分隔的文档 ID 列表。服务端会删除空白项并保留首次出现的 ID; 处理后没有 ID 时返回 400。PUT 仅接受单个文档 ID。

query Parameters
ignore_missing
boolean
Default: false

容忍缺失文档,跳过而非返回 404;默认 false

Responses

Response samples

Content type
application/json
{
  • "error_code": "string",
  • "description": "string",
  • "error_details": null,
  • "metadata": { }
}