本文介绍如何创建和连接阿里云 Elasticsearch AI 引擎版实例,以及如何使用 Collection、Slice、向量检索和数据管理 API。
使用流程
下表列出从开通到运维的完整路径,以及每个阶段对应的章节。
阶段 | 操作 | 对应章节 |
1 准备 | 创建 AI 引擎版实例,配置网络、账号、索引节点和查询节点;连接实例并验证账号权限和网络连通性。 | 准备实例 |
2 选型 | 在命名空间模式和向量簇召回模式之间选择一种。模式创建后不能修改。 | 选择 Collection 模式 |
3 跑通 | 按所选模式创建 Collection、规划 Slice,并完成一次写入和查询。 | 快速入门 |
4 管理 | 调整 Collection 容量参数和 Mapping,注册、列出和删除 Slice。 | 管理 Collection 和 Slice |
5 集成 | 接入应用:批量写入、控制 Refresh 可见性、指定查询范围、按需 Reindex。 | 写入、读取与查询 |
6 增强 | 按需使用缓存预热、DiskBBQ 向量索引、Collection Alias 和 Copy Slice。 | 进阶能力 |
7 运维 | 通过集群监控和 CAT API 观察运行状态,配置角色权限,清理不再使用的 Collection。 | 运维与权限 |
参考 | 查阅与传统 Elasticsearch 的差异、使用限制和 API 清单。 | 参考 |
示例使用 Kibana Dev Tools 支持的 Console 语法。使用其他 HTTP 客户端时,请配置实例地址、身份认证和必要的 TLS 参数。本文适用于 AI 引擎版 9.99.0,文中的请求路径、参数和使用限制均按该版本给出;其他版本可能存在差异,请使用与控制台实例版本对应的文档。示例将 index.number_of_replicas 设置为 2,用于满足查询高可用的基本要求;主分片数、向量维度和其他容量参数仅用于说明 API,生产配置应以容量评估和压测结果为准。本文只介绍应用开发和日常管理所需的常用 API,而非全部接口。产品定位、核心架构、产品优势、通用场景和性能参考,请参见功能概述。
准备实例
前提条件
已开通阿里云 Elasticsearch 服务,并已创建或准备创建 AI 引擎版实例。
已规划实例所在的 VPC、交换机、访问白名单和客户端网络。
已根据业务数据设计 Mapping。向量检索场景还需要确定向量模型、维度、相似度和更新方式。
操作账号具有相应权限。Collection 管理通常需要
manage,数据读取需要read,数据写入需要write;详细权限见本文后续说明。
创建实例
实例购买项和页面布局可能随地域、版本和产品阶段调整,以下步骤以控制台实际页面为准。AI 引擎版支持的地域和可用区以购买页实际可购买项为准。
登录阿里云 Elasticsearch 控制台,进入实例创建页面。
选择AI引擎版,并选择控制台提供的地域和可用区。该实例类型的 Elasticsearch 版本固定,创建页显示为 9.x 且不可选;实例创建完成后,可在实例列表或实例详情页查看具体的版本号。
根据写入负载配置索引节点(Index 节点),根据查询负载配置查询节点(Search 节点);其他可选组件以控制台为准。
配置专有网络、虚拟交换机、登录名和登录密码。访问白名单不在创建页配置,需要在实例创建完成后进入实例的安全配置页设置。
确认配置和费用后创建实例。实例状态变为可用后,记录 Elasticsearch 和 Kibana 的访问地址。
节点规格、节点数量下限及专有主节点配置以购买页当前可选项为准。
节点数量和规格应分别依据写入吞吐、查询并发、向量索引构建、活跃数据集及缓存需求确定。调整节点的具体操作和计费规则以控制台为准。
连接实例
您可以使用 Kibana Dev Tools、Elasticsearch 兼容客户端或任意 HTTP 客户端访问实例。实例地址、网络白名单、证书和认证方式以实例详情页为准。
AI 引擎版的访问域名因网络类型而异。域名只决定请求首先接入的节点角色,不限制请求类型。集群会将请求转发给实际负责处理的角色节点。
网络类型 | 域名 | 入口挂载节点 | 请求处理方式 |
私网 | 控制台显示的默认 Elasticsearch 私网域名 | 查询节点 | 支持读写。写入请求会转发给索引节点处理。 |
私网 |
| 索引节点 | 支持读写。查询请求会转发给查询节点处理。请将 |
公网 | 控制台显示的默认 Elasticsearch 公网域名 | 查询节点 | 公网只提供该域名,支持读写;写入请求会转发给索引节点处理。 |
通过私网访问时,两个域名在功能上都支持读写。生产环境建议查询请求使用默认私网域名,写入请求使用索引节点私网域名,以减少对查询节点的网络带宽占用。Bulk 写入、返回结果较大的查询或高并发场景尤其需要区分使用。通过公网访问时,读写请求均使用默认公网域名。
例如,实例 ID 为 es-cn-xxx 时,索引节点私网域名为 es-cn-xxx-index.elasticsearch.aliyuncs.com。协议、端口和网络访问方式以控制台显示的信息为准。
实例默认使用 HTTP。若您在控制台主动开启 HTTPS,请将客户端连接协议切换为 HTTPS。
在 Kibana Dev Tools 中执行以下请求验证连接:
GET /AI 引擎版 9.99.0 对应 Elasticsearch 内核版本 9.5.0,因此该请求返回的 version.number 为内核版本号,与控制台显示的 9.99.0 不同。后续 Elasticsearch 实际版本以集群 API 返回结果为准。安装自定义插件时,请使用与 AI 引擎版匹配的 9.99.0 版本号。
使用 cURL 时,请替换实例地址和凭据。生产环境不要在脚本或命令历史中明文保存密码:
curl --user '<username>:<password>' 'http://<elasticsearch-endpoint>/'使用官方客户端时,请根据实例版本的 API 兼容性说明选择客户端版本,并复用客户端连接池,不要为每个请求重复创建客户端。
选择 Collection 模式
模式对比
Collection 提供命名空间模式和向量簇召回模式,两种模式二选一。模式由创建参数 slice_strategy 决定,创建后不能修改,并会影响 Slice 的业务含义、注册方式以及写入和查询路由。
对比项 | 命名空间模式 | 向量簇召回模式 |
|
|
|
Slice 的含义 | 一个由业务标识确定的命名空间,例如知识库、代码仓库、Agent 或租户。 | 离线聚类得到的一个向量簇。 |
使用前提 | 应用在发送请求前已经知道要访问的命名空间。 | 应用能够离线生成并持续维护向量簇及其中心向量。 |
写入路由 | 通过 | 通过 |
查询路由 | 通过 | KNN 查询可以根据查询向量自动选择并查询多个候选 Slice,也可以显式指定 |
|
|
|
适用场景 | 查询前能够根据租户 ID、知识库 ID、代码仓库 ID 等业务标识确定数据范围。例如,多租户 RAG 只需检索当前租户的知识库。 | 查询时只有查询向量,无法预先确定目标数据范围;数据已经完成离线聚类,需要从大规模向量库中自动召回最相关的多个向量簇。例如,在全量商品库中查询相似商品。 |
不适用场景 | 无法预先确定查询范围,需要系统根据查询向量自动发现相关向量簇。 | 无法提供可靠的聚类中心、数据规模较小,或者每次查询都必须覆盖全部向量数据。 |
向量簇召回模式会根据向量簇中心自动选择多个候选 Slice,并向这些 Slice 并行发起查询,但这并不表示存储向量时必须使用该模式。命名空间模式同样支持 dense_vector、KNN 和 DiskBBQ。仅当业务需要自动召回相关向量簇,并且已经完成聚类中心维护和召回率评测时,才选择向量簇召回模式。
选择命名空间模式后,请参见“快速入门 > 命名空间模式”。选择向量簇召回模式后,请参见“快速入门 > 向量簇召回模式”。本文其他 Collection 管理、数据 API、缓存预热、Alias、Copy Slice 和观测能力,如无特别说明,均适用于两种模式。
查询副本与高可用
两种模式的查询均由查询节点上的副本分片提供。index.number_of_replicas 至少需要设置为 1,否则无法提供查询。设置为 1 仅满足基本查询要求,不具备查询高可用能力。生产环境至少设置为 2,并配置至少两个查询节点,才能在单个查询节点故障时继续提供查询。
访问约定
应用始终通过 Collection 名或 Collection Alias 访问数据。
命名空间模式的写入和查询通过
_slice指定命名空间。查询未提供_slice时会失败;确需查询全部 Slice 时,显式使用_slice=_all。部分文档和查询 API 也兼容使用routing,具体范围见下文。向量簇召回模式写入时通过
_slice或routing_field指定向量簇;KNN 查询可以根据查询向量自动选择多个候选 Slice。无法自动选择候选 Slice 的查询仍需显式提供_slice,或在兼容 API 中使用routing。Slice 用于组织数据和限定查询范围,不是账号权限边界。需要租户权限隔离时,应结合应用鉴权和产品支持的安全机制。
不要保存或直接访问
.sc-*底层索引(Backing Index)。其名称和生命周期由系统管理。部分接口的响应体(如写入响应的_index、注册 Slice 响应的backing_index)会返回该名称,仅用于观察和排查,不应作为后续应用请求的目标。配置角色权限时需要使用.sc-<collection>-*通配符,请参见“运维与权限 > Collection 权限”。
routing 兼容参数
对 Collection 或 Collection Alias 使用本文列出的文档读写与查询 API 时,可以用 Elasticsearch 标准 routing 代替 _slice。该写法用于兼容已有客户端,新应用仍建议使用语义更明确的 _slice;同一个 URL 或同一个 Bulk、MGet item 不能同时提供两者。
该兼容方式不适用于 Collection 和 Slice 管理、缓存预热、Copy Slice、CAT、显式 Refresh 或 Reindex。Reindex 必须使用 source._slice 和 dest._slice。routing_field 是根据文档字段推导 Slice 的配置,并非 routing 的别名。
API 通用约定
JSON 请求使用
Content-Type: application/json;Bulk 和 Multi Search 使用Content-Type: application/x-ndjson,并保留请求体末尾换行符。Bulk、Multi Search 和批量管理接口可能出现 item 级失败。应用不能只判断 HTTP 状态码。注册 Slice 的单个接口和批量接口同样采用 item 级错误:请求整体返回 HTTP
200,但顶层errors可能为true,需要逐个检查items[].result。HTTP
429表示服务端当前拒绝请求。客户端应采用有上限的指数退避,并只重试适合重试的操作。连接超时或 HTTP
5xx不代表写入一定没有发生。使用稳定文档 ID 或其他幂等机制核对后再重试。通过 URL 传递大量
_slice时,需要注意 HTTP 请求行的长度上限为 4096 字节。Slice 名较长时,可能在达到 Slice 数量上限之前先触发too_long_http_line_exception。
Collection 管理 API 常用以下查询参数,具体支持范围以各接口说明为准。
参数 | 常见默认值 | 说明 |
|
| 等待主节点处理请求的最长时间。 |
|
| 等待确认或当前结果的最长时间。 |
管理请求返回 acknowledged=false 或发生超时,不表示服务端操作已经回滚;重试前应先查询资源当前状态。
快速入门
命名空间模式:按 Slice 进行 DiskBBQ 向量检索
某企业知识库平台为多个租户提供检索增强生成(RAG)服务。应用完成租户鉴权后,可以确定当前租户 ID。用户提问时,只需要从该租户的知识库中召回语义相关的内容分段。
该场景在请求发起前已经能够确定查询范围,适合使用命名空间模式。本示例创建名为 knowledge-chunks 的 Collection,把每个租户作为一个 Slice。应用通过 _slice 指定租户知识库,再使用 DiskBBQ 在选定 Slice 内执行 KNN。Slice 用于组织数据和限定查询范围,租户鉴权仍由应用或受支持的 Elasticsearch 安全机制负责。
步骤一:创建命名空间模式 Collection
PUT /_slice_collection/knowledge-chunks
{
"settings": {
"index.number_of_shards": 2,
"index.number_of_replicas": 2
},
"mappings": {
"properties": {
"tenant_id": { "type": "keyword" },
"document_id": { "type": "keyword" },
"title": { "type": "text" },
"content": { "type": "text" },
"category": { "type": "keyword" },
"updated_at": { "type": "date" },
"embedding": {
"type": "dense_vector",
"dims": 4,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "bbq_disk"
}
}
}
}
}返回结果如下。acknowledged 为 true 表示 Collection 元数据创建成功。
{
"acknowledged": true
}exact 是默认策略,且默认启用 auto_create_slice。因此,首次写入一个不存在的 Slice 时,系统会自动注册,无需提前调用注册 API。
步骤二:写入不同 Slice
向 tenant-a 写入一条知识库内容分段:
PUT /knowledge-chunks/_doc/chunk-1001?_slice=tenant-a
{
"tenant_id": "tenant-a",
"document_id": "doc-refund-policy",
"title": "退款与退货政策",
"content": "重复购买的商品可以在订单完成后的七天内申请退款。",
"category": "after-sales",
"updated_at": "2026-07-30T10:00:00Z",
"embedding": [0.82, 0.10, 0.05, 0.03]
}向 tenant-b 写入另一条知识库内容分段:
PUT /knowledge-chunks/_doc/chunk-1002?_slice=tenant-b
{
"tenant_id": "tenant-b",
"document_id": "doc-shipping-status",
"title": "查询物流状态",
"content": "在订单详情页打开物流信息,即可查看最新配送状态。",
"category": "shipping",
"updated_at": "2026-07-30T10:01:00Z",
"embedding": [0.12, 0.78, 0.06, 0.04]
}文档 _id 只需要在同一个 Slice 内唯一。同一个 _id 可以出现在不同 Slice 中。
步骤三:读取和执行 Slice 内向量检索
读取 tenant-a 中的指定文档:
GET /knowledge-chunks/_doc/chunk-1001?_slice=tenant-adense_vector字段默认不包含在返回的_source中。如需返回向量值,请显式指定_source_includes,例如GET /knowledge-chunks/_doc/chunk-1001?_slice=tenant-a&_source_includes=embedding。返回值为 float32 精度,与写入的十进制字面量可能存在微小差异。
向量查询依赖数据完成 Refresh。完成写入后,请等待至少一个自动 Refresh 周期,再执行以下查询。当前实例的自动 Refresh 间隔可通过 GET /knowledge-chunks/_settings 查看 index.refresh_interval 的取值。
只在 tenant-a 中执行 DiskBBQ KNN 查询:
POST /knowledge-chunks/_search?_slice=tenant-a
{
"knn": {
"field": "embedding",
"query_vector": [0.80, 0.12, 0.05, 0.03],
"k": 10,
"num_candidates": 100
},
"_source": ["document_id", "title", "content"]
}该请求由应用通过 _slice=tenant-a 指定 Slice,DiskBBQ 只负责选定 Slice 内的向量检索,不会根据查询向量自动选择其他 Slice。这是命名空间模式与向量簇召回模式的关键区别。
多 Slice 和全量查询的写法及使用限制,见“写入、读取与查询 > 指定查询范围”。
步骤四:批量写入
Bulk 请求中的每个 item 可以指定自己的 _slice:
POST /_bulk
{ "index": { "_index": "knowledge-chunks", "_id": "chunk-1003", "_slice": "tenant-a" } }
{ "tenant_id": "tenant-a", "document_id": "doc-change-address", "title": "修改收货地址", "content": "订单发货前,可以在订单详情页修改收货地址。", "category": "orders", "updated_at": "2026-07-30T10:02:00Z", "embedding": [0.75, 0.16, 0.06, 0.03] }
{ "index": { "_index": "knowledge-chunks", "_id": "chunk-1004", "_slice": "tenant-b" } }
{ "tenant_id": "tenant-b", "document_id": "doc-invoice", "title": "申请电子发票", "content": "订单完成后,可以在发票管理页面申请电子发票。", "category": "billing", "updated_at": "2026-07-30T10:03:00Z", "embedding": [0.18, 0.70, 0.08, 0.04] }Bulk 请求可能部分成功。调用方必须检查顶层 errors 以及每个 item 的 result 或 error。
刚写入的文档可能尚未出现在查询结果和 CAT 文档数中。如需立即验证,请等待至少一个自动 Refresh 周期。
步骤五:验证 Collection 和 Slice
查看 Collection 的整体状态:
GET /_cat/slice_collection/knowledge-chunks?v查看 Slice 所在的 Backing Index 和文档数:
GET /_cat/slice_collection/knowledge-chunks/slices?v需要以结构化方式分页获取完整 Slice 名单时,使用列出 Slice API:
GET /_slice_collection/knowledge-chunks/slices?page_size=100响应示例:
{
"slices": [
{ "id": "tenant-a" },
{ "id": "tenant-b" }
]
}如果响应包含 next_cursor,将其原样传入下一次请求:
GET /_slice_collection/knowledge-chunks/slices?page_size=100&cursor=<next_cursor>向量簇召回模式:自动选择候选 Slice
某电商搜索平台维护规模较大的商品向量库,并已通过离线聚类把商品划分为数千个向量簇。用户发起相似商品查询时,应用只有查询向量,无法预先确定目标簇。如果每次都查询全部商品数据,查询范围和资源开销会随数据规模增长。
该场景适合使用向量簇召回模式:每个 Slice 对应一个向量簇,并注册该簇的中心向量。执行 KNN 查询时,系统先计算查询向量与各簇中心的相似度,自动选择最相关的多个候选 Slice,再在这些 Slice 中并行执行 DiskBBQ 检索,从而缩小查询范围。
Collection 不负责训练聚类中心,也不会根据文档向量自动决定写入 Slice。应用需要提前计算并注册中心向量。
建议仅在同时满足以下条件时使用:
业务已经能够离线生成并持续维护聚类中心。
数据量和 Slice 数量较大,缩小查询范围能够带来实际收益。
业务允许先选候选簇再执行 KNN 查询,并已通过召回率测试确定合适的候选 Slice 数。
以下场景不建议使用:
数据没有稳定的聚类结构,无法提供可靠的中心向量。
数据量或 Slice 数量较小,直接查询的成本已经可接受。
查询必须覆盖全部向量数据,不能接受候选簇选择带来的召回范围变化。此时应使用命名空间模式,并显式指定
_slice查询范围。
步骤一:创建向量簇召回模式 Collection
PUT /_slice_collection/products
{
"slice_strategy": "vector_cluster",
"auto_create_slice": false,
"settings": {
"index.number_of_shards": 2,
"index.number_of_replicas": 2
},
"mappings": {
"properties": {
"cluster_id": { "type": "keyword" },
"name": { "type": "keyword" },
"embedding": {
"type": "dense_vector",
"dims": 2,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "bbq_disk"
}
}
}
},
"config": {
"routing_field": "cluster_id",
"vector_dims": 2,
"default_query_vector_path": "knn.query_vector",
"default_query_slice_count": 128,
"max_query_slice_count": 512
}
}
| 是否必填 | 说明 |
| 否 | 从写入文档的顶层字段读取 Slice。暂不支持 |
| 是 | Slice 中心向量的维度,取值范围为 |
| 是 | 查询向量在请求中的路径。支持 |
| 否 | 默认候选 Slice 数,默认值为 |
| 否 | 单次查询允许的最大候选 Slice 数,默认值为 |
命名空间模式(exact)不接受非空config,否则返回 HTTP400。
步骤二:注册 Slice 中心向量
注册单个向量簇中心:
PUT /_slice_collection/products/slices/cluster-a
{
"vector": [0.9, 0.1]
}离线聚类任务通常会同时生成多个向量簇中心,可以使用批量接口一次注册:
PUT /_slice_collection/products/slices
{
"slices": [
{
"slice_id": "cluster-b",
"vector": [0.1, 0.9]
},
{
"slice_id": "cluster-c",
"vector": [0.6, 0.4]
}
]
}批量接口一次最多注册 20480 个不重名的 Slice。
单个注册接口和批量注册接口均采用 item 级错误:即使中心向量维度与 config.vector_dims 不一致,请求仍返回 HTTP 200,需要通过顶层 errors 和每个 items 元素的 result 判断是否成功。HTTP 请求成功不代表所有向量簇都注册成功。
每个中心向量的维度必须与 config.vector_dims 一致。没有中心向量的 Slice 仍可被显式访问,但不会参与候选 Slice 的自动选择。
步骤三:写入向量数据
示例配置了 routing_field=cluster_id,因此系统可以从文档顶层字段读取 Slice,无需再传 _slice:
PUT /products/_doc/product-1
{
"cluster_id": "cluster-a",
"name": "example-product",
"embedding": [0.92, 0.08]
}也可以显式提供 _slice=cluster-a,兼容 API 还可以使用 routing=cluster-a。显式指定 Slice 时,该值必须与文档中 routing_field 对应字段(本例为 cluster_id)的值一致,否则返回 HTTP 400。配置 routing_field 后,不支持 scripted update。
步骤四:自动选择候选 Slice
完成写入后,请等待至少一个自动 Refresh 周期,再执行以下查询。
POST /products/_search?query_slice_count=64
{
"knn": {
"field": "embedding",
"query_vector": [0.91, 0.09],
"k": 10,
"num_candidates": 100
}
}自动选择候选 Slice 的参数:
参数 | 说明 |
| 本次选择的候选 Slice 上限。省略或设置为 |
| 覆盖 Collection 的默认查询向量路径;支持 |
query_slice_count 不能超过 max_query_slice_count,否则返回 HTTP 400。
当前仅支持根据请求体中的内联 query_vector 自动选择候选 Slice。Count API 不会自动选择候选 Slice,需要显式提供 _slice。
管理 Collection 和 Slice
本节适用于创建新的逻辑数据集,或调整后续 Slice 的容量和 Backing 分配方式。容量参数决定新 Slice 的分配,不会重平衡现有数据。
创建参数
创建 Collection 的接口为:
PUT /_slice_collection/{collection}查询参数:
参数 | 说明 |
| 等待主节点处理请求的最长时间。 |
| 等待创建确认的最长时间。 |
请求体参数如下。
参数 | 默认值 | 说明 |
|
| Collection 模式。支持命名空间模式( |
|
| 写请求遇到不存在的 Slice 时,是否自动注册。 |
|
| 每个主分片接收新 Slice 的软容量上限。 |
|
| 每个主分片接收新 Slice 的软存储阈值。设置为 |
|
| 新 Slice 的 Backing 选择策略。 |
|
| Backing Index 使用的 Elasticsearch 索引设置。 |
|
| Collection 的 Mapping,会统一应用到各 Backing Index。 |
|
| 创建 Collection 时同时创建的 Collection Alias。仅支持 |
| 无 | 向量簇召回模式( |
如果一个 Backing Index 有 N 个主分片,仅按数量软上限计算时,可接收的 Slice 数为 N × max_slices_per_shard。max_slices_per_shard 和 max_storage_per_shard 只决定后续的新 Slice 是否继续分配到该 Backing:
达到任一阈值后,系统会选择或创建其他 Backing 来承载新 Slice。
已有 Slice 仍然可以继续写入。
修改阈值不会迁移已有 Slice,也不会重新平衡存量数据。
一般场景使用默认的 last 即可。只有在同时存在多个可接收新 Slice 的 Backing,并希望把新注册的 Slice 随机分散时,才使用 random。
查看 Collection
查看一个 Collection:
GET /_slice_collection/knowledge-chunks查看全部 Collection:
GET /_slice_collection该接口支持 master_timeout 查询参数。
{collection} 支持逗号分隔的名称和通配符。精确名称不存在时返回 HTTP 404;通配符没有匹配项时返回空对象。
响应示例:
{
"slice_collections": {
"knowledge-chunks": {
"collection_uuid": "opaque-system-id",
"lifecycle_state": "active",
"max_slices_per_shard": 200,
"max_storage_per_shard": "50gb",
"backing_allocation_strategy": "last",
"future_only_settings": {},
"auto_create_slice": true,
"slice_strategy": "exact",
"max_managed_backing_generation": 0,
"aliases": {}
}
}
}响应还可能包含系统管理的标识和 generation 字段。应用应将其视为不透明信息,不要用于拼接 Backing 名或实现业务逻辑。
更新 Collection
该接口用于调整后续注册 Slice 的分配策略,不会移动已有 Slice。
更新可变配置:
POST /_slice_collection/knowledge-chunks/_update
{
"max_slices_per_shard": 300,
"max_storage_per_shard": "80gb",
"backing_allocation_strategy": "last",
"auto_create_slice": false,
"settings": {
"apack.slice_collection.future.index.number_of_shards": 4
}
}查询参数:
参数 | 默认值 | 说明 |
|
| 等待主节点处理请求。 |
|
| 等待更新确认。 |
|
| 设置为 |
可更新字段包括:
max_slices_per_shardmax_storage_per_shardbacking_allocation_strategyauto_create_slicesettings中允许的后续生效设置
后续生效设置只影响以后创建的 Backing,不修改现有 Backing。默认允许配置:
index.number_of_shardsindex.routing_partition_sizeindex.number_of_routing_shards
在 _update 请求中,后续生效设置需要使用 apack.slice_collection.future. 前缀。例如,index.number_of_shards 对应 apack.slice_collection.future.index.number_of_shards。写入时使用扁平前缀,通过 GET /_slice_collection/{collection} 回读时则以嵌套结构呈现,例如 "future_only_settings": {"index": {"number_of_shards": "4"}}。
成功响应为 {"acknowledged":true}。acknowledged=false 表示等待确认超时,不表示更新已经回滚。
更新 Mapping 和动态 Settings
使用 Collection 名更新 Mapping:
PUT /knowledge-chunks/_mapping
{
"properties": {
"channel": { "type": "keyword" }
}
}使用 Collection 名更新动态索引设置:
PUT /knowledge-chunks/_settings
{
"index.refresh_interval": "5s"
}Mapping 和动态索引设置会应用到当前所有 Backing,并成为后续 Backing 的统一配置。不要逐个修改 Backing Index。
选择注册方式时,可参考下表。
方式 | 适用场景 |
写入时自动注册 | 命名空间模式( |
显式注册一个 Slice | 关闭了 |
批量注册 | 批量开通租户、批量导入数据,或希望在流量到达前准备大量已知 Slice。 |
注册 Slice
当 auto_create_slice=false,或希望在写入前完成资源准备时,可以显式注册 Slice:
PUT /_slice_collection/knowledge-chunks/slices/tenant-c该接口支持 master_timeout 查询参数。
响应示例:
{
"acknowledged": true,
"errors": false,
"items": [
{
"slice_id": "tenant-c",
"result": "created",
"backing_index": ".sc-knowledge-chunks-...-00000"
}
]
}backing_index 仅用于观察和排查,不应作为后续应用请求的目标。
一次最多注册 20480 个不重名的 Slice:
PUT /_slice_collection/knowledge-chunks/slices
{
"slices": [
"tenant-d",
{ "slice": "tenant-e" },
{ "slice_id": "tenant-f" }
]
}该接口支持 master_timeout 查询参数。三种写法可以在同一请求中混用。
批量注册可能部分成功。每个 item 的 result 可能为 created、updated、noop 或 failed。只要存在失败 item,顶层 errors 就为 true。Slice 名不合法时(例如包含 :、首字符非字母数字、使用保留值 _all 或超过长度上限),注册接口同样返回 HTTP 200 并在对应 item 中给出 failed 和错误原因。
分页列出 Slice
GET /_slice_collection/knowledge-chunks/slices?prefix=tenant-&page_size=100参数 | 默认值 | 说明 |
|
| 每页返回数量,取值范围为 |
| 无 | 上一页响应中的 |
| 无 | 只返回名称以指定文本开头的 Slice。 |
结果按 Slice 名升序返回。翻页期间如果并发新增或删除 Slice,分页结果为弱一致;继续翻页时应保持相同的 prefix。
删除 Slice
DELETE /_slice_collection/knowledge-chunks/slices/tenant-c查询参数:
参数 | 说明 |
| 等待主节点处理请求的最长时间。 |
| 等待删除确认的最长时间。 |
成功响应:
{
"acknowledged": true
}删除成功后,同名 Slice 可以重新注册,新数据与后台待清理的旧数据保持隔离。需要注意:
Slice 删除后,指定该 Slice 名的查询返回 HTTP
404(resource_not_found_exception),而不是返回空结果。物理清理完成前,使用
_slice=_all的全量查询可能短暂看到旧数据。删除响应不表示存储空间已经释放。
写入、读取与查询
写入和读取
Collection 复用 Elasticsearch 标准文档 API,并通过 _slice 指定命名空间或向量簇。常用接口如下。
访问方式 | 适用场景 |
单文档 API | 已知文档 ID 和所属 Slice 的实时增删改查。 |
Bulk | 批量写入日志或知识库内容,或者在一个批次中写入多个 Slice。 |
MGet | 已知多组文档 ID,需要一次读取相同或不同 Slice 中的文档。 |
Reindex | 普通索引与 Collection 之间,或不同 Collection 之间的数据迁移。 |
操作 | API |
写入或覆盖文档 |
|
自动生成文档 ID |
|
仅创建文档 |
|
获取文档 |
|
判断文档是否存在 |
|
获取 |
|
更新文档 |
|
删除文档 |
|
使用时请遵循以下规则:
单文档请求只能指定一个 Slice,不能使用逗号分隔或
_all。index、create和update在auto_create_slice=true时可以自动注册不存在的 Slice;读取和删除不会自动注册,指定不存在的 Slice 时返回 HTTP404。部分文档和查询 API 可以使用
routing表示逻辑 Slice,支持范围和冲突规则见“routing 兼容参数”。每次 Bulk 最多自动注册
512个不同的缺失 Slice。已存在的 Slice 不计入该限制。wait_for_active_shards在 AI 引擎版写入链路中不作为等待副本的条件。需要等待文档可被搜索时,使用refresh=wait_for。dense_vector字段默认不包含在返回的_source中,GET /{collection}/_doc/{id}和GET /{collection}/_source/{id}均不返回向量值;如需返回,请显式指定_source_includes。
Refresh 与查询可见性
写入请求成功表示数据已经持久化,不表示数据已经可以被查询节点查询。AI 引擎版采用无状态架构,Refresh 需要由索引节点生成并发布新的 Commit,再由查询节点加载新的可搜索版本,因此是跨节点的分布式操作,开销高于传统有状态 Elasticsearch 的本地 Refresh。
您可以通过 Collection settings 查询和调整 index.refresh_interval,当前取值可通过 GET /{collection}/_settings 查看。较短的 Refresh 间隔会增加资源开销,生产环境建议设置为 5s 或更大;确有低延迟可见性需求时,可根据业务负载适当调小。具体生效值以当前 Collection 的 settings 为准。自动 Refresh 可以设置为 -1 关闭。缩短该间隔前,应先评估 Commit 发布频率、写入吞吐和对象存储 I/O。
根据业务对查询可见性的要求选择以下方式:
方式 | 适用场景 | 注意事项 |
省略 | 持续 Bulk 导入、日志写入等吞吐优先场景。 | 写入立即返回,由后台 Refresh 使数据进入查询结果。 |
| 写入完成后必须立即发起查询的读后写场景。 | 等待下一次分布式 Refresh,不会主动缩短 |
| 低频、确实需要立即可见的少量写入。 | 会触发即时分布式 Refresh,响应中包含 |
| 低频运维或批量导入后的统一可见性确认。 | 会刷新 Collection 当前的所有 Backing,不能通过 |
index.refresh_interval=-1 会关闭自动 Refresh。此时,使用 refresh=wait_for 的写入会持续等待,直到其他请求触发显式 Refresh,因此不能在没有显式刷新流程的情况下组合使用。生产环境需要读后写时,应根据业务时延要求选择等待自动 Refresh 或显式刷新,并评估分布式 Refresh 开销。Refresh 只解决查询可见性,不代表全部查询副本已经可用,也不能替代查询探针和高可用检查。
Bulk
每个 Bulk item 可以在 action metadata 中提供自己的 _slice,如快速入门中的示例。一个批次全部写入同一 Slice 时,也可以在 URL 上提供默认值:
POST /knowledge-chunks/_bulk?_slice=tenant-a
{ "index": { "_id": "chunk-2001" } }
{ "tenant_id": "tenant-a", "document_id": "doc-account-security", "title": "账号安全设置", "content": "管理员可以在安全设置页面启用多因素认证。" }item 中的 _slice 可以覆盖 URL 默认值。命名空间模式不会从文档字段推导 Slice,即使文档体中包含 tenant_id 等字段,实际写入位置仍由 _slice 决定。错误处理方式见“API 通用约定”。
Multi Get
MGet 适合一次读取多个已知 ID;每个 item 可以访问不同的 Slice:
POST /knowledge-chunks/_mget
{
"docs": [
{ "_id": "chunk-1001", "_slice": "tenant-a" },
{ "_id": "chunk-1002", "_slice": "tenant-b" }
]
}URL 上的 _slice 可以作为默认值,每个 item 可以覆盖该默认值。每个 item 最终只能解析到一个 Slice。
Reindex
Reindex 适合在普通索引与 Collection 之间,或不同 Collection 之间迁移数据。在同一个 Collection 内复制一个 Slice 时,使用 Copy Slice。
当源端是 Collection 时,必须在请求体中显式指定 source._slice,否则返回 HTTP 400。当目标端是 Collection 时,只能指定一个目标 Slice,并且目标值必须采用 ={slice} 格式:
POST /_reindex
{
"source": {
"index": "source-knowledge-chunks",
"_slice": "tenant-a,tenant-b"
},
"dest": {
"index": "target-knowledge-chunks",
"_slice": "=tenant-archive"
}
}目标 Slice 不存在时会自动注册。顶层 slices 参数表示 Elasticsearch Reindex 的并行度,与业务 Slice 数量无关。任一侧为 Collection 时,不支持 Reindex script;Collection 作为目标端时不支持显式 ingest pipeline。
Collection 查询继续使用 Elasticsearch Query DSL。本节只说明 AI 引擎版增加的 Slice 查询范围;本文未列出的 Query DSL 和查询能力,以 9.99.0 实例实际开放范围为准。
显式指定 _slice 的查询方式适用于两种模式。命名空间模式通常必须明确给出查询范围;向量簇召回模式的 KNN 查询可以自动选择多个候选 Slice,具体方法见“快速入门 > 向量簇召回模式”。
指定查询范围
查询范围 | 适用场景 | 示例 |
单个 Slice | 单租户在线查询、在指定命名空间内检索 |
|
多个 Slice | 已知少量租户的汇总查询、跨少量命名空间查询 |
|
全部 Slice | 离线分析、审计或明确的全量运维查询 |
|
单次查询最多可以指定 1024 个 Slice。
除 Slice 数量上限外,还需要注意 HTTP 请求行的 4096 字节长度上限。使用较长的 Slice 名时,可能在达到 1024 个之前先返回too_long_http_line_exception。此时可以缩短 Slice 名、拆分为多次查询,或改用_slice=_all。
查询列表中可能包含不存在的 Slice 时,可以使用:
GET /knowledge-chunks/_search?_slice=tenant-a,tenant-b&ignore_missing_slice=true不带该参数时,只要有一个 Slice 不存在,整个请求返回 HTTP 404。与 _slice=_all 同时使用时,ignore_missing_slice 无效,会被忽略且不报错。
以下查询接口也支持相同的 Slice 范围参数:
Search 和 Count
Multi search
Search template
Async search
Validate query
Search shards
Update by query 和 Delete by query
Update by query、Delete by query 和 Reindex 会写入或删除数据,必须显式指定目标 Slice,未指定时请求会被拒绝并返回 HTTP 400。
省略 _slice 时查询全部 Slice
默认情况下,命名空间模式的查询需要显式指定 _slice。如果希望未传 _slice 的只读查询自动查询全部 Slice,可以开启以下集群设置:
PUT /_cluster/settings
{
"persistent": {
"apack.slice_collection.search.default_to_all_slices": true
}
}开启后,下面的请求等价于显式传入 _slice=_all:
GET /knowledge-chunks/_search该设置为集群级设置,会影响所有 Collection,并且只适用于 Search、Count 等只读查询接口。全量查询的资源开销通常高于指定 Slice 查询;如果只有少量请求需要查询全部 Slice,建议继续显式使用 _slice=_all。
优化指定 Slice 内的文本检索
如果关键词或全文检索通常只查询指定的一个或少量 Slice,可以在创建 Collection 时开启 index.sliced_postings.enabled,减少查询需要访问的倒排数据范围:
PUT /_slice_collection/knowledge-chunks
{
"settings": {
"index.sliced_postings.enabled": true
}
}该设置默认为 false,只能在创建 Collection 时配置,创建后不能修改。开启后仍可使用 _slice=_all 查询全部 Slice,但无法获得限定 Slice 查询范围带来的主要优化收益。如果业务主要执行全局文本检索,建议保持默认关闭。
开启该设置后不支持completion字段,也不支持为text字段设置fielddata=true。
查询最佳实践
使用命名空间模式时,或者请求不支持自动选择候选 Slice 时,应显式指定一个或少量 Slice,避免把
_slice=_all作为默认访问方式。使用向量簇召回模式时,应通过召回率和查询开销测试确定
query_slice_count,不要盲目增大候选 Slice 数量。_all的查询开销会随 Backing 数量和分片数量增长。执行前应评估查询范围、超时时间和集群负载。对可能不存在的可选 Slice 使用
ignore_missing_slice=true,不要因为单个缺失 Slice 重试整个批次。应用写入、读取、更新和删除同一文档时必须使用一致的 Slice。
进阶能力
预热 Slice 缓存
_warm_slice API 将指定 Slice 后续查询可能访问的数据从对象存储预取到查询节点的共享缓存,从而降低冷数据的首次查询延迟。预热范围包括 DiskBBQ 向量、Slice 相关的倒排索引数据、doc values 和 stored fields,并覆盖该 Slice 所在分片的所有可搜索副本。
预热仅用于优化缓存,只影响后续访问速度,不改变查询结果,也不保证数据在缓存中的驻留时长。
用户即将打开一个长期未访问的知识库、代码仓库或 Agent 记忆空间,可以在首次查询前预热对应 Slice。
批量导入或数据迁移完成后,可以在切换查询流量前预热即将启用的 Slice。
已知某些命名空间将在固定时段出现访问高峰,可以提前预热这些 Slice。
数据访问不可预测、需要一次预热大量 Slice,或者目标 Slice 已经是热点数据时,不建议主动预热。大量预热会占用对象存储和查询节点的网络、缓存及计算资源,还可能淘汰已有热点数据。
发起异步预热
默认以异步方式提交预热任务:
POST /knowledge-chunks/_warm_slice?_slice=tenant-a请求返回 HTTP 200,响应体中的 status 为 ACCEPTED,并包含本次预热任务的 ID:
{
"status": "ACCEPTED",
"message": "cache warm hint accepted",
"task": "<nodeId>:<taskId>"
}使用以下接口查询正在运行的任务:
GET /_tasks/<nodeId>:<taskId>默认情况下,任务完成后不保留结果。如果需要在完成后继续查询任务结果,请在提交时设置 store_result=true:
POST /knowledge-chunks/_warm_slice?_slice=tenant-a&store_result=true异步模式不校验目标 Slice 是否存在。对不存在的 Slice 发起异步预热同样返回 ACCEPTED,但不会执行任何预热,也不会返回错误。批量预热脚本应先确认 Slice 名单,或改用同步模式(同步模式对不存在的 Slice 返回 HTTP 404)。
等待预热完成
需要直接获取预热统计时,可以同步等待:
POST /knowledge-chunks/_warm_slice?_slice=tenant-a&wait_for_completion=true&timeout=60s查询参数如下。
参数 | 是否必填 | 默认值 | 说明 |
| 是 | 无 | 要预热的一个 Slice。两个参数同时存在时,值必须相同,否则返回 HTTP |
| 否 |
| 是否等待所有可搜索副本返回预热结果。 |
| 否 |
| 是否在任务完成后保留结果,供 Tasks API 查询。 |
| 否 | 无 | 等待分片响应的最长时间,例如 |
同步响应包含标准 _shards 信息和以下统计字段:
字段 | 说明 |
| 当前可搜索数据中命中该 Slice 的 Segment 数。 |
| 规划预热范围时读取的文档数。 |
| 请求预热的数据范围数。 |
| 成功预热的数据范围数。 |
| 因文件已被合并或删除等原因跳过的数据范围数。 |
| 请求预热的字节数。 |
使用时请注意:
每次请求只能明确指定一个 Collection 和一个 Slice。缺失的 Slice 不会被自动注册,也不能使用
_all。同一查询分片副本和 Slice 的并发预热请求会合并,无需重复提交。
预热只处理请求发起时已经可搜索的数据。之后变为可搜索的新数据不包含在本次预热结果中。
ranges_skipped大于0不一定表示预热失败;文件在预热期间被合并或删除时,对应范围会被跳过。预热会消耗对象存储读取带宽和查询节点资源。生产环境建议使用默认异步方式,并控制同时预热的 Slice 数量。
预热队列已满时,服务端可能拒绝新请求。客户端应采用有上限的退避重试,不要立即并发重试全部 Slice。
DiskBBQ 向量索引
DiskBBQ 对应 dense_vector 的 bbq_disk 索引类型,是分片内部使用的向量索引能力,不是第三种 Collection 模式。命名空间模式和向量簇召回模式都可以使用 DiskBBQ。本节介绍其配置和查询方法;AI 引擎版的性能参考见《什么是 AI 引擎版》。
向量规模较大,希望通过磁盘原生向量索引降低常驻内存压力。
能够使用业务评测集,在召回率、查询延迟和数据读取开销之间进行调优。
数据集较小、要求精确近邻结果,或尚未完成召回率评测时,不建议直接将 DiskBBQ 作为默认方案。
配置 Mapping
命名空间模式快速入门已经在创建 Collection 时配置了 DiskBBQ。对于尚未创建向量字段的其他 Collection,可以使用 Mapping API 增加字段:
PUT /{collection}/_mapping
{
"properties": {
"embedding": {
"type": "dense_vector",
"dims": 4,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "bbq_disk"
}
}
}
}只指定 "type": "bbq_disk" 时,服务端会补全其余 index_options 默认值。回读 Mapping 可以看到实际生效的配置,其中 rescore_vector.oversample 默认已开启:
{
"index_options": {
"type": "bbq_disk",
"cluster_size": 384,
"flat_index_threshold": -1,
"default_visit_percentage": 0.0,
"rescore_vector": { "oversample": 3.0 },
"bits": 1
}
}向量维度和相似度应与生成向量所使用的模型保持一致。存量向量字段如果需要切换索引类型,建议创建目标 Collection、配置新 Mapping,再使用 Reindex 迁移并重新评测。
执行 KNN 查询
以下请求基于命名空间模式快速入门中的数据,在指定 Slice 中使用 visit_percentage 调整 DiskBBQ 的访问范围:
POST /knowledge-chunks/_search?_slice=tenant-a
{
"knn": {
"field": "embedding",
"query_vector": [0.80, 0.12, 0.05, 0.03],
"k": 10,
"visit_percentage": 10.0
},
"_source": ["document_id", "title", "content"]
}参数 | 说明 |
| 最终返回的近邻数量。 |
| 每个分片访问的向量比例,取值范围为 |
| 未显式指定有效 |
| 增加结构化过滤,减少不相关候选。 |
| 使用原始向量对量化检索得到的候选重打分,可覆盖 Mapping 中的 |
DiskBBQ 和向量簇召回模式作用在不同层级:向量簇召回模式先从全部向量簇中选择候选 Slice,DiskBBQ 再在这些 Slice 所在的物理分片内执行 KNN。两者可以组合使用,但应分别控制 query_slice_count 和向量访问范围,避免查询范围过大。
Collection Alias
Collection Alias 为应用提供稳定的访问名称,可用于统一查询多个 Collection 或切换写入目标。创建 Collection 时可以通过 aliases 字段添加 Alias,也可以使用标准 Elasticsearch _aliases API 管理。
版本迁移:应用始终访问固定 Alias,完成数据准备后把写入目标从旧 Collection 切换到新 Collection。
多 Collection 查询:通过一个 Alias 查询多个使用相同
slice_strategy的 Collection。应用解耦:业务配置只保存 Alias,不直接依赖带版本或日期的 Collection 名。
如果业务依赖 Alias filter 或 routing,或者希望把普通索引与 Collection 放入同一个 Alias,则不适用当前 Collection Alias。
以下示例假设 knowledge-chunks-v1 和 knowledge-chunks-v2 均为采用命名空间模式(exact)的 Collection。将它们加入同一个 Alias,并把 knowledge-chunks-v2 设置为写入目标:
POST /_aliases
{
"actions": [
{
"add": {
"index": "knowledge-chunks-v1",
"alias": "knowledge-chunks-current"
}
},
{
"add": {
"index": "knowledge-chunks-v2",
"alias": "knowledge-chunks-current",
"is_write_index": true
}
}
]
}查看 Alias:
GET /_alias/knowledge-chunks-current从 Alias 中移除一个成员:
POST /_aliases
{
"actions": [
{
"remove": {
"index": "knowledge-chunks-v1",
"alias": "knowledge-chunks-current"
}
}
]
}使用 Alias 时请注意:
同一个 Alias 的成员必须使用相同的
slice_strategy。采用向量簇召回模式(vector_cluster)的成员还必须使用相同的向量维度。多成员 Alias 用于写入时,必须有且只有一个成员设置
is_write_index=true。Search、Count 和 Bulk 等接口可以按 Alias 语义访问多成员 Alias。
单文档 GET 和 MGet 中的每个 item 都必须唯一解析到一个 Collection,因此只能使用单成员 Alias。
当前不支持 Alias
filter、routing、index_routing、search_routing、is_hidden和remove_index。
查询多成员 Alias 时,目标 Slice 必须在全部成员 Collection 中都存在,否则返回 HTTP 404。版本迁移期间新旧 Collection 的 Slice 集合通常不同,此时应显式携带 ignore_missing_slice=true,例如 GET /knowledge-chunks-current/_search?_slice=tenant-a&ignore_missing_slice=true,请求才会跳过缺失成员并正常返回。
Copy Slice 复制数据
Copy Slice 用于把同一 Collection 中一个 Slice 的可复制文档在线写入另一个 Slice。它适合数据搬运,不是时间点快照、备份或原子切流工具。
为某个租户复制一份测试或验证数据,同时保持与源 Slice 相同的 Collection Mapping。
在同一 Collection 内准备新的命名空间,Copy 完成并验证后由应用层切换访问名称。
对一个 Slice 做在线数据搬运,同时允许源 Slice 和目标 Slice 保持可读写。
Copy 期间写入仍可能发生,因此结果不是某个时间点的快照。需要备份、灾备、严格一致快照或原子切流时,不应使用 Copy Slice。
启动异步 Copy
POST /_slice_collection/knowledge-chunks/slices/tenant-a/_copy/tenant-a-copy?wait_for_completion=false
{
"workers": 8,
"batch_size": 5000,
"requests_per_second": -1
}查询参数:
参数 | 默认值 | 说明 |
|
| 是否等待 Copy 完成。设置为 |
|
| 当前 HTTP 请求的等待时间。超时不会停止后台 Copy。 |
请求体参数均为可选:
参数 | 默认值 | 取值范围或说明 |
| 执行节点处理器数的一半,向上取整 |
|
|
|
|
|
|
|
异步请求返回 HTTP 202 Accepted。请保存响应中的 copy_id,并优先使用服务端返回的 status_url 和 cancel_url:
{
"copy_id": "tenant-a-copy:1h",
"completed": false,
"timed_out": false,
"state": "RUNNING",
"source": "tenant-a",
"target": "tenant-a-copy",
"workers": 8,
"progress": { "total": 0, "created": 0, "version_conflicts": 0 },
"status_url": "/_slice_collection/knowledge-chunks/_copy/tenant-a-copy%3A1h",
"cancel_url": "/_slice_collection/knowledge-chunks/_copy/tenant-a-copy%3A1h/_cancel"
}copy_id 由目标 Slice 名和系统生成的后缀组成,其中包含冒号等 URL 保留字符。自行拼接状态查询地址时需要进行 URL 编码,建议直接使用响应返回的 status_url 和 cancel_url。
运行中的响应包含 progress 对象;Copy 结束后,该字段变为 result,并增加表示耗时的 took(单位为毫秒)。文档正文关注的 version_conflicts 即位于 progress 或 result 中。
使用默认的 wait_for_completion=true 时,如果 Copy 在 timeout 内完成,接口返回 HTTP 200;等待超时则返回 HTTP 202 和 timed_out=true,后台 Copy 继续运行。
查询 Copy 状态
GET /_slice_collection/knowledge-chunks/_copy/<copy_id>state 可能为 RUNNING、CANCELLING、SUCCEEDED、FAILED 或 CANCELLED。状态查询即使返回 HTTP 200,也可能包含 state=FAILED,调用方必须检查 state 和 error。
完成状态默认保留 1d,之后查询可能返回 HTTP 404。调用方不应把 Copy 状态接口作为长期审计存储。
保留时长由动态集群设置 apack.slice_collection.copy.reservation_retention 控制,默认值为 1d,最小值为 1h:
PUT /_cluster/settings
{
"persistent": {
"apack.slice_collection.copy.reservation_retention": "1d"
}
}取消 Copy
POST /_slice_collection/knowledge-chunks/_copy/<copy_id>/_cancel取消操作不会删除目标 Slice 或已经复制的文档。取消是异步的:接口返回 HTTP 202 且 state 变为 CANCELLING,需要继续轮询状态直到 state 变为 CANCELLED,此时响应中的 cancel_url 会消失。
Copy 数据语义
源 Slice 和目标 Slice 必须属于同一个 Collection,且名称不能相同。
目标 Slice 不存在时会自动注册,即使 Collection 的
auto_create_slice=false。目标 Slice 已经包含可搜索文档时,Copy 启动请求会被拒绝,返回 HTTP
409,错误类型为target_lifecycle_conflict。Copy 使用 create-only 写入,不覆盖目标 Slice 中已有的同
_id文档;冲突计入version_conflicts,其他文档继续复制。Copy 完成后应检查该字段,并根据业务需要处理同 ID 数据。Copy 期间源 Slice 和目标 Slice 都可以读写,因此结果不是源 Slice 的原子时间点快照。
源 Slice 必须保留能够重建文档的完整
_source。关闭_source、使用 synthetic_source、配置非空_source.includes,或配置无法证明安全的_source.excludes时,Copy 会被拒绝。源 Slice 的 Mapping 包含
semantic_text等推理字段时,当前不支持 Copy。default/final ingest pipeline 不会在 Copy 时重复执行。
文档会按目标当前 Mapping 重新应用,如新增 multi-field 会在目标中生成。
如果需要在 Copy 完成后切换业务流量,请在应用层检查 Copy 状态和结果,再通过业务配置切换到目标 Slice。
运维与权限
集群监控
在控制台实例详情页的左侧导航栏选择 监控与日志 > 集群监控,可以查看实例的运行指标。配置告警阈值时,应根据业务 SLO 和压测基线设置,具体指标名称和告警入口以控制台为准。
常用观测项与控制台指标的对应关系如下。
观测目标 | 控制台指标 | 维度 |
写入吞吐 | 集群写入QPS | 集群级 |
写入延迟 | 集群写入的平均耗时 | 集群级 |
查询吞吐 | 集群查询QPS | 集群级 |
查询延迟 | 集群搜索的平均耗时 | 集群级 |
CPU 使用率 | 节点CPU使用率_ES业务、节点CPU使用率_总 | 节点级 |
堆内存使用率 | 节点堆内存使用率_ES业务 | 节点级 |
拒绝情况 | 写入线程池拒绝的任务数、查询线程池中被拒绝的请求数 | 线程池维度 |
集群监控页面按指标类别分组,不提供索引节点和查询节点的角色分组。需要分别观察两类节点时,请将「资源类型」切换为指定节点,再根据节点名筛选:索引节点名包含-index-,查询节点名包含-search-。AI 引擎版没有 Warm 节点,只需关注索引节点、查询节点以及 AI 引擎版实际提供的监控指标。
CAT API
CAT API 适合人工观察和故障排查。日常总览先查看 Collection;容量或分片异常时再查看 Backing;定位特定命名空间的数据分布和文档数时查看 Slice。应用业务请求不应依赖 CAT 输出。
观察层级 | API | 主要信息 |
Collection |
| 生命周期状态、Backing 数、Slice 数、容量、文档数和存储大小 |
Backing |
| 健康状态、是否接收新 Slice、分片、副本、容量和未分配分片数 |
Slice |
| Slice 所在 Backing、目标分片、副本数和文档数 |
默认列:
观察层级 | 默认列 |
Collection |
|
Backing |
|
Slice |
|
通用查询参数:
参数 | 说明 |
| 是否显示表头。 |
| 输出格式,例如 |
| 只返回指定列。 |
| 按指定列排序。 |
| 指定存储大小单位。 |
| 显示可用列。 |
Slice CAT 还支持 backing={backing} 按完整 Backing 名缩小范围。跨全部 Backing 按 docs.count 排序属于高开销查询,需要显式设置 allow_expensive_search=true。
面向程序处理时,建议使用 format=json 并显式指定列:
GET /_cat/slice_collection/knowledge-chunks?format=json&h=collection,state,backings,slices,docs.count,pri.store.sizeCAT API 面向人工排查和有界运维查询:
Slice CAT 最多返回
10000行,超出时通过 HTTPWarningheader 提示结果不完整。需要完整、稳定分页的 Slice 名单时,使用
GET /_slice_collection/{collection}/slices。docs.count是近实时数据,刚写入但尚未 refresh 的文档可能未被统计。pri.store.size和store.size表示已索引数据大小,不等同于无状态节点的本地磁盘占用,也不包含对象存储中等待清理的历史数据。
删除 Collection
该接口适用于业务数据整体下线或清理本文示例。删除会移除 Collection 的配置和系统管理的数据,操作不可撤销;如果只需要清理某个 Slice,请使用删除 Slice API。
DELETE /_slice_collection/knowledge-chunks查询参数:
参数 | 说明 |
| 等待主节点处理请求的最长时间。 |
| 等待删除确认的最长时间。 |
成功响应:
{
"acknowledged": true
}{collection} 支持逗号分隔的名称。默认配置下不允许使用通配符 * 和 _all,请求会返回 HTTP 400;如需使用,需要调整集群的 action.destructive_requires_name 设置。
存在正在运行或正在取消的 Copy Slice 时,删除返回 HTTP 409。取消 Copy 是异步操作,在 state 变为 CANCELLED 之前删除仍会被拒绝,应确认 state=CANCELLED 后再执行删除。
acknowledged=true 表示逻辑资源和元数据删除已确认;对象存储中的历史索引和 Translog 文件由后台流程异步回收,物理空间不保证在响应返回时立即释放。
Collection 权限
操作 | 所需权限 |
创建、更新、删除 Collection 或 Slice | Collection 上的索引权限 |
调用 | Collection 上的索引权限 |
使用 | 集群权限 |
调用 | Collection 上的索引权限 |
启动或取消 Copy Slice | Collection 上的索引权限 |
获取 Collection、列出 Slice、使用 CAT、查询 Copy 状态 | Collection 上的索引权限 |
文档读写和查询 | 对应的索引权限 |
创建和修改 Collection Alias | Collection 名和 Alias 名上的索引权限 |
配置角色时,索引名称需要同时配置 Collection 名和对应的 Backing 通配符:
<collection>
.sc-<collection>-*例如 Collection 名为 knowledge-chunks 时,需要在角色中配置 knowledge-chunks 和 .sc-knowledge-chunks-*。只配置 Collection 名时,单文档读写、MGet、显式 Refresh 和 _update_by_query 等操作会返回 HTTP 403。
.sc-* 仅用于权限配置。应用仍应通过 Collection 名访问数据,不要直接访问或保存具体的 Backing Index 名称。
Slice 不是租户权限隔离边界。需要权限隔离时,应在应用层或其他受支持的 Elasticsearch 安全模型中实现。
参考
AI 引擎版 9.99.0 采用无状态架构,不会完整继承传统有状态 Elasticsearch(Stateful Elasticsearch)的全部功能、索引设置和运维方式。以下内容仅列出迁移时常见且影响较大的差异,不是全部不兼容功能的完整列表。某项能力未在表中出现,不表示该能力已经支持;使用本文未说明的 Elasticsearch API、索引设置或运维功能前,请先确认实例的实际开放范围,并使用真实业务数据验证。
与传统有状态 Elasticsearch 的常见差异
传统有状态 Elasticsearch 能力或配置 | AI 引擎版 9.99.0 的差异 | 建议 |
Index Lifecycle Management(ILM)、 | 不支持 ILM 策略管理和执行,相关 API 未注册, | 日志和时序数据可在实例开放相应能力时使用 Data Stream Lifecycle;普通索引可通过外部调度任务调用实例已开放的 Rollover、Delete Index 等 API。 |
hot、warm、cold、frozen 数据层级,以及基于 | 不使用传统 | 使用对象存储保存持久数据,分别规划索引节点和查询节点;按业务保留策略管理历史数据,并在实例开放相应能力时使用下采样。 |
Watcher | 不支持 Watcher 的触发、条件和通知执行链,相关 API 未注册。 | 使用云监控、日志服务(SLS)告警、企业告警平台或外部定时任务。 |
旧版 Stack Monitoring 本地采集链路 | 不支持依赖 | 使用控制台监控和日志;需要应用侧观测时,使用实例开放的集群和节点统计 API。 |
Rollup Job 和 | 不支持旧 Rollup 任务及其查询接口,相关 API 未注册。 | 根据数据类型选择 Downsample、Transform 或外部聚合任务,并以实例开放的 API 为准。 |
Searchable Snapshots(可搜索快照)、快照挂载和 frozen 阶段转换 | 不支持 Searchable Snapshot 的挂载语义,挂载接口未注册,也不能沿用 frozen tier 流程。 | 在线数据直接使用对象存储原生索引;备份恢复可在实例开放相关能力时使用普通 Snapshot/Restore。 |
| 不会根据查询节点数量自动调整查询副本。该设置不适用于 AI 引擎版,请不要配置;即使接口接受了设置,也不会自动扩展副本。 | 显式配置 |
| 不支持将 Translog durability 设置为 | 通过 Bulk 大小、并发、刷新频率、分片规划和索引节点容量优化写入吞吐。 |
| 不作为 AI 引擎版写入链路的副本等待条件。即使设置为 | 分别检查写入响应、使用 |
上表中标注为不适用的索引或集群设置,修改请求可能返回 HTTP 200,且回读时能看到新值。请勿据此判断功能已经启用。此外,无状态架构中的副本主要用于查询和缓存,不等同于传统有状态 Elasticsearch 中可晋升为主分片的持久化副本。查询副本数量和查询节点共同决定查询容量与可用性;持久数据由对象存储保存,不能用增加副本数替代备份策略。
使用 Collection 和 Slice 时的限制
以下限制只针对 AI 引擎版中的 Collection 和 Slice 使用方式。它们不代表同名能力对普通索引也一定不可用。
名称和批量上限
约束项 | 限制 |
Collection 名 | 遵循 Elasticsearch 索引和 Alias 命名规则,必须为小写,长度不超过 |
Slice 名 | 长度为 |
单次 Search 的 Slice 数 | 最多 |
单次 Bulk 自动创建的缺失 Slice 数 | 最多 |
单次批量注册的 Slice 数 | 最多 |
列出 Slice API 的 |
|
Slice CAT 返回行数 | 最多 |
Collection 和 Slice API 限制
以下为使用 Collection 和 Slice 时常见的 API 边界,不是 AI 引擎版全部功能的支持清单。
DLS/FLS 不能用于 Collection。带 DLS/FLS 限制的角色可以创建成功,但该角色的用户访问 Collection 时会返回 HTTP
403。Collection 不支持跨集群搜索(CCS)。
Point in Time(PIT)不能直接以 Collection 为目标。
_graph/explore和_termvectors不能以 Collection 为目标,_mtermvectors也不能包含 Collection item。Collection 不支持已废弃的
_knn_search,请使用_search请求中的knn。向量簇召回模式只有在请求中提供内联查询向量时,才能自动选择候选 Slice。
配置
routing_field后,不支持 scripted update。Collection Reindex 不支持 script;以 Collection 为目标时不支持显式 ingest pipeline;远程源端不支持
source._slice。Copy Slice 不支持跨 Collection、原子切流或在运行中动态调整 workers。
源 Slice 的 Mapping 包含
semantic_text等推理字段时,不支持 Copy Slice。Slice CAT 不支持分页、按 Slice 统计存储大小或按 Slice 存储大小排序。
API 速查
以下汇总本文使用场景所需的 9.99.0 公开 API,不是 Elasticsearch 全量 API 清单,也不包含平台内部维护接口。
用途 | API |
创建 Collection |
|
获取 Collection |
|
更新 Collection |
|
删除 Collection |
|
注册一个 Slice |
|
批量注册 Slice |
|
分页列出 Slice |
|
删除 Slice |
|
单文档读写 |
|
批量写入和读取 |
|
查询和计数 |
|
其他查询接口 |
|
预热 Slice 缓存 |
|
查询预热任务 |
|
按查询更新或删除 |
|
Reindex |
|
更新 Mapping |
|
更新动态 Settings |
|
显式 Refresh |
|
管理 Collection Alias |
|
启动 Copy Slice |
|
查询 Copy 状态 |
|
取消 Copy |
|
Collection CAT |
|
Backing CAT |
|
Slice CAT |
|
集群和节点观测 |
|