

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

# 使用向量搜索集合


 OpenSearch Serverless 中的*向量搜索*集合类型提供了可扩展且性能高的相似度搜索功能。它使您可以轻松构建现代机器学习 (ML) 增强搜索体验和生成式人工智能 (AI) 应用程序，而无需管理底层的向量数据库基础架构。

向量搜索集合的用例包括图像搜索、文档搜索、音乐检索、产品推荐、视频搜索、基于位置的搜索、欺诈检测和异常检测。

由 OpenSearch 于 Serverless 的矢量引擎由中的 [k 最近邻 (k-nn) 搜索功能](https://opensearch.org/docs/latest/search-plugins/knn/index/)提供支持 OpenSearch，因此您可以通过无服务器环境的简单性获得相同的功能。该引擎支持 [k-NN 插件 API](https://opensearch.org/docs/latest/search-plugins/knn/api/) 通过这些操作，您可以利用全文搜索、高级筛选、聚合、地理空间查询、嵌套查询来更快地检索数据，并增强搜索结果。

向量引擎提供距离指标，例如欧几里得距离、余弦相似度和点积相似度，并且可以容纳 16,000 个维度。您可以存储具有各种元数据数据类型的字段，例如数字、布尔值、日期、关键字和地理点。您还可以存储带有描述性信息的文本字段，以便为存储的向量添加更多上下文。将数据类型放在一起可以降低复杂性、提高可维护性，并避免数据重复、版本兼容性挑战和许可问题。

**注意**  
请注意以下信息：  
Amazon OpenSearch Serverless 支持 Faiss 16 位标量量化，可用于在 32 位浮点向量和 16 位向量之间进行转换。如需了解更多信息，请参阅 [Faiss 16 位标量量化](https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#faiss-16-bit-scalar-quantization)。您还可以使用二进制向量降低内存成本。有关更多信息，请参阅[二进制向量](https://opensearch.org/docs/latest/field-types/supported-field-types/knn-vector#binary-vectors)。
Amazon OpenSearch Serverless 支持基于磁盘的矢量搜索。基于磁盘的向量搜索可显著降低低内存环境中向量工作负载的运营成本。有关更多信息，请参阅[基于磁盘的向量搜索](https://docs.opensearch.org/2.19/vector-search/optimizing-storage/disk-based-vector-search/)。

## 开始使用向量搜索集合
开始使用

在本教程中，您将完成以下步骤来实时存储、搜索和检索向量嵌入：

1. [配置权限](#serverless-vector-permissions)

1. [创建集合](#serverless-vector-create)

1. [上传和搜索数据](#serverless-vector-index)

1. [删除集合](#serverless-vector-delete)

### 步骤 1：配置权限


要完成本教程（以及一般使用 OpenSearch 无服务器），您必须拥有正确的 Amazon Identity and Access Management (IAM) 权限。在本教程中，您将创建一个集合、上传和搜索数据，然后删除该集合。

您的用户或角色必须已经附加[基于身份的策略](security-iam-serverless.md#security-iam-serverless-id-based-policies)，并且具有以下最低权限：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "aoss:CreateCollection",
        "aoss:ListCollections",
        "aoss:BatchGetCollection",
        "aoss:DeleteCollection",
        "aoss:CreateAccessPolicy",
        "aoss:ListAccessPolicies",
        "aoss:UpdateAccessPolicy",
        "aoss:CreateSecurityPolicy",
        "iam:ListUsers",
        "iam:ListRoles"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

------

有关 OpenSearch 无服务器 IAM 权限的更多信息，请参阅[适用于 Amazon OpenSearch Serverless 的身份和访问管理](security-iam-serverless.md)。

### 步骤 2：创建集合


*集合*是一组 OpenSearch 索引，它们协同工作以支持特定的工作负载或用例。

**创建 OpenSearch 无服务器集合**

1. 在[https://console.aws.amazon.com/aos/家](https://console.amazonaws.cn/aos/home )中打开亚马逊 OpenSearch 服务控制台。

1. 选择左侧导航窗格中的 **Collections**（集合），然后选择 **Create collection**（创建集合）。

1. 命名集合**住房**。

1. 对于集合类型，选择**向量搜索**。有关更多信息，请参阅 [选择集合类型](serverless-overview.md#serverless-usecase)。

1. 在**部署类型**下，清除**启用冗余（活动副本）**。这会在开发或测试模式下创建一个集合，并将集合中的 OpenSearch 计算单元 (OCUs) 数量减少到两个。如果要在本教程中创建生产环境，则请选中该复选框。

1. 在**安全**下，选择**轻松创建**以简化您的安全配置。默认情况下，向量引擎中的所有数据在传输过程中和静止状态下都经过加密。向量引擎支持精细的 IAM 权限，因此您可以定义谁可以创建、更新和删除加密、网络、集合和索引。

1. 选择 **下一步**。

1. 查看集合设置并选择 **提交**。稍等几分钟，等集合状态变为 `Active`。

### 步骤 3：上传并搜索数据


*索引*是具有通用数据架构的文档集合，它为您提供了一种存储、搜索和检索向量嵌入和其他字段的方法。[您可以使用 OpenSearch 仪表板中的[开发工具控制台或 Po [stm](https://www.postman.com/downloads/) an 或 awscurl 等 HTTP 工具](https://opensearch.org/docs/latest/dashboards/dev-tools/index-dev/)，创建数据并将其上传到 OpenSearch 无服务器集合中的索引。](https://github.com/okigan/awscurl)本教程使用的是 Dev Tools。

**索引和搜索住房馆藏中的数据**

1. 要为新集合创建单个索引，请在 [Dev Tools](https://opensearch.org/docs/latest/dashboards/dev-tools/index-dev/) 控制台中发送以下请求。默认情况下，这将创建一个带有 `nmslib` 引擎和欧几里得距离的索引。

   ```
   PUT housing-index
   {
      "settings": {
         "index.knn": true
      },
      "mappings": {
         "properties": {
            "housing-vector": {
               "type": "knn_vector",
               "dimension": 3
            },
            "title": {
               "type": "text"
            },
            "price": {
               "type": "long"
            },
            "location": {
               "type": "geo_point"
            }
         }
      }
   }
   ```

1. 要将单个文档索引到 *housing-index* 中，请发送以下请求：

   ```
   POST housing-index/_doc
   {
     "housing-vector": [
       10,
       20,
       30
     ],
     "title": "2 bedroom in downtown Seattle",
     "price": "2800",
     "location": "47.71, 122.00"
   }
   ```

1. 要搜索与索引中的属性相似的属性，请发送以下查询：

   ```
   GET housing-index/_search
   {
       "size": 5,
       "query": {
           "knn": {
               "housing-vector": {
                   "vector": [
                       10,
                       20,
                       30
                   ],
                   "k": 5
               }
           }
       }
   }
   ```

### 步骤 4：删除集合


由于*住房*集合用于测试目的，因此请确保在您完成试验后将其删除。

**删除 OpenSearch 无服务器集合**

1. 返回**亚马逊 OpenSearch 服务**控制台。

1. 选择左侧导航窗格中的**集合**，然后选择**属性**集合。

1. 选择**删除**，然后确认删除。

## 经过筛选的搜索


您可以使用筛选条件来优化语义搜索结果。要创建索引并对文档执行经过筛选的搜索，请使用以下说明替换上一个教程中的[上传和搜索数据](#serverless-vector-index)。其他步骤保持不变。有关筛选条件的更多信息，请参阅[使用筛选条件进行 k-NN 搜索](https://opensearch.org/docs/latest/search-plugins/knn/filter-search-knn/)。

**索引和搜索住房馆藏中的数据**

1. 要为您的集合创建单个索引，请在 [Dev Tools](https://opensearch.org/docs/latest/dashboards/dev-tools/index-dev/) 控制台中发送以下请求：

   ```
   PUT housing-index-filtered
   {
     "settings": {
       "index.knn": true
     },
     "mappings": {
       "properties": {
         "housing-vector": {
           "type": "knn_vector",
           "dimension": 3,
           "method": {
             "engine": "faiss",
             "name": "hnsw"
           }
         },
         "title": {
           "type": "text"
         },
         "price": {
           "type": "long"
         },
         "location": {
           "type": "geo_point"
         }
       }
     }
   }
   ```

1. 要将单个文档编入索引 *housing-index-filtered*，请发送以下请求：

   ```
   POST housing-index-filtered/_doc
   {
     "housing-vector": [
       10,
       20,
       30
     ],
     "title": "2 bedroom in downtown Seattle",
     "price": "2800",
     "location": "47.71, 122.00"
   }
   ```

1. 要搜索西雅图给定价格和给定距离范围内的公寓数据，请发送以下请求：

   ```
   GET housing-index-filtered/_search
   {
     "size": 5,
     "query": {
       "knn": {
         "housing-vector": {
           "vector": [
             0.1,
             0.2,
             0.3
           ],
           "k": 5,
           "filter": {
             "bool": {
               "must": [
                 {
                   "query_string": {
                     "query": "Find me 2 bedroom apartment in Seattle under $3000 ",
                     "fields": [
                       "title"
                     ]
                   }
                 },
                 {
                   "range": {
                     "price": {
                       "lte": 3000
                     }
                   }
                 },
                 {
                   "geo_distance": {
                     "distance": "100miles",
                     "location": {
                       "lat": 48,
                       "lon": 121
                     }
                   }
                 }
               ]
             }
           }
         }
       }
     }
   }
   ```

## 十亿级工作负载


向量搜索集合支持包含数十亿个向量的工作负载。您无需出于扩展目的重新编制索引，因为自动扩缩功能会为您执行此操作。如果您有数百万个（或更多）具有大量维度的向量，并且需要超过 200 个 OCUs，请联系 Su [Amazon pp](https://www.amazonaws.cn/premiumsupport/) ort 以提高您的账户的最大 OpenSearch 计算单位 (OCUs)。

## 限制


向量搜索集合具有以下限制：
+ 向量搜索集合不支持 Apache Lucene ANN 引擎。
+ 向量搜索集合仅支持带有 Faiss 的 HNSW 算法，不支持 IVF 和 IVFQ。
+ 向量搜索集合不支持预热、统计数据和模型训练 API 操作。
+ 向量搜索集合不支持内联脚本或存储脚本。
+ 矢量搜索集合中 Amazon Web Services 管理控制台 没有索引计数信息。
+ 向量搜索集合上索引的刷新间隔为 60 秒。

## 后续步骤


现在您已知道如何创建向量搜索集合和索引数据，您可能想尝试以下一些练习：
+ 使用 OpenSearch Python 客户端处理矢量搜索集合。请参阅本教程[GitHub](https://github.com/opensearch-project/opensearch-py/blob/main/guides/plugins/knn.md)。
+ 使用 OpenSearch Java 客户端处理矢量搜索集合。请参阅本教程[GitHub](https://github.com/opensearch-project/opensearch-java/blob/main/guides/plugins/knn.md)。
+ 设置 LangChain 为 OpenSearch 用作矢量存储。 LangChain 是一个开源框架，用于开发由语言模型支持的应用程序。有关详情，请参阅 [LangChain 文档](https://python.langchain.com/docs/integrations/vectorstores/opensearch)。