创建MongoDB Search索引时,可以使用以下方法指定要索引的字段:
动态映射:使MongoDB Search 能够自动索引支持类型的所有字段。
静态映射:使您能够指定要索引的字段。
数据类型的限制
如果您创建的MongoDB搜索索引拥有或即将拥有超过2.1 十亿个索引对象,则必须在您的集群使用
numPartitions
或 分片。对于此限制,索引集合字段中的每个顶级文档或嵌套embeddedDocument
都算作一个对象默认下, MongoDB搜索会停止复制任何给定副本集成员或分片上增长超过 2.1 十亿个索引对象的单个索引的更改。这意味着您的索引仍然可查询,但可能会得到过时的结果。
如果您计划对可能超过 2.1 十亿个对象的字段进行索引,其中索引对象是顶层文档或嵌入式文档,请使用 numPartitions 索引选项对索引进行分区(仅在搜索节点部署上支持)或 分片集群。
您无法对字段名称开头包含美元 (
$
) 符号的字段创建索引。
语法
要使用动态映射,请在索引定义中将 mappings.dynamic
设置为 true
。您还可以通过指定字段名称、数据类型和其他配置选项来配置每个要在 mappings.fields
中配置的字段。您可以按任意顺序指定字段。
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { // Optional, use this to configure individual fields 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
要使用静态映射,请将 mappings.dynamic
设置为 false
,并为您想在 mappings.fields
中索引的每个字段指定字段名称、数据类型和其他配置选项。您可以按任意顺序指定字段。
如果您忽略 mappings.dynamic
字段,则默认为 false
。
1 { 2 "mappings": { 3 "dynamic": false, // Optional, if omitted defaults to "false" 4 "fields": { 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
您可以通过为包含多态数据的字段指定一个字段定义数组,将其索引为多种类型,每种数据类型对应一个字段定义。
1 { 2 "mappings": { 3 "dynamic": <boolean>, 4 "fields": { 5 "<field-name>": [ 6 { 7 "type": "<field-type>", 8 ... 9 }, 10 { 11 "type": "<field-type>", 12 ... 13 }, 14 ... 15 ], 16 ... 17 }, 18 ... 19 } 20 }
静态与动态映射
您可以使用静态和动态映射来指定MongoDB Search 是否必须自动索引集合中所有可动态索引的字段。
动态映射
使用动态映射自动索引集合中受支持类型的所有字段。仅当您的模式定期更改或未知,或者您正在试验MongoDB Search 时,我们才建议使用动态映射。动态映射索引比静态映射索引占用更多磁盘空间,并且性能可能较低。
当您对包含多态数据的字段进行动态索引, MongoDB Search 会自动将该字段索引为与该数据对应的所有可动态索引的字段类型。如果该字段包含MongoDB Search 不会自动索引的数据类型,则MongoDB Search 不会对该数据索引。
MongoDB Search 使用检测到的数据类型的默认设置动态索引文档中的所有字段。MongoDB Search 还会动态索引该文档下的所有嵌套文档,除非您通过将 dynamic
设置为 false
来显式覆盖。
要了解哪些数据类型支持动态索引,请参阅下方的数据类型部分。
静态映射
使用静态映射为您不希望动态编制索引选项,或者独立于索引中的其他字段配置单个字段。使用静态映射时, MongoDB Search 仅对您在 mappings.fields
中指定的字段建立索引。
当您对包含多态数据的字段进行静态索引, MongoDB Search 仅对与该字段的索引定义中指定的映射相对应的文档进行索引。MongoDB Search 不会索引与该字段的索引定义中指定的数据类型不匹配的文档。
要为嵌套字段定义索引,必须为该嵌套字段的每个父字段定义映射。不能使用点表示法对嵌套字段进行静态索引。有关示例,请参阅示例或组合映射示例如下。
数据类型
MongoDB Search 不支持以下BSON数据类型:
Decimal128
带作用域的 JavaScript 代码
Max key
Min key
正则表达式
时间戳
MongoDB Search 会自动在 mongot
上存储字符串类型的字段。您可以使用索引定义中的 在MongoDB搜索索引中定义存储的源字段 选项,在MongoDB搜索上存储所有支持 数据类型 的字段。要学习;了解有关 mongot
和MongoDB Search节点架构的更多信息,请参阅MongoDB Search 部署选项。
下表列出了支持的 BSON数据类型 以及可用于对 BSON 数据类型索引的 MongoDB搜索字段类型 。该表还指示启用动态映射时MongoDB Search字段类型是否自动包含在MongoDB Search索引中,并列出可用于查询字段值的操作符和收集器。
BSON 类型 | MongoDB搜索字段类型 | 已动态索引 | 运算符和收集器 |
---|---|---|---|
✓ | 支持数组中数据类型的操作符。 | ||
布尔 | ✓ | ||
Date | ✓ | ||
Date | |||
double | ✓ | ||
double | |||
double | |||
32 位整数 | ✓ | ||
32 位整数 | |||
64 位整型 | ✓ | ||
64 位整型 | |||
null | 不适用 | ✓ | |
对象 | ✓ | 所有操作符 | |
对象 | embeddedDocument(用于对象数组) | ||
ObjectId | ✓ | ||
字符串 | ✓ | ||
字符串 | |||
字符串 | |||
字符串 | |||
✓ |
存在某些限制条件。要了解详情,请参阅如何为数组元素创建索引。
对于 string
类型,moreLikeThis 和 queryString 操作符不支持字符串数组。
MongoDB Search 不包含用于索引null 值的字段类型,因为MongoDB Search 会自动为静态和动态索引字段的 null 值索引。
已弃用。
注意
您可以使用 选项在MongoDB SearchstoredSource
上存储所有支持数据类型的字段。
将字段索引为多个数据类型
若要将字段索引为多个类型,请在字段定义数组中定义该字段的类型。
例子
以下示例显示了将一个字段索引为多种类型的字段定义。
1 { 2 ... 3 "mappings": { 4 "dynamic": <boolean>, 5 "fields": { 6 "<field-name>": [ 7 { 8 "type": "<field-type>", 9 ... 10 }, 11 { 12 "type": "<field-type>", 13 ... 14 }, 15 ... 16 ], 17 ... 18 }, 19 ... 20 } 21 }
示例
静态映射示例
以下索引定义示例使用静态映射。
默认索引分析器是 lucene.standard
默认搜索分析器是 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
索引指定静态字段映射 (
dynamic
:false
),这意味着未明确提及的字段不会添加索引。因此,索引定义包括:address
字段,其类型为document
。它有两个嵌入式子字段,即city
和state
。city
子字段默认使用 lucene.simple 分析器进行查询。它使用ignoreAbove
选项忽略任何长度超过 255 字节的字符串。state
子字段默认使用 lucene.english 分析器进行查询。company
字段,其类型为string
。它默认使用 lucene.whitespace 分析器进行查询。它有一个名为mySecondaryAnalyzer
的multi
分析器,它默认使用 lucene.french 分析器进行查询。employees
字段,它是一个字符串大量。默认下,它使用lucene.standard分析器进行查询。对于索引数组, MongoDB Search 仅需要大量元素的数据类型。您不必在索引定义中指定数据包含在大量中。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "address": { "type": "document", "fields": { "city": { "type": "string", "analyzer": "lucene.simple", "ignoreAbove": 255 }, "state": { "type": "string", "analyzer": "lucene.english" } } }, "company": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "employees": { "type": "string", "analyzer": "lucene.standard" } } } }
组合映射示例
以下索引定义示例同时使用静态和动态映射。
默认索引分析器是 lucene.standard
默认搜索分析器是 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
索引指定静态字段映射 (
dynamic
:false
),这意味着未显式提及的字段不被编入索引。因此,索引定义包括:company
字段,其类型为string
。它默认使用 lucene.whitespace 分析器进行查询。它有一个名为mySecondaryAnalyzer
的multi
分析器,它默认使用 lucene.french 分析器进行查询。employees
字段,它是一组字符串。默认情况下,它使用 lucene.standard 分析器进行查询。address
字段,其为document
类型。它有两个嵌入式子字段:city
和state
。索引定义不显式提及文档中的每个嵌套字段,而支持对文档中所有子字段的动态映射。默认使用 lucene.standard 分析器进行查询。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "company": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "employees": { "type": "string", "analyzer": "lucene.standard" }, "address": { "type": "document", "dynamic": true } } } }