文档菜单
文档首页
/
MongoDB 手册
/ / /

创建搜索索引

在本页

  • 定义
  • 语法
  • 命令字段
  • 搜索索引定义语法
  • 向量搜索索引定义语法
  • 行为
  • 访问控制
  • 输出
  • 示例
  • 在所有字段上创建搜索索引
  • 使用语言分析器创建搜索索引
  • 创建多个搜索索引
  • 创建向量搜索索引
  • 了解更多
createSearchIndexes

版本中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
可选

要创建的搜索索引名称。

在单个集合中,不允许使用相同的名称创建多个索引。

如果您未指定 name,则索引名称为 default

indexes.type
string
可选

要创建的搜索索引类型。您可以指定以下之一

  • search

  • vectorSearch

如果您省略了 type 字段,则索引类型为 search

indexes.definition
document
必需

描述要创建的索引的文档。根据您是创建标准搜索索引还是向量搜索索引,definition 语法不同。有关 definition 语法的详细信息,请参阅

搜索索引定义包含以下字段

{
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
可选

指定在搜索文本之前应用于查询文本的分析器

如果省略此字段,索引将使用在analyzer字段中指定的相同分析器。

如果同时省略了searchAnalyzeranalyzer字段,索引将使用标准分析器

mappings
object
必需
指定如何为该索引索引不同路径上的字段。
mappings.dynamic
boolean
可选

启用或禁用此索引的动态字段映射。

如果设置为true,则索引包含所有包含支持的数据类型的字段。

如果设置为false,则必须使用mappings.fields指定要索引的单独字段。

如果省略,则默认为false

mappings.fields
document
Conditional

仅在禁用动态映射时才需要。

指定要索引的字段。有关更多信息,请参阅定义字段映射

analyzers
array
可选
指定在此索引中使用的自定义分析器
storedSource
可选

指定用于使用returnedStoredSource选项执行的查询时要存储的文档字段。

您可以在Atlas Search上存储所有数据类型的字段。`storedSource`的值可以是以下之一:

  • true,用于存储所有字段

  • false,用于不存储任何字段

  • 一个指定要包含排除存储的字段的对象

如果省略,则默认为false

要了解更多信息,请参阅在您的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 集合上创建了两个搜索索引,分别是 searchIndex02searchIndex03

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 字段。

返回

Atlas Search