使用 Amazon S3 矢量引擎实现高级搜索功能 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon S3 矢量引擎实现高级搜索功能

亚马逊 OpenSearch 服务允许将 Amazon S3 用作向量索引的矢量引擎。此功能可将向量数据卸载至 Amazon S3,同时以低成本维持亚秒级的向量搜索功能。

使用此功能,可以将矢量嵌入 OpenSearch 存储在 Amazon S3 矢量索引中,同时将其他文档字段保留在 OpenSearch 集群的存储中。此架构具有以下优势:

  • 持久性:写入 S3 Vectors 的数据存储在 S3 上,以实现 11 个 9 的数据持久性。

  • 可扩展性:将大型向量数据集卸载至 S3,无需占用集群存储空间。

  • 成本效益:优化向量密集型工作负载的存储成本。

OpenSearch 使用 S3 向量索引有以下要求:

  • OpenSearch 版本 2.19 或更高版本

  • OpenSearch 优化的实例

  • 您 OpenSearch 发布的最新补丁版本

启用 S3 Vectors

创建新域或更新现有域时,可在高级功能部分中选择启用 S3 Vectors 作为引擎选项。当您使用 S3 OpenSearch 向量作为引擎时,此设置允许创建 S3 矢量存储桶。启用此选项后, OpenSearch 请通过以下方式为您的域配置 S3 向量:

  1. 在为您的域名配置的Amazon KMS密钥上创建两个新的授权:

    • 授予 S3 Vectors 后台索引任务解密权限

    • 授予使用权限创建 S3 向量存储桶的GenerateDataKey授权 OpenSearch

  2. 将您的 OpenSearch 域使用的 KMS 密钥配置为 CMK,用于加密所有向量索引数据的其余部分。

使用 S3 向量引擎创建索引

配置域后,可在索引映射中使用 s3vector 作为后端向量引擎,创建一个或多个包含字段的 k-NN 索引。您可以根据具体使用案例,配置不同引擎类型的向量字段。

重要

创建索引期间,仅能使用 s3vector 引擎映射字段定义。创建索引后,您无法使用 s3vector 引擎添加或更新映射。

以下是创建 S3 向量引擎索引的一些示例。

示例:使用 S3 向量引擎创建 k-NN 索引

PUT my-first-s3vector-index { "settings": { "index": { "knn": true } }, "mappings": { "properties": { "my_vector_1": { "type": "knn_vector", "dimension": 2, "space_type": "l2", "method": { "engine": "s3vector" } }, "price": { "type": "float" } } } }

示例:同时使用 S3 向量和 FAISS 引擎创建 k-NN 索引

此示例强调可在同一个索引中使用多个向量引擎这一事实。

PUT my-vector-index { "settings": { "index": { "knn": true } }, "mappings": { "properties": { "my_vector_1": { "type": "knn_vector", "dimension": 2, "space_type": "l2", "method": { "engine": "s3vector" } }, "price": { "type": "float" }, "my_vector_2": { "type": "knn_vector", "dimension": 2, "space_type": "cosine", "method": { "name": "hnsw", "engine": "faiss", "parameters": { "ef_construction": 128, "m": 24 } } } } } }

不支持的示例:创建索引后添加 S3 向量引擎

以下方法不受支持且会失败。

PUT my-first-s3vector-index { "settings": { "index": { "knn": true } } } PUT my-first-s3vector-index/_mapping { "properties": { "my_vector_1": { "type": "knn_vector", "dimension": 2, "space_type": "l2", "method": { "engine": "s3vector" } }, "price": { "type": "float" } } }

功能限制

在索引中使用 s3vector 引擎之前,请考虑以下限制:

s3vector 引擎不支持相关功能和行为
功能 行为

Split/Shrink/Clone 索引

当与knn_vector字段中配置了引s3vector擎的索引一起使用时,它们会 APIs 失败。

快照

使用 s3vector 引擎的索引不支持快照。对于托管域:

  • 自动快照仅包括未使用 s3vector 引擎的索引。

  • s3vector 索引的手动快照请求失败。

注意

虽然不支持快照进行 point-in-time恢复,但s3vector引擎和 OpenSearch 优化实例可提供 11 个 9 的耐久性。

UltraWarm 等级

使用s3vector引擎配置的索引无法迁移到 UltraWarm 层。

跨集群复制

已配置 s3vector 引擎的索引不支持跨集群复制。

意外删除保护

由于使用 s3vector 引擎的索引不支持快照,因此意外删除保护不可用。仍可恢复域中的其他索引。

径向搜索

使用 s3vector 引擎的字段不支持使用径向搜索的查询。

索引文档

使用 S3 矢量引擎创建索引后,您可以使用标准 _bulk API 提取文档。 OpenSearch 使用s3vector引擎自动将knn_vector字段的矢量数据实时卸载到 S3 向量索引。属于其他字段或使用不同引擎的knn_vector字段的数据将由 OpenSearch 其自己的存储层保存。

对于所有已确认的批量请求, OpenSearch 保证所有数据(向量和非矢量)都是持久的。如果请求收到否定确认,则无法保证该批量请求中文档的持久性。最好在删除之前失败的请求之后,使用文档 ID 重试此类请求,以避免在极少数情况下重复文档。

批量索引示例

POST _bulk { "index": { "_index": "my-first-s3vector-index", "_id": "1" } } { "my_vector_1": [1.5, 2.5], "price": 12.2 } { "index": { "_index": "my-first-s3vector-index", "_id": "2" } } { "my_vector_1": [2.5, 3.5], "price": 7.1 } { "index": { "_index": "my-first-s3vector-index", "_id": "3" } } { "my_vector_1": [3.5, 4.5], "price": 12.9 } { "index": { "_index": "my-first-s3vector-index", "_id": "4" } } { "my_vector_1": [5.5, 6.5], "price": 1.2 } { "index": { "_index": "my-first-s3vector-index", "_id": "5" } } { "my_vector_1": [4.5, 5.5], "price": 3.7 }

搜索文档

您可以使用标准 _search API 搜索索引,以执行文本、k-NN 或混合查询。对于配置了s3vector引擎的knn_vector字段的查询, OpenSearch 会自动将查询卸载到相应的 S3 向量索引。

注意

使用s3vector引擎,k-nn 搜索查询支持的最大k值为 100。这意味着搜索结果中最多可以返回 100 个最近邻居。

搜索查询示例

GET my-first-s3vector-index/_search { "size": 2, "query": { "knn": { "my_vector_1": { "vector": [2.5, 3.5], "k": 2 } } } }

你可以使用 s3vector 引擎对 OpenSearch kNN 索引运行经过筛选的矢量搜索。 OpenSearch 应用过滤器作为后置过滤器,并使用基于某些启发式方法的过采样机制来平衡召回和延迟。

带过滤器的搜索查询示例:

GET my-index/_search { "size": 10, "query": { "knn": { "my_vector_field": { "vector": [2.5, 3.5, 1.2, 4.8], "k": 10, "filter": { "range": { "price": { "gte": 10, "lte": 100 } } } } } } }

支持的映射参数

使用 s3vector 引擎时,knn_vector 字段在映射中支持以下参数。

向量字段参数
参数 必需 说明 支持的值
type 显示在文档中的字段类型。 knn_vector
dimension 要提取到索引中每个向量的维度。 >0,<=4096
space_type 用于计算向量间距离的向量空间。 l2, cosinesimil
method.engine 用于索引和搜索的近似 k-NN 引擎。 s3vector
method.name 最近邻方法 ""
store 不适用 启用或禁用此映射参数是无效的,因为 knn_vector 数据未存储在中。 OpenSearch 不支持
doc_values 不适用 启用或禁用此映射参数是无效的,因为 knn_vector 数据未存储在中。 OpenSearch 不支持
重要

使用 s3vector 引擎不支持嵌套 knn_vector 字段类型

计量和计费

有关此功能的计量和账单的信息,请参阅 Amazon OpenSearch 服务定价

禁用 s3vector 引擎

禁用 s3vector 引擎之前,删除当前正在使用该引擎的所有索引。否则,任何禁用引擎的尝试都会失败。

另请注意,启用或禁用 s3vector 引擎会触发域上的蓝绿部署

要禁用 s3vector 引擎,请编辑域配置,并设置 S3VectorsEngine.Enabled: false