

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

# 使用 Amazon S3 矢量引擎实现高级搜索功能
<a name="s3-vector-opensearch-integration-engine"></a>

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

借助此功能，可以将矢量嵌入 OpenSearch 存储在 Amazon S3 矢量索引中，同时将其他文档字段保留在 OpenSearch 集群的存储中。此架构具有以下优势：
+ **持久性**：写入 S3 Vectors 的数据存储在 S3 上，以实现 11 个 9 的数据持久性。
+ **可扩展性**：将大型向量数据集卸载至 S3，无需占用集群存储空间。
+ **成本效益**：优化向量密集型工作负载的存储成本。

OpenSearch 使用 S3 向量索引有以下要求：
+ OpenSearch 版本 2.19 或更高版本
+ OpenSearch 优化的实例
+ 您 OpenSearch 发布的最新补丁版本

## 启用 S3 Vectors
<a name="s3-vector-opensearch-integration-engine-enable"></a>

[创建新域](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html)或更新现有域时，可在**高级功能**部分中选择**启用 S3 Vectors 作为引擎选项**。当您使用 S3 OpenSearch 向量作为引擎时，此设置允许创建 S3 矢量存储桶。启用此选项后， OpenSearch 请通过以下方式为您的域配置 S3 向量：

1. 在为您的域名配置的 AWS KMS 密钥上创建两个新的授权：
   + 授予 S3 Vectors 后台索引任务解密权限
   + 授予使用权限创建 S3 向量存储桶的`GenerateDataKey`授权 OpenSearch 

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

## 使用 S3 向量引擎创建索引
<a name="s3-vector-opensearch-integration-engine-creating-indexes"></a>

配置域后，可在索引映射中使用 `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"
        }
    }
}
```

## 功能限制
<a name="s3-vector-opensearch-integration-engine-functional-limitations"></a>

在索引中使用 `s3vector` 引擎之前，请考虑以下限制：


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

| 功能 | 行为 | 
| --- | --- | 
| Split/Shrink/Clone 索引 | 当与`knn_vector`字段中配置了引`s3vector`擎的索引一起使用时，它们会 APIs 失败。 | 
| 快照 |  使用 `s3vector` 引擎的索引不支持快照。对于托管域： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/s3-vector-opensearch-integration-engine.html)  虽然不支持快照进行 point-in-time恢复，但`s3vector`引擎和 OpenSearch 优化实例可提供 11 个 9 的耐久性。   | 
| UltraWarm 等级 | 使用`s3vector`引擎配置的索引无法迁移到 UltraWarm 层。 | 
| 跨集群复制 | 已配置 `s3vector` 引擎的索引不支持跨集群复制。 | 
| 意外删除保护 |  由于使用 `s3vector` 引擎的索引不支持快照，因此意外删除保护不可用。仍可恢复域中的其他索引。  | 
| 径向搜索 | 使用 `s3vector` 引擎的字段不支持使用径向搜索的查询。 | 

## 索引文档
<a name="s3-vector-opensearch-integration-engine-index-documents"></a>

使用 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 }
```

## 搜索文档
<a name="s3-vector-opensearch-integration-engine-searching-documents"></a>

您可以使用标准 `_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
            }
          }
        }
      }
    }
  }
}
```

## 支持的映射参数
<a name="s3-vector-opensearch-integration-engine-supported-mapping-parameters"></a>

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


**向量字段参数**  

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

**重要**  
使用 `s3vector` 引擎不支持嵌套 `knn_vector` 字段类型

## 计量和计费
<a name="s3-vector-opensearch-integration-engine-metering-billing"></a>

有关此功能的计量和账单的信息，请参阅 [Amazon OpenSearch 服务定价](https://aws.amazon.com/opensearch-service/pricing/)。

## 禁用 s3vector 引擎
<a name="s3-vector-opensearch-integration-engine-disable"></a>

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

另请注意，启用或禁用 `s3vector` 引擎会触发域上的[蓝绿部署](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-configuration-changes.html)。

要禁用 `s3vector` 引擎，请[编辑域配置](https://docs.aws.amazon.com/cli/latest/reference/opensearch/update-domain-config.html)，并设置 `S3VectorsEngine.Enabled: false`。