如何为向量搜索建立索引字段
在此页面上
您可以使用 vectorSearch
类型为字段编制索引,以运行 $vectorSearch
查询。您可以为要查询的向量嵌入定义索引,以及要用于预筛选数据的布尔值、日期、objectId、数值、字符串或 UUID 值。筛选数据有助于缩小语义搜索的范围,并确保在比较时(例如在多租户环境中)不考虑某些向量嵌入。
您可以使用 Atlas 用户界面、Atlas 管理 API、Atlas CLI、 mongosh
或支持的MongoDB 驱动程序来创建Atlas Vector Search 索引。
注意
不能使用已弃用的knnBeta操作符来查询使用vectorSearch
类型索引定义建立索引的字段。
注意事项
在vectorSearch
类型索引定义中,您可以仅使用单个元素对数组进行索引。 您无法对文档数组内的字段或对象数组内的字段进行索引。 您可以使用点表示法对文档内的字段进行索引。
语法
以下语法定义了 vectorSearch
索引类型:
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 "path": "<field-to-index>", 6 "numDimensions": <number-of-dimensions>, 7 "similarity": "euclidean | cosine | dotProduct" 8 }, 9 { 10 "type": "filter", 11 "path": "<field-to-index>" 12 }, 13 ... 14 ] 15 }
关于vector
类型
向量字段必须包含 BSON double
数据类型的数字数组,才能使用$vectorSearch
管道阶段进行查询。 您必须在fields
数组内将向量字段索引为vector
类型。
以下语法定义了 vector
字段类型:
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 "path": <field-to-index>, 6 "numDimensions": <number-of-dimensions>, 7 "similarity": "euclidean | cosine | dotProduct" 8 }, 9 ... 10 ] 11 }
关于filter
类型
您可以选择对布尔值、日期、objectId、日期、字符串和 UUID 字段建立索引,以预筛选数据。筛选数据有助于缩小语义搜索的范围,并确保不会考虑所有向量进行比较。您必须使用fields
数组内的filter
类型为这些字段建立索引。
以下语法定义了 filter
字段类型:
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 ... 6 }, 7 { 8 "type": "filter", 9 "path": "<field-to-index>" 10 }, 11 ... 12 ] 13 }
注意
对数据进行预筛选不会影响 Atlas Vector Search 使用$vectorSearchScore
进行$vectorSearch
查询返回的分数。
Atlas Vector Search 索引字段
Atlas Vector Search 索引定义采用以下字段:
选项 | 类型 | 必要性 | 用途 | ||||
---|---|---|---|---|---|---|---|
fields | 文档数组 | 必需 | 要索引的向量和筛选器字段,每个文档一个。至少一个文档必须包含向量字段的字段定义。您还可以选择对布尔值、日期、数字、objectId、字符串和 UUID 字段进行索引(每个文档一个),用于对数据进行预过滤。 | ||||
fields.type | 字符串 | 必需 | 用于为
| ||||
fields.path | 字符串 | 必需 | 要为其创建索引的字段名称。对于嵌套字段,使用点表示法来指定嵌入式字段的路径。不能为包含两个连续点 (
| ||||
fields.numDimensions | int | 必需 | Atlas Vector Search 在索引时和查询时强制执行的向量维数。您必须指定小于或等于 4096 的值。您只能为 vector 类型字段设置此字段。 | ||||
fields.similarity | 字符串 | 必需 | 用于搜索前 K 个最近邻的向量相似度函数。您只能为
注意如果对幅度进行归一化,则 |
创建 Atlas Vector Search 索引
Atlas Search 索引是一种数据结构,它以易于搜索的格式对数据进行分类。它是术语与包含这些术语的文档之间的映射。 Atlas Search 索引可以使用某些标识符更快地检索文档。您必须配置 Atlas Search 索引,才能使用 Atlas Search 查询 Atlas 集群中的数据。
您可在单个字段或多个字段上创建 Atlas Search 索引。我们建议您对经常用于排序或筛选数据的字段建立索引,以便在查询时快速检索包含相关数据的文档。
您可以通过 Atlas 用户界面、Atlas 管理 API、Atlas CLI,为任何类型的数据包含长度小于或等于4096维度的向量嵌入的所有集合创建 Atlas Vector Search 索引,以及 Atlas 集群上的其他数据、 mongosh
或支持的MongoDB 驱动程序。
先决条件
要创建 Atlas Vector Search 索引,Atlas 集群必须满足以下先决条件:
MongoDB 版本
6.0.11
、7.0.2
或更高版本为其创建 Atlas Vector Search 索引的集合
必需的访问权限
您需要Project Data Access Admin
或更高角色才能创建和管理 Atlas Vector Search 索引。
免费和共享集群限制
您创建的内容不能超过:
在
M0
集群上具有 3 个索引。M2
集群上有 5 个索引。M5
集群上有 10 个索引。
您可以在 M10+
集群上创建的索引数量没有限制。
步骤
➤ 使用选择语言下拉菜单选择要用于创建索引的客户端。
注意
该过程包括sample_mflix
数据库中embedded_movies
集合的索引定义示例。 如果您在集群上加载样本数据并为此集合创建示例 Atlas Search 索引,则可以对此集合运行样本$vectorSearch
查询。 要了解有关可以运行的示例查询的更多信息,请参阅$vectorSearch 示例。
要使用 Atlas Administration API 为collection创建 Atlas Vector Search 索引,请向 Atlas Search indexes
端点发送包含所需参数的POST
请求。
1 curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ 2 --header "Accept: application/json" \ 3 --header "Content-Type: application/json" \ 4 --include \ 5 --request POST "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes" \ 6 --data ' 7 { 8 "database": "<name-of-database>", 9 "collectionName": "<name-of-collection>", 10 "type": "vectorSearch", 11 "name": "<index-name>", 12 "definition": { 13 "fields":[ 14 { 15 "type": "vector", 16 "path": <field-to-index>, 17 "numDimensions": <number-of-dimensions>, 18 "similarity": "euclidean | cosine | dotProduct" 19 }, 20 { 21 "type": "filter", 22 "path": "<field-to-index>" 23 }, 24 ... 25 } 26 ] 27 }'
要了解有关端点语法和参数的更多信息,请参阅创建一个 Atlas Search 索引。
例子
以下索引定义在 Atlas Vector Search 索引中将plot_embedding
字段索引为vector
类型,将genres
和year
字段索引为filter
类型。 plot_embedding
字段包含使用 OpenAI 的text-embedding-ada-002
嵌入模型创建的嵌入。索引定义指定了1536
向量维度,并使用euclidean
个距离来衡量相似性。
以下索引定义仅对用于执行向量Atlas Search的向量嵌入字段进行索引。
1 curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ 2 --header "Accept: application/json" \ 3 --header "Content-Type: application/json" \ 4 --include \ 5 --request POST "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes" \ 6 --data ' 7 { 8 "database": "sample_mflix", 9 "collectionName": "embedded_movies", 10 "type": "vectorSearch", 11 "name": "vector_index", 12 "definition: { 13 "fields":[ 14 { 15 "type": "vector", 16 "path": "plot_embedding", 17 "numDimensions": 1536, 18 "similarity": "euclidean" 19 } 20 ] 21 } 22 }'
此索引定义对以下字段进行索引:
用于预筛选数据的string字段 (
genres
) 和数字字段 (year
)。向量嵌入字段 (
plot_embedding
),用于针对预筛选数据执行向量Atlas Search 。
1 curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ 2 --header "Accept: application/json" \ 3 --header "Content-Type: application/json" \ 4 --include \ 5 --request POST "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes" \ 6 --data ' 7 { 8 "database": "sample_mflix", 9 "collectionName": "embedded_movies", 10 "type": "vectorSearch", 11 "name": "vector_index", 12 "definition: { 13 "fields":[ 14 { 15 "type": "vector", 16 "path": "plot_embedding", 17 "numDimensions": 1536, 18 "similarity": "euclidean" 19 }, 20 { 21 "type": "filter", 22 "path": "genres" 23 }, 24 { 25 "type": "filter", 26 "path": "year" 27 } 28 ] 29 } 30 }'
使用 Atlas CLI v 1为集合创建 Atlas Vector Search 索引。 14 。 3或更高版本,请执行以下步骤:
创建一个.json
文件并在该文件中定义索引。
索引定义应类似于以下格式:
1 { 2 "database": "<name-of-database>", 3 "collectionName": "<name-of-collection>", 4 "type": "vectorSearch", 5 "name": "<index-name>", 6 "fields":[ 7 { 8 "type": "vector", 9 "path": "<field-to-index>", 10 "numDimensions": <number-of-dimensions>, 11 "similarity": "euclidean | cosine | dotProduct" 12 }, 13 { 14 "type": "filter", 15 "path": "<field-to-index>" 16 }, 17 ... 18 ] 19 }
例子
创建一个名为 vector-index.json
的文件。
替换以下占位符值并保存文件。
<name-of-database> | 包含要为其创建索引的集合的数据库。 |
<name-of-collection> | 要为其创建索引的集合。 |
<index-name> | 索引的名称。如果省略索引名称,Atlas Vector Search 会将索引命名为 vector_index 。 |
<number-of-dimensions> | Atlas Vector Search 在索引时和查询时实施的向量维度数。 |
<field-to-index> | 要索引的向量和筛选器字段。 |
例子
将以下索引定义复制并粘贴到vector-index.json
文件中。以下索引定义在 Atlas Vector Search 索引中将plot_embedding
字段索引为vector
类型,并将genres
和year
字段索引为filter
类型。 plot_embedding
字段包含使用 OpenAI 的text-embedding-ada-002
嵌入模型创建的嵌入。索引定义指定了1536
个向量维度,并使用euclidean
距离来衡量相似性。
以下索引定义仅对用于执行向量Atlas Search的向量嵌入字段进行索引。
1 { 2 "database": "sample_mflix", 3 "collectionName": "embedded_movies", 4 "type": "vectorSearch", 5 "name": "vector_index", 6 "fields": [ 7 { 8 "type": "vector", 9 "path": "plot_embedding", 10 "numDimensions": 1536, 11 "similarity": "euclidean" 12 } 13 ] 14 }
此索引定义对以下字段进行索引:
用于预筛选数据的string字段 (
genres
) 和数字字段 (year
)。向量嵌入字段 (
plot_embedding
),用于针对预筛选数据执行向量Atlas Search 。
1 { 2 "database": "sample_mflix", 3 "collectionName": "embedded_movies", 4 "type": "vectorSearch", 5 "name": "vector_index", 6 "fields":[ 7 { 8 "type": "vector", 9 "path": "plot_embedding", 10 "numDimensions": 1536, 11 "similarity": "euclidean" 12 }, 13 { 14 "type": "filter", 15 "path": "genres" 16 }, 17 { 18 "type": "filter", 19 "path": "year" 20 } 21 ] 22 }
运行以下命令以创建索引。
atlas clusters search indexes create --clusterName [cluster_name] --file [vector_index].json
在命令中,替换以下占位符值:
cluster_name
是包含要创建索引的集合的 Atlas 集群的名称。vector_index
是包含 Atlas Vector Search 索引的索引定义的JSON文件的名称。
例子
atlas clusters search indexes create --clusterName [cluster_name] --file vector-index.json
要了解有关命令语法和参数的更多信息,请参阅atlas clusters searchindexes create命令的 Atlas CLI 文档。
在 AtlasClusters 中,转到项目的 页面。
如果尚未显示,请选择包含所需项目的组织导航栏中的Organizations菜单。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果 Clusters(数据库部署)页面尚未出现,请单击侧边栏中的 Database(数据库)。
此时会显示“集群”页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击Services标题下的Atlas Search 。
从Select data source下拉列表中,选择您的集群并单击Go to Atlas Search 。
显示Atlas Search页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击集合的Search Indexes标签页。
显示Atlas Search页面。
单击集群名称。
单击 Atlas Search 标签页。
显示Atlas Search页面。
输入Index Name ,然后设置Database and Collection 。
在 Index Name(索引名称)字段中,输入索引的名称。
无论索引类型如何,索引名称在命名空间内都必须是唯一的。
例子
输入vector_index作为示例索引的名称。如果此集合上已有名为vector_index的索引,请为该索引输入其他名称。
在Database and Collection部分中,找到数据库,然后选择集合。
提示
如果您从Data Explorer导航到此页面,则可以跳过此步骤,因为 Atlas 会预先选择您在Data Explorer中选择的数据库和集合。
例子
在 Database and Collection(数据库和集合)部分中找到
sample_mflix
数据库,然后选择embedded_movies
集合。
指定索引定义。
Atlas Vector Search 索引类似于以下示例:
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 "path": <field-to-index>, 6 "numDimensions": <number-of-dimensions>, 7 "similarity": "euclidean | cosine | dotProduct" 8 }, 9 { 10 "type": "filter", 11 "path": "<field-to-index>" 12 }, 13 ... 14 ] 15 }
要了解有关索引中字段的更多信息,请参阅如何为向量搜索的字段创建索引。
例子
以下索引定义在 Atlas Vector Search 索引中将plot_embedding
字段索引为vector
类型,将genres
和year
字段索引为filter
类型。 plot_embedding
字段包含使用 OpenAI 的text-embedding-ada-002
嵌入模型创建的嵌入。索引定义指定了1536
向量维度,并使用euclidean
个距离来衡量相似性。
以下索引定义仅对用于执行向量Atlas Search的向量嵌入字段进行索引。
1 { 2 "fields": [{ 3 "type": "vector", 4 "path": "plot_embedding", 5 "numDimensions": 1536, 6 "similarity": "euclidean" 7 }] 8 }
此索引定义对以下字段进行索引:
用于预筛选数据的string字段 (
genres
) 和数字字段 (year
)。向量嵌入字段 (
plot_embedding
),用于针对预筛选数据执行向量Atlas Search 。
1 { 2 "fields": [{ 3 "type": "vector", 4 "path": "plot_embedding", 5 "numDimensions": 1536, 6 "similarity": "euclidean" 7 }, 8 { 9 "type": "filter", 10 "path": "genres" 11 }, 12 { 13 "type": "filter", 14 "path": "year" 15 }] 16 }
使用mongosh
v 2为集合创建 Atlas Vector Search 索引。 1 。 2或更高版本,请执行以下步骤:
使用 连接到 Atlasmongosh
集群。
要了解更多信息,请参阅通过mongosh
连接。
db.collection.createSearchIndex()
运行 方法。
db.collection.createSearchIndex()
方法使用的语法如下:
1 db.<collectionName>.createSearchIndex( 2 "<index-name>", 3 "vectorSearch", //index type 4 { 5 fields: [ 6 { 7 "type": "vector", 8 "numDimensions": <number-of-dimensions>, 9 "path": "<field-to-index>", 10 "similarity": "euclidean | cosine | dotProduct" 11 }, 12 { 13 "type": "filter", 14 "path": "<field-to-index>" 15 }, 16 ... 17 ] 18 } 19 );
例子
以下索引定义在 Atlas Vector Search 索引中将plot_embedding
字段索引为vector
类型,将genres
和year
字段索引为filter
类型。 plot_embedding
字段包含使用 OpenAI 的text-embedding-ada-002
嵌入模型创建的嵌入。索引定义指定了1536
向量维度,并使用euclidean
个距离来衡量相似性。
以下索引定义仅对用于执行向量Atlas Search的向量嵌入字段进行索引。
1 db.embedded_movies.createSearchIndex( 2 "vector_index", 3 "vectorSearch", 4 { 5 "fields": [ 6 { 7 "type": "vector", 8 "path": "plot_embedding", 9 "numDimensions": 1536, 10 "similarity": "euclidean" 11 } 12 ] 13 } 14 );
此索引定义对以下字段进行索引:
用于预筛选数据的string字段 (
genres
) 和数字字段 (year
)。向量嵌入字段 (
plot_embedding
),用于针对预筛选数据执行向量Atlas Search 。
1 db.embedded_movies.createSearchIndex( 2 "vector_index", 3 "vectorSearch", 4 { 5 "fields": [ 6 { 7 "type": "vector", 8 "path": "plot_embedding", 9 "numDimensions": 1536, 10 "similarity": "euclidean" 11 }, 12 { 13 "type": "filter", 14 "path": "genres" 15 }, 16 { 17 "type": "filter", 18 "path": "year" 19 } 20 ] 21 } 22 );
要使用MongoDB 节点驱动程序v 6.6.0或更高版本为集合创建 Atlas Vector Search 索引,请执行以下步骤:
创建一个.js
文件并在该文件中定义索引。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connectionString>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("<databaseName>"); 11 const collection = database.collection("<collectionName>"); 12 13 // define your Atlas Vector Search index 14 const index = { 15 name: "<indexName>", 16 type: "vectorSearch", 17 definition: { 18 "fields": [ 19 { 20 "type": "vector", 21 "numDimensions": <numberOfDimensions>, 22 "path": "<fieldToIndex>", 23 "similarity": "euclidean | cosine | dotProduct" 24 }, 25 { 26 "type": "filter", 27 "path": "<fieldToIndex>" 28 }, 29 ... 30 ] 31 } 32 } 33 34 // run the helper method 35 const result = await collection.createSearchIndex(index); 36 console.log(result); 37 } finally { 38 await client.close(); 39 } 40 } 41 run().catch(console.dir);
例子
创建一个名为 vector-index.js
的文件。
替换以下值并保存文件。
<connectionString> | Atlas连接string 。 要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含要为其创建索引的集合的数据库。 |
<collectionName> | 要为其创建索引的集合。 |
<indexName> | 索引的名称。 如果省略索引名称,Atlas Search 会将索引命名为 vector_index 。 |
<numberOfDimensions> | Atlas Vector Search 在索引时和查询时实施的向量维度数。 |
<fieldToIndex> | 要索引的向量和筛选器字段。 |
例子
将以下内容复制并粘贴到vector-index.js
文件中,并替换<connectionString>
占位符值。 以下索引定义在 Atlas Vector Search 索引中将plot_embedding
字段索引为vector
类型,将genres
和year
字段索引为filter
类型。 plot_embedding
字段包含使用 OpenAI 的text-embedding-ada-002
嵌入模型创建的嵌入。 索引定义指定了1536
向量维度,并使用euclidean
距离来衡量相似性。
以下索引定义仅对用于执行向量Atlas Search的向量嵌入字段 (plot_embedding
) 编制索引。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connectionString>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("sample_mflix"); 11 const collection = database.collection("embedded_movies"); 12 13 // define your Atlas Vector Search index 14 const index = { 15 name: "vector_index", 16 type: "vectorSearch", 17 definition: { 18 "fields": [ 19 { 20 "type": "vector", 21 "numDimensions": 1536, 22 "path": "plot_embedding", 23 "similarity": "euclidean" 24 } 25 ] 26 } 27 } 28 29 // run the helper method 30 const result = await collection.createSearchIndex(index); 31 console.log(result); 32 } finally { 33 await client.close(); 34 } 35 } 36 run().catch(console.dir);
此索引定义对以下字段进行索引:
用于预筛选数据的string字段 (
genres
) 和数字字段 (year
)。向量嵌入字段 (
plot_embedding
),用于针对预筛选数据执行向量Atlas Search 。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connectionString>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("sample_mflix"); 11 const collection = database.collection("embedded_movies"); 12 13 // define your Atlas Vector Search index 14 const index = { 15 name: "vector_index", 16 type: "vectorSearch", 17 definition: { 18 "fields": [ 19 { 20 "type": "vector", 21 "numDimensions": 1536, 22 "path": "plot_embedding", 23 "similarity": "euclidean" 24 }, 25 { 26 "type": "filter", 27 "path": "genres" 28 }, 29 { 30 "type": "filter", 31 "path": "year" 32 } 33 ] 34 } 35 } 36 37 // run the helper method 38 const result = await collection.createSearchIndex(index); 39 console.log(result); 40 } finally { 41 await client.close(); 42 } 43 } 44 run().catch(console.dir);
要使用PyMongo驱动程序 v 4.7或更高版本为集合创建 Atlas Vector Search 索引,请执行以下步骤:
创建一个.py
文件并在该文件中定义索引。
1 import pymongo 2 from pymongo.mongo_client import MongoClient 3 from pymongo.operations import SearchIndexModel 4 5 # Connect to your Atlas deployment 6 uri = "<connectionString>" 7 client = MongoClient(uri) 8 9 # Access your database and collection 10 database = client["<databaseName>"] 11 collection = database["<collectionName>"] 12 13 # Create your index model, then create the search index 14 search_index_model = SearchIndexModel( 15 definition={ 16 "fields": [ 17 { 18 "type": "vector", 19 "numDimensions": <numberofDimensions>, 20 "path": "<fieldToIndex>", 21 "similarity": "euclidean | cosine | dotProduct" 22 }, 23 { 24 "type": "filter", 25 "path": "<fieldToIndex>" 26 }, 27 ... 28 ] 29 }, 30 name="<index name>", 31 type="vectorSearch", 32 ) 33 34 result = collection.create_search_index(model=search_index_model) 35 print(result)
要了解详情,请参阅 create_search_index() 方法。
1 from pymongo.mongo_client import MongoClient 2 from pymongo.operations import SearchIndexModel 3 4 def create_indexes(): 5 # Connect to your Atlas deployment 6 uri = "<connectionString>" 7 client = MongoClient(uri) 8 9 # Access your database and collection 10 database = client["<databaseName>"] 11 collection = database["<collectionName>"] 12 13 # Create your index models and add them to an array 14 first_model = SearchIndexModel( 15 definition={ 16 "fields": [ 17 { 18 "type": "vector", 19 "numDimensions": <numberOfDimensions>, 20 "path": "<fieldToIndex>", 21 "similarity": "euclidean | cosine | dotProduct" 22 }, 23 { 24 "type": "filter", 25 "path": "<fieldToIndex>" 26 }, 27 ... 28 ] 29 }, 30 name="<indexName>", 31 type="vectorSearch", 32 ) 33 34 second_model = SearchIndexModel( 35 definition={ 36 "fields": [ 37 { 38 "type": "vector", 39 "numDimensions": <numberOfDimensions>, 40 "path": "<fieldToIndex>", 41 "similarity": "euclidean | cosine | dotProduct" 42 }, 43 { 44 "type": "filter", 45 "path": "<fieldToIndex>" 46 }, 47 ... 48 ] 49 }, 50 name="<index name>", 51 type="vectorSearch", 52 ) 53 54 ... 55 56 idx_models = [first_model, second_model, ...] 57 58 # Create the search indexes 59 result = collection.create_search_indexes(models=idx_models) 60 print(result)
要了解详情,请参阅 create_search_indexes() 方法。
例子
创建一个名为 vector-index.py
的文件。
替换以下值并保存文件。
<connectionString> | Atlas连接string 。 要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含要为其创建索引的集合的数据库。 |
<collectionName> | 要为其创建索引的集合。 |
<indexName> | 索引的名称。 如果省略索引名称,Atlas Search 会将索引命名为 vector_index 。 |
<numberOfDimensions> | Atlas Vector Search 在索引时和查询时实施的向量维度数。 |
<fieldToIndex> | 要索引的向量和筛选器字段。 |
例子
将以下内容复制并粘贴到vector-index.py
中,并替换<connectionString>
占位符值。 以下索引定义在 Atlas Vector Search 索引中将plot_embedding
字段索引为vector
类型,将genres
和year
字段索引为filter
类型。 plot_embedding
字段包含使用 OpenAI 的text-embedding-ada-002
嵌入模型创建的嵌入。 索引定义指定了1536
向量维度,并使用euclidean
距离来衡量相似性。
以下索引定义仅对用于执行向量Atlas Search的向量嵌入字段 (plot_embedding
) 编制索引。
1 from pymongo.mongo_client import MongoClient 2 from pymongo.operations import SearchIndexModel 3 4 # Connect to your Atlas deployment 5 uri = "<connectionString>" 6 client = MongoClient(uri) 7 8 # Access your database and collection 9 database = client["sample_mflix"] 10 collection = database["embedded_movies"] 11 12 # Create your index model, then create the search index 13 search_index_model = SearchIndexModel( 14 definition={ 15 "fields": [ 16 { 17 "type": "vector", 18 "path": "plot_embedding", 19 "numDimensions": 1536, 20 "similarity": "euclidean" 21 } 22 ] 23 }, 24 name="vector_index", 25 type="vectorSearch", 26 ) 27 28 result = collection.create_search_index(model=search_index_model) 29 print(result)
此索引定义对以下字段进行索引:
用于预筛选数据的string字段 (
genres
) 和数字字段 (year
)。向量嵌入字段 (
plot_embedding
),用于针对预筛选数据执行向量Atlas Search 。
1 from pymongo.mongo_client import MongoClient 2 from pymongo.operations import SearchIndexModel 3 4 # Connect to your Atlas deployment 5 uri = "<connectionString>" 6 client = MongoClient(uri) 7 8 # Access your database and collection 9 database = client["sample_mflix"] 10 collection = database["embedded_movies"] 11 12 # Create your index model, then create the search index 13 search_index_model = SearchIndexModel( 14 definition={ 15 "fields": [ 16 { 17 "type": "vector", 18 "path": "plot_embedding", 19 "numDimensions": 1536, 20 "similarity": "euclidean" 21 }, 22 { 23 "type": "filter", 24 "path": "genres" 25 }, 26 { 27 "type": "filter", 28 "path": "year" 29 } 30 ] 31 }, 32 name="vector_index", 33 type="vectorSearch", 34 ) 35 36 result = collection.create_search_index(model=search_index_model) 37 print(result)
查看 Atlas Vector Search 索引
您可以从 Atlas 用户界面、Atlas 管理 API、Atlas CLI、 mongosh
或支持的MongoDB 驱动程序查看所有集合的 Atlas Vector Search 索引。
必需的访问权限
您需要Project Search Index Editor
或更高的角色才能查看 Atlas Vector Search 搜索索引。
步骤
➤ 使用选择语言下拉菜单设置本节中示例的语言。
要使用 Atlas Administration API 检索集合的所有 Atlas Vector Search 索引,请向 Atlas Search indexes
端点发送GET
请求,其中包含数据库和集合的名称。
1 curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ 2 --header "Accept: application/json" \ 3 --include \ 4 --request GET "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes/{databaseName}/{collectionName}"
要了解有关端点语法和参数的更多信息,请参阅返回一个集合的所有 Atlas Search 索引。
要使用 Atlas Administration API 检索集合的一个 Atlas Vector Search 索引,请向 Atlas Search indexes
端点发送GET
请求,并附带要检索的索引(第4行)的唯一 ID 或名称。
1 curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ 2 --header "Accept: application/json" \ 3 --include \ 4 --request GET "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes/{indexId} | https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes/{databaseName}/{collectionName}/{indexName|indexId}"
要了解有关端点的语法和参数的更多信息,请参阅“按名称获取一个”和“按 ID 获取一个”。
要使用 Atlas CLI 返回集合的 Atlas Vector Search 索引,请执行以下步骤:
运行以下命令以检索集合的索引。
atlas clusters search indexes list --clusterName [cluster_name] --db <db-name> --collection <collection-name>
在命令中,替换以下占位符值:
cluster-name
— 包含索引集合的 Atlas 集群的名称。db-name
- 包含要检索其索引的集合的数据库的名称。collection-name
- 要检索其索引的集合的名称。
要了解有关命令语法和参数的更多信息,请参阅atlas clusters searchindexes list命令的 Atlas CLI 文档。
在 AtlasClusters 中,转到项目的 页面。
如果尚未显示,请选择包含所需项目的组织导航栏中的Organizations菜单。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果 Clusters(数据库部署)页面尚未出现,请单击侧边栏中的 Database(数据库)。
此时会显示“集群”页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击Services标题下的Atlas Search 。
从Select data source下拉列表中,选择您的集群并单击Go to Atlas Search 。
显示Atlas Search页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击集合的Search Indexes标签页。
显示Atlas Search页面。
单击集群名称。
单击 Atlas Search 标签页。
显示Atlas Search页面。
此页面会显示页面上索引的以下详细信息:
名称 | 标识索引的标签。 |
索引类型 | 指示 Atlas Search 或 Atlas Vector Search 索引的标签。 值包括:
|
索引字段 | 包含此索引索引的字段的列表。 |
状态 | 集群主节点上索引的当前状态。有关有效值,请参阅索引状态。 |
size | 主节点上索引的大小。 |
文档 (Document) | 已建立索引的文档数与集合中文档总数的比值。 |
操作 | 可以对索引执行的操作。 您可以: 注意您无法在Search Tester用户界面中针对 |
要使用mongosh
查看集合的 Atlas Vector Search 索引,请执行以下步骤:
使用 连接到 Atlasmongosh
集群。
要了解更多信息,请参阅通过mongosh
连接。
db.collection.getSearchIndexes()
运行 方法。
db.collection.getSearchIndexes()
方法使用的语法如下:
1 db.<collectionName>.getSearchIndexes( "<index-name>" );
使用MongoDB 节点驱动程序v 6查看集合的 Atlas Vector Search 索引。 6 。 0或更高版本,请执行以下步骤:
创建.js
文件并使用listSearchIndexes()
方法检索索引。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connectionString>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("<databaseName>"); 11 const collection = database.collection("<collectionName>"); 12 13 // run the helper method 14 const result = await collection.listSearchIndexes("<indexName>").toArray(); 15 console.log(result); 16 } finally { 17 await client.close(); 18 } 19 } 20 run().catch(console.dir);
替换以下值并保存文件。
<connectionString> | Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含该集合的数据库。 |
<collectionName> | 要检索其索引的集合。 |
<indexName> | 如果要检索特定索引,请输入索引的名称。 要返回集合上的所有索引,请省略此值。 |
使用PyMongo驱动程序 v 4查看集合的 Atlas Vector Search 索引。 7或更高版本,请执行以下步骤:
创建.py
文件并使用list_search_indexes()
方法检索集合的索引。
1 from pymongo.mongo_client import MongoClient 2 3 # Connect to your Atlas deployment 4 uri = "<connectionString>" 5 client = MongoClient(uri) 6 7 # Access your database and collection 8 database = client["<databaseName>"] 9 collection = database["<collectionName>"] 10 11 # Get a list of the collection's search indexes and print them 12 cursor = collection.list_search_indexes() 13 for index in cursor: 14 print(index)
要了解详情,请参阅 list_search_indexes() 方法。
替换以下值并保存文件。
<connectionString> | Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含该集合的数据库名称。 |
<collectionName> | 集合的名称。 |
编辑 Atlas Vector Search 索引
您可以通过 Atlas 用户界面、Atlas 管理 API、Atlas CLI、mongosh
或支持的 MongoDB 驱动程序 更改现有 Atlas Vector Search 索引的 索引定义 。您无法重命名索引或更改索引类型。如果需要更改索引名称或类型,则必须创建新索引并删除旧索引。
重要
编辑索引后,Atlas Vector Search 会重建索引。重建索引时,您可以使用旧索引定义继续运行向量搜索查询。当索引完成重建后,旧索引将被自动替换。此过程与标准 Atlas Search 索引的过程相同。
要了解更多信息,请参阅创建和更新 Atlas Search 索引。
必需的访问权限
您必须具有Project Search Index Editor
或更高角色才能编辑 Atlas Vector Search 索引。
步骤
➤ 使用选择语言下拉菜单选择要用于编辑索引的客户端。
要使用 Atlas Administration API 编辑集合的 Atlas Vector Search 索引,请向 Atlas Search indexes
端点发送PATCH
请求,并附带要编辑的索引的唯一 ID 或名称(第4行)。
1 curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest --include \ 2 --header "Accept: application/json" \ 3 --header "Content-Type: application/json" \ 4 --request PATCH "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes/{indexId} | https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes/{databaseName}/{collectionName}/{indexName|indexId}" \ 5 --data' 6 { 7 "database": "<name-of-database>", 8 "collectionName": "<name-of-collection>", 9 "type": "vectorSearch", 10 "name": "<index-name>", 11 "definition": { 12 "fields":[ 13 { 14 "type": "vector", 15 "path": <field-to-index>, 16 "numDimensions": <number-of-dimensions>, 17 "similarity": "euclidean | cosine | dotProduct" 18 }, 19 { 20 "type": "filter", 21 "path": "<field-to-index>" 22 }, 23 ... 24 } 25 ] 26 }'
要了解有关端点的语法和参数的更多信息,请参阅按名称更新和按 ID 更新。
要使用 Atlas CLI 编辑集合的 Atlas Vector Search 索引,请执行以下步骤:
创建一个.json
文件并在该文件中定义对索引的更改。
索引定义应类似于以下格式:
1 { 2 "database": "<name-of-database>", 3 "collectionName": "<name-of-collection>", 4 "type": "vectorSearch", 5 "name": "<index-name>", 6 "fields":[ 7 { 8 "type": "vector", 9 "path": "<field-to-index>", 10 "numDimensions": <number-of-dimensions>, 11 "similarity": "euclidean | cosine | dotProduct" 12 }, 13 { 14 "type": "filter", 15 "path": "<field-to-index>" 16 }, 17 ... 18 ] 19 }
运行以下命令以更新索引。
atlas clusters search indexes update <indexId> --clusterName [cluster_name] --file [vector-_index].json
在命令中,替换以下占位符值:
cluster_name
- 包含要更新索引的集合的 Atlas 集群的名称。vector_index
— JSON文件的名称,该文件包含 Atlas Vector Search 索引的修改后的索引定义。
要了解有关命令语法和参数的更多信息,请参阅 Atlas集群搜索索引更新命令的 Atlas CLI 文档。
在 AtlasClusters 中,转到项目的 页面。
如果尚未显示,请选择包含所需项目的组织导航栏中的Organizations菜单。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果 Clusters(数据库部署)页面尚未出现,请单击侧边栏中的 Database(数据库)。
此时会显示“集群”页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击Services标题下的Atlas Search 。
从Select data source下拉列表中,选择您的集群并单击Go to Atlas Search 。
显示Atlas Search页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击集合的Search Indexes标签页。
显示Atlas Search页面。
单击集群名称。
单击 Atlas Search 标签页。
显示Atlas Search页面。
编辑索引。
找到要编辑的
vectorSearch
类型索引。从该索引的Actions下拉列表中单击Edit Index 。
查看当前配置设置并根据需要进行编辑。
要了解有关 Atlas Vector Search 索引中字段的更多信息,请参阅如何为 Vector Search 的字段创建索引。
单击Save以应用更改。
索引状态从Active更改为Building 。在此状态下,您可以继续使用旧索引,因为在更新后的索引可供使用之前,Atlas Vector Search 不会删除旧索引。一旦状态返回到Active ,修改后的索引就可以使用了。
要使用mongosh
编辑集合的 Atlas Vector Search 索引,请执行以下步骤:
使用 连接到 Atlasmongosh
集群。
要了解更多信息,请参阅通过mongosh
连接。
db.collection.updateSearchIndex()
运行 方法。
db.collection.updateSearchIndex()
方法使用的语法如下:
1 db.<collectionName>.updateSearchIndex( 2 "<index-name>", 3 { 4 fields: [ 5 { 6 "type": "vector", 7 "numDimensions": <number-of-dimensions>, 8 "path": "<field-to-index>", 9 "similarity": "euclidean | cosine | dotProduct" 10 }, 11 { 12 "type": "filter", 13 "path": "<field-to-index>" 14 }, 15 ... 16 ] 17 } 18 );
使用MongoDB 节点驱动程序v 6更新集合的 Atlas Vector Search 索引。 6 。 0或更高版本,请执行以下步骤:
创建.js
文件并在文件中定义索引更改。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connection-string>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("<databaseName>"); 11 const collection = database.collection("<collectionName>"); 12 13 // define your Atlas Search index 14 const index = { 15 name: "<indexName>", 16 type: "vectorSearch", 17 //updated search index definition 18 definition: { 19 "fields": [ 20 { 21 "type": "vector", 22 "numDimensions": <numberOfDimensions>, 23 "path": "<field-to-index>", 24 "similarity": "euclidean | cosine | dotProduct" 25 }, 26 { 27 "type": "filter", 28 "path": "<fieldToIndex>" 29 }, 30 ... 31 ] 32 } 33 } 34 35 // run the helper method 36 await collection.updateSearchIndex("<index-name>", index); 37 } finally { 38 await client.close(); 39 } 40 } 41 run().catch(console.dir);
替换以下值并保存文件。
<connectionString> | Atlas连接string 。 要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含要为其创建索引的集合的数据库。 |
<collectionName> | 要为其创建索引的集合。 |
<indexName> | 索引的名称。 如果省略索引名称,Atlas Search 会将索引命名为 vector_index 。 |
<numberOfDimensions> | Atlas Vector Search 在索引时和查询时实施的向量维度数。 |
<fieldToIndex> | 要索引的向量和筛选器字段。 |
使用PyMongo驱动程序 v 4更新集合的 Atlas Vector Search 索引。 7或更高版本,请执行以下步骤:
创建.py
文件并在文件中定义索引更改。
1 from pymongo.mongo_client import MongoClient 2 3 # Connect to your Atlas deployment 4 uri = "<connectionString>" 5 client = MongoClient(uri) 6 7 # Access your database and collection 8 database = client["<databaseName>"] 9 collection = database["<collectionName>"] 10 11 definition = { 12 "fields": [ 13 { 14 "type": "vector", 15 "numDimensions": <numberofDimensions>, 16 "path": "<fieldToIndex>", 17 "similarity": "euclidean | cosine | dotProduct" 18 }, 19 { 20 "type": "filter", 21 "path": "<fieldToIndex>" 22 }, 23 ... 24 ] 25 } 26 27 # Update your search index 28 collection.update_search_index("<indexName>", definition)
要了解详情,请参阅 update_search_index() 方法。
替换以下值并保存文件。
<connectionString> | Atlas连接string 。 要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含要为其创建索引的集合的数据库。 |
<collectionName> | 要为其创建索引的集合。 |
<indexName> | 索引的名称。如果省略索引名称,Atlas Search 会将索引命名为 vector_index 。 |
<numberOfDimensions> | Atlas Vector Search 在索引时和查询时实施的向量维度数。 |
<fieldToIndex> | 要索引的向量和筛选器字段。 |
删除 Atlas Vector Search 索引
您可以随时从 Atlas 用户界面、Atlas 管理 API、Atlas CLI、 mongosh
或支持的MongoDB 驱动程序中删除 Atlas Vector Search 索引。
必需的访问权限
您必须具有Project Search Index Editor
或更高角色才能删除 Atlas Vector Search 索引。
步骤
➤ 使用选择语言下拉菜单选择要用于删除索引的客户端。
要使用 Atlas Administration API 删除集合的 Atlas Vector Search 索引,请向 Atlas Search indexes
端点发送DELETE
请求,并附带要删除的索引的唯一 ID 或名称。
1 curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ 2 --header "Accept: application/json" \ 3 --include \ 4 --request DELETE "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes/{indexId} | https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/clusters/{clusterName}/search/indexes/{databaseName}/{collectionName}/{indexName|indexId}"
要了解有关端点语法和参数的更多信息,请参阅“按名称删除一个搜索索引”和“按 ID 删除一个搜索索引”。
要使用 Atlas CLI 删除集合的 Atlas Vector Search 索引,请执行以下步骤:
运行命令删除索引。
atlas clusters search indexes delete <indexId> [options]
在命令中,将indexId
占位符值替换为要删除的索引的唯一标识符。
要了解有关命令语法和参数的更多信息,请参阅atlas clusters searchindexes delete命令的 Atlas CLI 文档。
在 AtlasClusters 中,转到项目的 页面。
如果尚未显示,请选择包含所需项目的组织导航栏中的Organizations菜单。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果 Clusters(数据库部署)页面尚未出现,请单击侧边栏中的 Database(数据库)。
此时会显示“集群”页面。
转到集群的 Atlas Search 页面。
您可以从侧边栏、 Data Explorer或集群详细信息页面转到 Atlas Search 页面。
在侧边栏中,单击Services标题下的Atlas Search 。
从Select data source下拉列表中,选择您的集群并单击Go to Atlas Search 。
显示Atlas Search页面。
单击集群的对应 Browse Collections 按钮。
展开数据库并选择集合。
单击集合的Search Indexes标签页。
显示Atlas Search页面。
单击集群名称。
单击 Atlas Search 标签页。
显示Atlas Search页面。
要使用mongosh
删除集合的 Atlas Vector Search 索引,请执行以下步骤:
使用 连接到 Atlasmongosh
集群。
要了解更多信息,请参阅通过mongosh
连接。
db.collection.dropSearchIndex()
运行 方法。
db.collection.dropSearchIndex()
方法使用的语法如下:
1 db.<collectionName>.dropSearchIndex( "<index-name>" );
要使用MongoDB 节点驱动程序v 6.6.0或更高版本删除集合的 Atlas Vector Search 索引,请执行以下步骤:
创建.js
文件并使用dropSearchIndex()
方法删除索引。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connectionString>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("<databaseName>"); 11 const collection = database.collection("<collectionName>"); 12 13 // run the helper method 14 await collection.dropSearchIndex("<indexName>"); 15 16 } finally { 17 await client.close(); 18 } 19 } 20 run().catch(console.dir);
替换以下值并保存文件。
<connectionString> | Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含要创建索引的集合的数据库。 |
<collectionName> | 要为其创建索引的集合。 |
<indexName> | 索引名称。如果省略索引名称,Atlas Search 会将索引命名为 vector_index 。 |
使用PyMongo驱动程序 v 4删除集合的 Atlas Vector Search 索引。 7或更高版本,请执行以下步骤:
创建.py
文件并使用drop_search_index()
方法删除索引。
1 from pymongo.mongo_client import MongoClient 2 3 # Connect to your Atlas deployment 4 uri = "<connectionString>" 5 client = MongoClient(uri) 6 7 # Access your database and collection 8 database = client["<databaseName>"] 9 collection = database["<collectionName>"] 10 11 # Delete your search index 12 collection.drop_search_index("<indexName>")
要了解详情,请参阅 drop_search_index() 方法。
替换以下值并保存文件。
<connectionString> | Atlas 连接字符串。要了解更多信息,请参阅通过驱动程序连接。 |
<databaseName> | 包含该集合的数据库名称。 |
<collectionName> | 集合的名称。 |
<indexName> | 要删除的索引的名称。 |
索引状态
在您创建 Atlas Vector Search 索引时,Status 列显示集群主节点上的索引的当前状态。可以单击状态下面的 View status details 链接,以查看集群的所有节点上的索引的状态。
当 Status 列显示为 Active时,索引已准备就绪,可供使用。在其他状态下,对索引的查询可能会返回不完整的结果。
状态 | 说明 |
---|---|
未启动 | Atlas 尚未开始构建索引。 |
初始化同步(Resumable Initial Sync) | Atlas 正在构建索引或在编辑后重新构建索引。当该索引处于以下状态时:
|
活跃的 | 索引已准备就绪。 |
正在恢复 | 复制遇到错误。当当前复制点在 mongod oplog 上不再可用时,通常会出现此状态。您仍然可以查询现有索引,直到它更新并且其状态变为Active 。使用View status details模式窗口中的错误来解决问题。要了解更多信息,请参阅修复 Atlas Search 问题。 |
已失败 | Atlas 无法构建索引。使用 View status details(查看状态详细信息)模式窗口中的错误来解决问题。要了解更多信息,请参阅修复 Atlas Search 问题。 |
正在删除 | Atlas 正在从集群节点中删除索引。 |
当 Atlas 构建索引时以及构建完成后,Documents 列会显示已完成索引的文档的百分比和数量。该列还会显示集合中的文档总数。
以下部分介绍了如何创建和管理 Atlas Vector Search 索引