创建搜索索引
定义
7.0 版本中的新增功能:(也可从 6.0.7 开始使用)
在指定集合上创建一个或多个 Atlas Search 索引。
mongosh
方法 db.collection.createSearchIndex()
提供了createSearchIndexes
数据库命令的包装器。
重要
此命令只能在MongoDB Atlas托管的部署上运行,并且需要至少 M 10的 Atlas 集群层。
语法
命令语法:
db.runCommand( { createSearchIndexes: "<collection name>", indexes: [ { name: "<index name>", definition: { /* search index definition fields */ } }, ... ] } )
命令字段
createSearchIndexes
命令接受以下字段:
字段 | 类型 | 必要性 | 说明 |
---|---|---|---|
createSearchIndexes | 字符串 | 必需 | 要在其上创建搜索索引的collection的名称。 |
indexes | 阵列 | 必需 | 描述要创建的索引的文档数组。 |
indexes.name | 字符串 | Optional | 要创建的搜索索引的名称。 不能在单个collection上创建多个同名索引。 如果未指定 |
indexes.definition | 文档 | 必需 | 描述要创建的索引的文档。 有关 definition 语法的详细信息,请参阅Atlas Search索引定义语法。 |
搜索索引定义语法
搜索索引定义包含以下字段:
{ 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 | 字符串 | Optional | 如果省略此字段,索引将使用标准分析器。 |
searchAnalyzer | 字符串 | Optional | |
mappings | 对象 | 必需 | 指定如何在该索引的不同路径上为字段建立索引。 |
mappings.dynamic | 布尔 | Optional | 为此索引启用或禁用动态字段映射。 如果设置为 如果设置为 如果省略,则默认值为 |
mappings.fields | 文档 | 可选的 | 仅在禁用了动态映射时才是必需的。 指定要索引的字段。 要了解更多信息,请参阅定义字段映射。 |
analyzers | 阵列 | Optional | 指定要在此索引中使用的自定义分析器。 |
storedSource | 布尔值或存储的源定义 | Optional | 为使用returnedStoredSource选项执行的查询指定要存储的文档字段。 您可以在 Atlas Search 上存储所有数据类型的字段。
如果省略,则默认值为 要了解更多信息,请参阅在 Atlas Search 索引中定义存储的源字段。 |
synonyms | 同义词映射定义数组 | Optional | 指定要在索引中使用的同义词映射。 通过配置同义词,您可以索引和搜索具有相同或相似含义的单词。 要了解更多信息,请参阅在 Atlas Search 索引中定义同义词映射。 |
行为
createSearchIndexes
命令会Atlas Triggers索引构建。收到命令响应与索引准备就绪之间可能存在延迟。
要查看搜索索引的状态,请使用$listSearchIndexes
聚合阶段。
访问控制
如果您的部署强制执行访问控制,则运行createSearchIndexes
命令的用户必须对数据库或collection具有createSearchIndexes
权限操作:
{ resource: { db : <database>, collection: <collection> }, actions: [ "createSearchIndexes" ] }
内置readWrite
角色提供createSearchIndexes
权限。以下示例向accountUser01
readWrite
授予products
数据库上的 角色:
db.grantRolesToUser( "accountUser01", [ { role: "readWrite", db: "products" } ] )
输出
createSearchIndexes
命令输出类似于以下内容:
{ ok: 1, indexesCreated: [ { id: "<index Id>", name: "<index name>" } ] }
重要
响应字段ok: 1
指示命令成功。 但是,从收到响应到创建的索引可供使用之间可能存在延迟。
要查看搜索索引的状态,请使用$listSearchIndexes
聚合阶段。
示例
创建所有字段的搜索索引
searchIndex01
contacts
以下示例在collection上创建了一个名为 的搜索索引:
db.runCommand( { createSearchIndexes: "contacts", indexes: [ { name: "searchIndex01", definition: { mappings: { dynamic: true } } } ] } )
索引定义指定mappings: { dynamic: true }
,这意味着该索引包含集合中具有受支持数据类型的所有字段。
使用语言分析器创建搜索索引
语言分析器引入了停用词,这些词的重要性不足以进行索引。
frenchIndex01
cars
以下示例在collection集合上创建名为 的搜索索引,并在 字段上指定lucene.french
fr
分析器:
db.runCommand( { createSearchIndexes: "cars", indexes: [ { name: "frenchIndex01", definition: { mappings: { fields: { subject: { fields: { fr: { analyzer: "lucene.french", type: "string" } }, type: "document" } } } } } ] } )
要了解有关语言分析器的更多信息,请参阅语言分析器。
创建多个搜索索引
以下命令在products
collection 上创建两个搜索索引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
使用动态字段映射,这意味着索引包含集合中具有受支持数据类型的所有字段。