管理 Collection 与 Slice

更新时间:
复制 MD 格式

创建和调整 Collection 的容量与配置,以及预创建 Backing、注册、查询、列出和删除 Slice。Backing 是系统实际存放文档的底层索引,一个 Backing 可以承载多个 Slice。示例沿用快速入门:按租户或知识库检索中的命名空间模式 Collection knowledge-chunks。创建示例是不同配置的写法,不能在同名 Collection 已存在时重复执行;可更新的参数请使用更新接口,创建后不能修改的参数需要新建 Collection。

创建 Collection

PUT /_slice_collection/{collection}

查询参数:master_timeout(等待主节点处理请求)、timeout(等待创建确认)。

请求体参数如下。

参数

默认值

说明

slice_strategy

exact

Collection 模式。支持命名空间模式(exact)和向量簇召回模式(vector_cluster),创建后不能修改。

auto_create_slice

exact 为 true;vector_cluster 为 false

写请求遇到不存在的 Slice 时,是否自动注册。

max_slices_per_shard

200

必须大于 0,用于按主分片数计算 Backing 接收新 Slice 的数量阈值;不限制单个 Slice 的文档数。详见容量参数如何生效。

max_storage_per_shard

50gb

每个主分片接收新 Slice 的软存储阈值。设置为 0b 可关闭该阈值。

backing_allocation_strategy

last

新 Slice 的 Backing 选择策略。last 优先选择最新可用 Backing;random 从可用 Backing 中随机选择。

settings

{}

Backing Index 使用的 Elasticsearch 索引设置。未显式配置时,index.number_of_replicas 默认为 2。

mappings

{}

Collection 的 Mapping,会统一应用到各 Backing Index。

aliases

{}

创建 Collection 时同时创建的 Collection Alias,仅支持 is_write_index 参数。

config

无

向量簇召回模式的配置,见向量簇召回模式。命名空间模式不接受非空 config,否则返回 HTTP 400。

示例:

PUT /_slice_collection/knowledge-chunks
{
  "max_slices_per_shard": 200,
  "max_storage_per_shard": "50gb",
  "settings": {
    "index.number_of_shards": 2,
    "index.number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "tenant_id": { "type": "keyword" },
      "category": { "type": "keyword" }
    }
  }
}

成功响应:

{
  "acknowledged": true
}

acknowledged=true 表示 Collection 的配置已创建。请求超时或连接失败时,先调用 GET /_slice_collection/knowledge-chunks 确认实际状态,不要靠重试的返回结果判断是否创建成功。

Collection 名需遵循 Elasticsearch 索引和 Alias 命名规则,必须使用小写,长度不超过 128 字节,且不能使用系统保留的 .sc- 前缀。

容量参数如何生效

max_slices_per_shard 是 Collection 创建请求体中的顶层参数,不属于 settings。系统根据 Backing 的主分片数计算其可接收的新 Slice 数量,用于规划多个业务分区如何共用一组底层分片。

系统按 Backing 的整体 Slice 数判断是否继续分配:一个 Backing 有 N 个主分片时,数量阈值为 N × max_slices_per_shard,副本数不参与计算。例如 2 个主分片、参数为 200 时,阈值为 400 个 Slice;这不保证各主分片分到相同数量,也不是每个主分片的严格硬上限。

系统还会异步检查各主分片的文档存储大小,取其中的最大值与 max_storage_per_shard 比较。达到阈值后停止向该 Backing 分配新 Slice;这是新 Slice 的分配阈值,不是实时磁盘容量上限。存储阈值或停止分配状态(CAT 中的 assign=disabled)可能让 Backing 在达到数量阈值前停止接收新 Slice。

max_slices_per_shard 和 max_storage_per_shard 只决定后续的新 Slice 是否继续分配到该 Backing:

  • 达到任一阈值后,系统会选择或创建其他 Backing 来承载新 Slice;

  • 已有 Slice 仍然可以继续写入;

  • 修改阈值不会迁移已有 Slice,也不会重新平衡存量数据。

小 Slice 很多时,可结合压测适当调高该值,减少所需 Backing 的数量;单个 Slice 数据量大或负载高时,可适当调低,让后续新 Slice 更早使用其他 Backing。数量阈值调高后,存储阈值仍然生效,不能仅靠增加该值解决已有数据或查询热点。参数可通过更新 Collection调整。

backing_allocation_strategy 一般使用默认的 last 即可。只有在同时存在多个可接收新 Slice 的 Backing,并希望把新注册的 Slice 随机分散时,才使用 random。调用预创建接口且 count > 1 时,系统会自动切换为 random,详见预创建 Backing。

Backing 默认按需创建。批量开通租户或批量导入数据前,可以先预创建 Backing,见预创建 Backing。

优化指定 Slice 内的文本检索

如果关键词或全文检索通常只查询指定的一个或少量 Slice,可以在创建 Collection 时通过 index.sliced_postings.enabled 减少查询需要访问的倒排数据范围。

默认值: 命名空间模式(exact)未配置或配置为 null 时,默认为 true;向量簇召回模式(vector_cluster)默认为 false。显式配置 true 或 false 时使用配置值。

该设置只能在创建 Collection 时指定,创建后不能修改。

使用 _slice=_all 的全量查询无法获得该优化,通常还会增加查询开销。如果业务主要执行全局文本检索,建议在创建 Collection 时显式关闭。以下仅展示相关设置片段,实际创建时请同时提供所需的 settings、mappings 和分片配置:

PUT /_slice_collection/text-search-demo
{
  "settings": {
    "index.sliced_postings.enabled": false
  }
}

该设置在命名空间模式下默认生效,创建 Collection 前请核对 sliced postings 的字段和编码约束。如有不兼容的字段或配置,请在创建时显式设为 false。

查看 Collection

GET /_slice_collection/knowledge-chunks

列出全部 Collection:

GET /_slice_collection

{collection} 支持逗号分隔的名称和通配符。精确名称不存在时返回 HTTP 404;通配符没有匹配项时返回 {"slice_collections": {}}。

查询参数:

参数

默认值

说明

flat_settings

false

是否用扁平键名返回 settings。

master_timeout

30s

等待 Collection 元数据可用的最长时间。

该接口只需要目标 Collection 上的索引权限 monitor,不需要额外授予集群 monitor 权限。

响应示例:

{
  "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,
      "latest_backing": {
        "settings": {
          "index": {
            "number_of_shards": "2",
            "number_of_replicas": "2"
          }
        },
        "mappings": {
          "properties": {
            "tenant_id": { "type": "keyword" },
            "category": { "type": "keyword" }
          }
        }
      },
      "aliases": {}
    }
  }
}

字段说明:

  • latest_backing 来自最新仍存在的 Backing Index。其中 settings 是该 Backing 当前可继承、可公开的设置,可能包含系统自动补齐或后续更新的字段;mappings 是该 Backing 的当前 Mapping,因此也包含动态新增的字段。

  • future_only_settings 只影响后续创建的 Backing,不代表当前最新 Backing 已经使用这些值。

  • collection_uuid 和 max_managed_backing_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
  }
}

查询参数:

参数

默认值

说明

master_timeout

30s

等待主节点处理请求。

timeout

30s

等待更新确认。

preserve_existing

false

设置为 true 时,保留 settings 中已经存在的同名后续生效设置;缺失的键仍会加入。该参数不阻止请求中的其他字段被更新。

可更新字段:max_slices_per_shard、max_storage_per_shard、backing_allocation_strategy、auto_create_slice,以及 settings 中允许的后续生效设置。

后续生效设置只影响以后创建的 Backing,不修改现有 Backing。默认允许配置:

  • index.number_of_shards

  • index.routing_partition_size

  • index.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 名更新动态索引设置。以下演示将刷新间隔恢复为默认的 5s;创建时无需重复配置该默认值。修改会影响整个 Collection,使用条件见 Refresh 与查询可见性:

PUT /knowledge-chunks/_settings
{
  "index.refresh_interval": "5s"
}

Mapping 和动态索引设置会应用到当前所有 Backing,并成为后续 Backing 的统一配置。同一 Collection 中的所有 Slice 共用这些配置,不能为某个 Slice 单独修改字段类型或索引设置。不要逐个修改 Backing Index。

注册 Slice

选择注册方式时可参考下表。

方式

适用场景

写入时自动注册

命名空间模式中的 Slice 随业务增长动态出现,并且业务可以接受首次写入的额外延迟。

显式注册一个 Slice

关闭了 auto_create_slice、需要先验证名称,或需要为向量簇 Slice 注册中心向量。

批量注册

批量开通租户、批量导入数据,或希望在流量到达前准备大量已知 Slice。

注册一个 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"
    }
  ]
}

slice_id 是业务 Slice 名;backing_index 是内部索引名,仅用于观察和排查,不应作为后续应用请求的目标。文档读取响应中还可能出现与业务名不同的内部路由标识,见请求目标与响应标识。

向量簇召回模式还需要在请求体中提供中心向量,见向量簇召回参考。

批量注册 Slice

PUT /_slice_collection/knowledge-chunks/slices
{
  "slices": [
    "tenant-d",
    { "slice": "tenant-e" },
    { "slice_id": "tenant-f" }
  ]
}

该接口支持 master_timeout。三种写法可以在同一请求中混用,一次最多注册 20480 个 Slice,请求内不能重名。

批量注册可能部分成功。每个 item 的 result 可能为 created、updated、noop 或 failed,只要存在失败 item,顶层 errors 就为 true。Slice 名不合法时(例如首尾不是字母或数字、使用保留值 _all 或超过长度上限),接口同样返回 HTTP 200 并在对应 item 中给出 failed 和错误原因。命名时建议使用字母、数字以及 .、_、-,避免依赖特殊字符。

查询单个 Slice

GET /_slice_collection/{collection}/slices/{slice}

查询参数:

参数

默认值

说明

include_doc_count

false

是否返回当前 Slice 的可搜索文档数 docs.count。

默认响应:

{
  "slice": "tenant-a",
  "backing_index": ".sc-knowledge-chunks-...-00000",
  "created_at": "2026-08-12T00:00:00.000Z"
}

created_at 是 Slice 创建时间,使用 UTC ISO-8601 格式。

仅判断 Slice 是否存在或读取其信息时,使用上述默认请求即可。include_doc_count=true 会额外执行数据查询来统计文档数,不应用于高频轮询或批量检查大量 Slice。确需核对可搜索文档数时再调用:

GET /_slice_collection/knowledge-chunks/slices/tenant-a?include_doc_count=true

响应额外包含:

{
  "docs": {
    "count": 12500
  }
}

使用说明:

  • docs.count 表示当前可搜索的文档数,刚写入但尚未 Refresh 的文档可能暂未计入;

  • 该接口只查询当前有效的 Slice。Collection 或 Slice 不存在、Slice 已删除时返回 HTTP 404;

  • 查询不会创建 Slice;应先显式注册,或在启用自动注册时先写入该 Slice;

  • 该接口不提供单 Slice 存储大小。需要存储统计时,使用 Backing CAT 或原生 Index Stats,见 CAT 观测;

  • 分片和副本是 Backing 级配置。使用 Slice CAT 查看 Slice 实际访问的主分片,使用 Backing CAT 查看副本配置。

分页列出 Slice

GET /_slice_collection/knowledge-chunks/slices?prefix=tenant-&page_size=100

参数

默认值

说明

page_size

100

每页返回数量,取值范围 1~10000。

cursor

无

上一页响应中的 next_cursor,需原样传入。

prefix

无

只返回名称以指定文本开头的 Slice。

响应示例:

{
  "slices": [
    { "id": "tenant-a" },
    { "id": "tenant-b" }
  ],
  "next_cursor": "opaque-cursor"
}

没有下一页时省略 next_cursor。结果按 Slice 名升序返回。翻页期间如果并发新增或删除 Slice,分页结果为弱一致;继续翻页时应保持相同的 prefix。

删除 Slice

删除会使该 Slice 及其中全部文档无法再通过原名称访问,不能通过重新注册同名 Slice 找回旧数据。确认目标业务空间后再执行:

DELETE /_slice_collection/knowledge-chunks/slices/tenant-c

查询参数:

参数

默认值

说明

master_timeout

30s

等待主节点的最长时间,必须为有限值且不超过 5 分钟。

timeout

30s

等待逻辑删除和缓存失效的最长时间。

成功响应:

{
  "acknowledged": true
}

该响应表示原 Slice 名已经不可访问,不表示旧物理数据已经清理完成,也不表示存储空间已经释放。同名 Slice 可以随后重新注册,新数据与后台待清理的旧数据保持隔离。删除、同名重建以及可能自动注册的写入需要由应用协调;删除结果不确定时,先核对 Slice 生命周期状态。同名 Slice 已经重建后,不要盲目按原名称重发 DELETE,否则可能删除新 Slice。此外:

  • Slice 删除后,指定该 Slice 名的查询返回 HTTP 404(resource_not_found_exception),而不是返回空结果;

  • 物理清理完成前,使用 _slice=_all 的全量查询可能短暂看到旧数据;查询具体 Slice 名不会访问已经删除的旧数据。

如果只需要清理某个 Slice,请使用本接口,不要删除整个 Collection。删除 Collection 见 删除 Collection。

删除 Collection

该接口适用于业务数据整体下线或清理示例数据。删除会移除 Collection 的配置和系统管理的数据,操作不可撤销;如果只需要清理某个 Slice,请使用 删除 Slice。

DELETE /_slice_collection/knowledge-chunks

查询参数:master_timeout、timeout。

成功响应:

{
  "acknowledged": true
}
  • {collection} 支持逗号分隔的名称,建议逐一明确要删除的 Collection。默认 action.destructive_requires_name 保护会拒绝通配符 * 和 _all,返回 HTTP 400;不应为方便清理示例而关闭这一集群级保护。

  • 存在 RUNNING 或 CANCELLING 状态的 Copy Slice 时,删除返回 HTTP 409。取消 Copy 是异步操作,应确认 completed=true、Copy 已进入结束状态后再执行删除。

  • acknowledged=true 表示逻辑资源和元数据删除已确认;对象存储中的历史索引和 Translog 文件由后台流程异步回收,物理空间不保证在响应返回时立即释放。

预创建 Backing

默认情况下系统按需创建 Backing Index:注册新 Slice 时,如果现有 Backing 都已达到容量阈值,系统会自动创建下一个 Backing。批量开通大量租户或批量导入数据前,可以提前准备这些底层索引,减少首批 Slice 注册时等待创建索引的延迟。

预创建 Backing 和注册 Slice 是两个操作:前者准备存储数据的索引,后者创建应用要访问的业务分区。预创建不会自动注册租户 Slice,也不会搬移已有数据。 该接口可由具备 Collection manage 权限的账号调用,完整权限配置见Collection 权限。

预创建并查看结果

先创建 Collection,再执行以下请求:

PUT /_slice_collection/knowledge-chunks/backings?count=5

也可以使用等价的请求体写法,二选一即可:

PUT /_slice_collection/knowledge-chunks/backings
{
  "count": 5
}

count 是必填整数,只能在查询参数或请求体中提供一次,即使两处值相同也会被拒绝。取值范围为 1~99999。该接口还支持 master_timeout。

count=5 表示确保 Collection 的前 5 个 Backing 存在,而不是每次再增加 5 个。假设此前只有第一个 Backing,成功后会补齐另外 4 个。下面是这种情况下的示意响应,名称中的省略号代表系统生成的内容,不可直接用于请求:

{
  "acknowledged": true,
  "backings": [
    ".sc-knowledge-chunks-...-00000",
    ".sc-knowledge-chunks-...-00001",
    ".sc-knowledge-chunks-...-00002",
    ".sc-knowledge-chunks-...-00003",
    ".sc-knowledge-chunks-...-00004"
  ],
  "created_backings": [
    ".sc-knowledge-chunks-...-00001",
    ".sc-knowledge-chunks-...-00002",
    ".sc-knowledge-chunks-...-00003",
    ".sc-knowledge-chunks-...-00004"
  ],
  "existing_backings": [
    ".sc-knowledge-chunks-...-00000"
  ]
}

backings 是本次请求涉及的 Backing;created_backings 是本次新增的部分,existing_backings 是原本就存在的部分。它们不一定是 Collection 的完整 Backing 清单,可通过以下接口查看当前清单:

GET /_cat/slice_collection/knowledge-chunks/backings?v

可选:查看 Collection 当前配置。

GET /_slice_collection/knowledge-chunks

对后续 Slice 分配的影响

当 count > 1 时,预创建接口会自动把 backing_allocation_strategy 改为 random,让后续新注册的 Slice 随机选择仍有容量的 Backing。即使本次涉及的 Backing 全部已经存在,也会执行这一策略更新。可通过上面的 GET Collection 请求确认。

以下为可选调整:只有业务仍需优先使用最新 Backing 时,才在预创建后调用更新接口;使用随机分配时跳过此请求。

POST /_slice_collection/knowledge-chunks/_update
{
  "backing_allocation_strategy": "last"
}

批量开通时,推荐随后按注册 Slice准备已知租户,再导入文档;启用自动注册时,也可以直接写入。预创建只准备 Backing,不会增加实例的索引节点或查询节点,也不会重新平衡已有 Slice。

重试与容量规划

  • 重复使用相同的 count 只检查并补齐同一批 Backing;传入较小的 count 不会删除多余 Backing,因此不能用它缩容;

  • 请求超时或连接失败后,已经创建的 Backing 可能仍然存在。先查询清单,再用相同 count 重试;

  • 该操作不迁移已有 Slice,也不改变已有 Slice 的分配结果;

  • 每个 Backing 都是一个独立的 Elasticsearch 索引,会占用主分片、副本和集群元数据资源。请按实际需要的 Slice 数量和容量参数估算,不要预留远超需求的数量;

  • 响应中的 Backing 名称仅用于确认执行结果,不应作为后续应用请求的目标。

新创建的 Backing 使用当前 Collection 的 Mapping 和后续生效设置。如果需要让后续 Backing 使用新的分片数,应先通过更新 Collection修改,再预创建。

Collection Alias

Collection Alias 为应用提供稳定的访问名称,可用于统一查询多个 Collection 或切换写入目标。创建 Collection 时可以通过 aliases 字段添加 Alias,也可以使用标准 Elasticsearch _aliases API 管理。

适用场景:

  • 版本迁移:应用始终访问固定 Alias,完成数据准备后把写入目标从旧 Collection 切换到新 Collection;

  • 多 Collection 查询:通过一个 Alias 查询多个使用相同 slice_strategy 的 Collection;

  • 应用解耦:业务配置只保存 Alias,不直接依赖带版本或日期的 Collection 名。

使用前请核对 Collection Alias 支持范围,确认现有 Alias 配置可用。

如果目的是版本迁移,应先完成数据迁移、处理迁移期间的增量写入,确认新 Collection 的数据已可搜索并预热即将访问的 Slice,再在同一个请求中移除旧 Collection、添加新 Collection。Alias 更新是原子的,但不会自动复制或同步数据。以下示例将读写流量从 knowledge-chunks-v1 原子切换到 knowledge-chunks-v2:

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "knowledge-chunks-v1",
        "alias": "knowledge-chunks-current"
      }
    },
    {
      "add": {
        "index": "knowledge-chunks-v2",
        "alias": "knowledge-chunks-current",
        "is_write_index": true
      }
    }
  ]
}

以下示例用于多 Collection 查询,不用于版本迁移。假设 knowledge-chunks-v1 和 knowledge-chunks-v2 均为命名空间模式 Collection,且两个 Collection 的数据互不重叠。将它们加入同一个 Alias,并把 knowledge-chunks-v2 设置为写入目标。Search 会同时查询两个 Collection;is_write_index 只决定写入位置,不限制查询范围。

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 中查询可能缺失的 Slice:

GET /knowledge-chunks-current/_search?_slice=tenant-a&ignore_missing_slice=true

使用 Alias 时请注意:

  • 多成员 Alias 用于写入时,必须有且只有一个成员设置 is_write_index=true。

  • Search、Count 和 Bulk 等接口可以按 Alias 语义访问多成员 Alias。

  • 单文档 GET 和 MGet 中的每个 item 都必须唯一解析到一个 Collection,因此只能使用单成员 Alias;is_write_index 不会替单目标读取选择成员。

  • Alias 更新原子应用。remove 默认至少匹配一个已有成员即可成功;must_exist=true 对每个具体目标严格校验。响应只返回 acknowledged,不包含逐 action 的结果。

  • 查询多成员 Alias 时,目标 Slice 必须在全部成员 Collection 中都存在,否则返回 HTTP 404。需要查询可能缺失的 Slice 时,显式携带 ignore_missing_slice=true,请求会跳过缺失成员并正常返回。