创建搜索索引
定义
新版本中7.0: (从6.0.7版本开始可用)
创建一个或多个Atlas Search索引或向量搜索索引,在指定的集合上。
The mongosh
方法db.collection.createSearchIndex()
提供了一个围绕createSearchIndexes
数据库命令的包装。
重要
此命令只能在托管在MongoDB Atlas的部署上运行,并且在无服务器实例中不支持。
语法
命令语法
db.runCommand( { createSearchIndexes: "<collection name>", indexes: [ { name: "<index name>", type: "<search index type>", definition: { /* search index definition fields */ } }, ... ] } )
命令字段
createSearchIndexes
命令接受以下字段
字段 | 类型 | 必要性 | 描述 |
---|---|---|---|
创建搜索索引 | string | 必需 | 要创建搜索索引的集合名称。 |
indexes | array | 必需 | 描述要创建的索引的文档数组。 |
indexes.name | string | 可选 | 要创建的搜索索引名称。 在单个集合中,不允许使用相同的名称创建多个索引。 如果您未指定 |
indexes.type | string | 可选 | 要创建的搜索索引类型。您可以指定以下之一
如果您省略了 |
indexes.definition | document | 必需 | 描述要创建的索引的文档。根据您是创建标准搜索索引还是向量搜索索引, |
搜索索引定义语法
搜索索引定义包含以下字段
{ analyzer: "<analyzer-for-index>", searchAnalyzer: "<analyzer-for-query>", mappings: { dynamic: <boolean>, fields: { <field-definition> } }, analyzers: [ <custom-analyzer> ], storedSource: <boolean> | { <stored-source-definition> }, synonyms: [ { name: "<synonym-mapping-name>", source: { collection: "<source-collection-name>" }, analyzer: "<synonym-mapping-analyzer>" } ] }
字段 | 类型 | 必要性 | 描述 |
---|---|---|---|
analyzer | string | 可选 | |
searchAnalyzer | string | 可选 | |
mappings | object | 必需 | 指定如何为该索引索引不同路径上的字段。 |
mappings.dynamic | boolean | 可选 | 启用或禁用此索引的动态字段映射。 如果设置为 如果设置为 如果省略,则默认为 |
mappings.fields | document | Conditional | 仅在禁用动态映射时才需要。 指定要索引的字段。有关更多信息,请参阅定义字段映射。 |
analyzers | array | 可选 | 指定在此索引中使用的自定义分析器。 |
storedSource | boolean or Stored Source Definition | 可选 | 指定用于使用returnedStoredSource选项执行的查询时要存储的文档字段。 您可以在Atlas Search上存储所有数据类型的字段。`
如果省略,则默认为 要了解更多信息,请参阅在您的Atlas Search索引中定义存储源字段。 |
同义词 | 一组同义词映射定义 | 可选 | 指定要在索引中使用的同义词映射。配置同义词允许您索引和搜索具有相同或相似意义的单词。 要了解更多信息,请参阅在您的Atlas Search索引中定义同义词映射。 |
向量搜索索引定义语法
向量搜索索引定义包含以下字段:
{ "fields": [ { "type": "vector" | "filter", "path": "<field-to-index>", "numDimensions": <number-of-dimensions>, "similarity": "euclidean" | "cosine" | "dotProduct" } ] }
有关向量搜索索引定义字段的说明,请参阅如何为向量搜索索引字段。
行为
createSearchIndexes
命令触发索引构建。您从命令收到响应到索引准备就绪之间可能会有延迟。
要查看您搜索索引的状态,请使用$listSearchIndexes
聚合阶段。
访问控制
如果您的部署实施了访问控制,运行创建搜索索引命令的用户必须在数据库或集合上拥有createSearchIndexes
权限动作
{ resource: { db : <database>, collection: <collection> }, actions: [ "createSearchIndexes" ] }
内置的readWrite
角色提供了createSearchIndexes
权限。以下示例将readWrite
角色授予accountUser01
用户,在products
数据库上
db.grantRolesToUser( "accountUser01", [ { role: "readWrite", db: "products" } ] )
输出
创建搜索索引命令的输出类似于以下内容
{ ok: 1, indexesCreated: [ { id: "<index Id>", name: "<index name>" } ] }
重要
响应字段ok: 1
表示命令成功。但是,您收到响应和创建的索引可用于使用之间可能有延迟。
要查看您搜索索引的状态,请使用$listSearchIndexes
聚合阶段。
示例
在所有字段上创建搜索索引
以下示例在 contacts
集合上创建了一个名为 searchIndex01
的搜索索引
db.runCommand( { createSearchIndexes: "contacts", indexes: [ { name: "searchIndex01", definition: { mappings: { dynamic: true } } } ] } )
索引定义指定了 mappings: { dynamic: true }
,这意味着索引包含集合中所有具有 支持的数据类型 的字段。
使用语言分析器创建搜索索引
语言分析器引入了停用词,这些词对于索引来说不够重要。
以下示例在 cars
集合上创建了一个名为 frenchIndex01
的搜索索引,并指定了 fr
字段上的 lucene.french
分析器。
db.runCommand( { createSearchIndexes: "cars", indexes: [ { name: "frenchIndex01", definition: { mappings: { fields: { subject: { fields: { fr: { analyzer: "lucene.french", type: "string" } }, type: "document" } } } } } ] } )
要了解更多关于语言分析器的信息,请参阅 语言分析器。
创建多个搜索索引
以下命令在 products
集合上创建了两个搜索索引,分别是 searchIndex02
和 searchIndex03
db.runCommand( { createSearchIndexes: "products", indexes: [ { name: "searchIndex02", definition: { mappings: { fields: { title: { type: "string", analyzer: "lucene.simple" } } } } }, { name: "searchIndex03", definition: { mappings: { dynamic: true } } } ] } )
searchIndex02
使用了一个简单的分析器对 title
字段进行分析。简单的分析器基于非字母字符(如空白、标点符号或数字)将文本划分为可搜索的术语。
searchIndex03
使用动态字段映射,这意味着索引包含集合中所有具有 支持的数据类型 的所有字段。
创建向量搜索索引
以下示例在 movies
集合上创建了一个名为 vectorSearchIndex01
的向量搜索索引
db.runCommand( { createSearchIndexes: "movies", indexes: [ { name: "vectorSearchIndex01", type: "vectorSearch", definition: { fields: [ { type: "vector", numDimensions: 1, path: "genre", similarity: "cosine" } ] } } ] } )
该向量搜索索引包含一个维度,并索引了 genre
字段。