导入向量数据
在大型搜索分析场景时,您需要将千万级甚至亿级高维向量高效地存入CSS向量数据库中。然而,向量数据体积远超普通文本,且HNSW等复杂索引结构的实时构建会占用大量CPU资源,直接影响写入吞吐量。为了解决这一矛盾,CSS向量数据库不仅支持直观的“浮点数组”导入,还提供了“Base64 编码”方案以压榨网络传输效率;同时,针对非实时检索场景,支持“先写入、后构建”的异步模式。通过这种方式,您可以先利用Bulk接口实现海量数据的急速“落盘”,再在业务低峰期触发离线构建,从而在有限的硬件资源下实现高效的数据接入。
功能介绍
CSS向量数据库支持两种传输格式:
- 浮点数组:标准JSON格式(如[1.0, 2.0]),可读性强,便于调试,适用于小规模数据。
- Base64编码:将单精度浮点数(小端字节序)转换为字符串。在相同维度的向量,Base64编码后的体积仅为JSON数组约1/3,显著降低网络带宽消耗,提升高维向量的处理效率。
根据业务场景可以选择合适的向量数据导入方式。
- 单条数据导入:适用于小规模数据或测试场景。
- Bulk批量导入:适用于大规模数据写入场景,通过合并多个写入请求降低网络开销。
向量数据库采用类LSM-Tree的持久化模型。数据写入时先进入内存缓冲区,随后定期刷新为磁盘上的“索引段(Segment)”。
- 实时构建(默认方式):每产生一个Segment,系统立即为其构建HNSW图索引。这会造成写入抖动,且小Segment的合并会导致向量索引的重复计算。
- 离线构建:通过设置向量索引的“lazy_indexing”为“true”,系统仅保存向量数值。待全量数据导入后,由用户手动触发离线构建接口,系统会一次性完成Segment合并与索引构建,端到端提升写入和索引合并的性能。适用于海量数据离线导入、追求写入吞吐量且在导入期间无需进行实时检索的场景。
约束限制
- 写入的向量维度必须与创建索引时定义的“dimension”严格一致。
- 以Base64编码方式导入数据时,需确保数组已转换为小端字节序后再进行Base64编码,避免解析错误。
- 离线构建API仅适用于业务无实时性要求的场景,要求Elasticsearch集群的镜像版本号不低于7.10.2_24.3.3_x.x.x、OpenSearch集群的版本号为2.19.0。
单条数据导入
- 浮点数组格式
POST my_index/_doc { "my_vector": [1.0, 2.0] } - Base64编码格式
POST my_index/_doc { "my_vector": "AACAPwAAAEA=" }
Bulk批量导入
批量提交时,建议单批次大小控制在5MB ~ 15MB之间(约100~1000条数据),以平衡CPU负载与网络延迟。
- 浮点数组格式
POST my_index/_bulk {"index": {}} {"my_vector": [1.0, 2.0], "my_label": "red"} {"index": {}} {"my_vector": [2.0, 2.0], "my_label": "green"} {"index": {}} {"my_vector": [2.0, 3.0], "my_label": "red"} - Base64编码格式
POST my_index/_bulk {"index":{}} {"my_vector":"AACAPwAAAEA=", "my_label": "red"} {"index":{}} {"my_vector":"AAAAQAAAAEA=", "my_label": "green"} {"index":{}} {"my_vector":"AAAAQAAAQEA=", "my_label": "red"}
Bulk API的详细使用说明请参见Bulk API。
(可选)触发离线构建
当向量字段启用了lazy_indexing(延迟构建索引)功能,则必须在写入数据后执行离线构建。否则VectorQuery标准查询将无法正常执行,系统会返回错误码500,错误信息包含“Load native index failed exception”。要解决此问题,需先完成离线构建操作,再进行查询。
离线构建API仅适用于业务无实时性要求的场景,要求Elasticsearch集群的镜像版本号不低于7.10.2_24.3.3_x.x.x、OpenSearch集群的版本号为2.19.0。
离线构建的执行流程包含两个步骤:
- 合并索引段。
- 基于最终的索引段构建向量索引。
执行以下命令,触发离线构建:
POST _vector/indexing/{index_name}
{
"field": "my_vector"
} | 参数 | 是否必选 | 类型 | 说明 |
|---|---|---|---|
| index_name | 是 | String | 指定需要离线构建的索引名称。 |
| field | 是 | String | 指定需要构建索引的向量字段名称。 约束限制:该字段在Mapping中必须已设置“lazy_indexing”为“true”。 |