本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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 向量:
-
在为您的域名配置的AWS KMS密钥上创建两个新的授权:
-
授予 S3 Vectors 后台索引任务解密权限
-
授予使用权限创建 S3 向量存储桶的
GenerateDataKey授权 OpenSearch
-
-
将您的 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 引擎之前,请考虑以下限制:
| 功能 | 行为 |
|---|---|
Split/Shrink/Clone 索引 |
当与 |
快照 |
使用
注意虽然不支持快照进行 point-in-time恢复,但 |
UltraWarm 等级 |
使用 |
跨集群复制 |
已配置 |
意外删除保护 |
由于使用 |
径向搜索 |
使用 |
索引文档
使用 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。