更新时间:2025-06-28 GMT+08:00
分享

导入向量数据

导入向量数据是将数据写入CSS向量数据库的过程。在向量数据库中,向索引写入向量数据时,需通过指定向量字段名称(如my_vector)和对应的数据格式才能完成数据结构化存储。CSS向量数据库支持两种常见格式:浮点数组格式和Base64编码格式。

  • 浮点数组格式:直接传输可读的数值数组,适用于常规向量数据。
  • Base64编码格式:将向量(小端字节序)编码为字符串,减少网络传输开销,提升高维/二值向量处理效率。

您可以根据数据特点选择适合的格式进行导入。同时,根据使用场景不同,可以选择合适的导入方式。

  • 单条数据导入:适用于小规模数据或测试场景。
  • Bulk批量导入:适用于大规模数据写入场景,通过合并多个写入请求降低网络开销。

约束限制

  • 确保向量字段名称与索引定义一致,且数据维度与索引配置匹配。
  • Base64编码需严格遵循小端字节序规范,避免解析错误。
  • 批量操作建议单次提交100~1000条数据,以平衡吞吐量和内存占用。

单条数据导入

  • 浮点数组格式
    POST my_index/_doc
    {
      "my_vector": [1.0, 2.0]
    }
  • Base64编码格式
    POST my_index/_doc
    {
      "my_vector": "AACAPwAAAEA="
    }

Bulk批量导入

  • 浮点数组格式
    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

(可选)数据导入后处理:离线构建

  • 离线构建API仅适用于业务无实时性要求的场景,要求集群版本大于或等于Elasticsearch 7.10.2,且集群镜像版本号不低于7.10.2_24.3.3_x.x.x。
  • 当向量字段启用了lazy_indexing(延迟构建索引)功能,则必须在写入数据后执行离线构建。否则VectorQuery标准查询将无法正常执行,系统会返回错误码500,错误信息包含“Load native index failed exception”。要解决此问题,需先完成离线构建操作,再进行查询。

Elasticsearch使用类LSM-Tree写入模型,数据持续写入和更新的过程中会生成大量小的索引段,并通过后台合并任务不断合并成大的索引段,以提供更优的查询性能。由于向量索引的构建是计算密集型的,向量数据写入过程频繁的合并任务会消耗更多的CPU资源。因此,在数据实时性要求不高的场景,建议设置向量字段的“lazy_indexing”参数为“true”开启索引延迟构建,当全量数据写入完成后,再调用离线构建API完成向量索引的最终构建。使用离线构建功能可以有效减少合并过程中向量索引的重复构建,能够端到端提升写入和索引合并的性能。

离线构建的执行流程包含两个步骤:

  1. 合并索引段。
  2. 基于最终的索引段构建向量索引。

离线构建API的接口格式如下:

POST _vector/indexing/{index_name}
{
  "field": "{field_name}"
}

其中,{index_name}为需要构建索引的索引名称,{field_name}为向量字段名称且该字段必须已经配置了“lazy_indexing”“true”

相关文档