创建MongoDB Search索引时,可以使用以下方法指定要索引的字段:
动态映射:启用MongoDB Search
typeSet以根据默认或配置的字段类型设立() 自动为所有字段索引。静态映射:允许您指定要索引的字段。
数据类型的限制
默认下, MongoDB Search 停止复制副本集或单个分片上超过 2.1 十亿个索引对象的索引更改,其中每个已建立索引的文档或嵌套 embeddedDocument 都算作单个对象。这意味着您的索引仍然可查询,但可能会得到过时的结果。
如果计划索引可能超过2.1 十亿个对象的字段,其中索引对象是顶层文档或嵌入式文档,请使用 numPartitions索引选项对索引进行分区(仅在搜索节点部署中支持)或对集群分片。
您无法对字段名称开头包含美元 ($) 符号的字段创建索引。
语法
以下语法演示了如何启用MongoDB Search 使用动态和静态映射对字段进行索引。要学习;了解有关动态和静态映射的更多信息,请参阅 动态和静态映射。
1 { 2 "mappings": { 3 "dynamic": true|false | { 4 "typeSet": "<typeset-name>" 5 }, 6 "fields": { 7 "<field-name>": { 8 "type": "<field-type>", 9 ... 10 }, 11 ... 12 } 13 }, 14 "typeSets": [ 15 { 16 "name": "<typeset-name>", 17 "types": [ 18 { 19 "type": "<field-type>", 20 ... 21 }, 22 ... 23 ] 24 }, 25 ... 26 ] 27 }
动态和静态映射
您可以通过以下方式配置MongoDB Search:
动态映射,用于根据默认或配置的类型设立(
typeSet) 自动为字段索引仅索引指定字段的静态映射
您还可以将动态映射与静态映射结合使用。静态映射会覆盖动态映射配置。
动态映射
MongoDB Search 动态映射允许您将MongoDB Search 配置为自动递归地索引数据中的字段。可以根据默认类型设立或通过配置 typeSet 对字段进行索引。
您可以启用或配置动态映射:
在根
mappings级别应用整个文档。[推荐] 在
document字段中键入要应用指定对象的字段。[推荐] 在
embeddedDocuments字段类型中,要应用需要逐元素查询比较的指定对象大量(类似于$elemMatch)。
注意
最佳实践
动态映射可能会导致对大量唯一字段索引,从而占用更多磁盘空间并且可能降低性能。仅当需要对定期更改或未知的字段索引,才使用动态映射。始终在文档中而不是在父文档级别使用动态映射。
当您使用动态映射对数据索引时:
MongoDB Search 还会对数据中
document对象中的typeSet支持的所有嵌套字段进行动态索引。如果字段包含多态数据, MongoDB Search 会自动将该字段索引为索引中使用的
typeSet支持的所有类型。如果字段包含typeSet不支持类型的数据, MongoDB Search 将不会索引该数据。
启用默认值 typeSet
typeSet当dynamic 设立为true 时, MongoDB搜索使用默认的 。在默认的typeSet 中, MongoDB Search 将 BSON 类型作为MongoDB Search字段类型进行索引。下表显示了当您使用默认 时, MongoDB搜索自动索引为MongoDB搜索字段类型的typeSet BSON 类型。当以下BSON 类型包含在数组和对象中时, MongoDB搜索还会自动对其进行索引。
以下是为动态映射启用默认类型设立的语法:
1 { 2 "mappings": { 3 "dynamic": true | { 4 "typeSet": "<typset-name>" 5 }, 6 "typeSets": [ 7 { 8 "name": "<typset-name>", 9 "types": [ 10 { 11 "type": "<field-type>" 12 }, 13 ... 14 ] 15 }, 16 ... 17 ] 18 } 19 }
有关索引使用默认typeSet 对所有字段索引示例,请参阅动态映射示例。
配置 typeSet
通过配置 指定要动态索引的MongoDB搜索字段类型。您可以将任何BSON类型配置为作为任何MongoDB搜索字段类型自动编制索引,但typeSet documentembeddedDocuments、 或已弃用的字段类型除外。
typeSet 采用以下语法:
1 { 2 "mappings": { 3 "dynamic": { 4 "typeSet": "<typeset-name>" 5 }, 6 "fields": { 7 "<field-name>": { 8 "type": "<field-type>", 9 ... 10 }, 11 ... 12 } 13 }, 14 "typeSets": [ 15 { 16 "name": "<typeset-name>", 17 "types": [ 18 { 19 "type": "<field-type>" 20 }, 21 ... 22 ] 23 }, 24 ... 25 ] 26 }
在配置 typeSet 之前,请考虑以下事项:
不能在同一
typeSet对象中多次定义相同的字段类型。您只能为每种字段类型配置一个typeSet定义。示例,您不能在同一
typeSet定义中为number类型定义多个配置。您可以使用
multi分析器配置动态映射。
您无法从Atlas用户界面Visual Editor 配置 typeSet。请改用Atlas用户界面JSON Editor。
typeSet有关演示使用自定义 配置的索引示例,请参阅动态映射示例。
静态映射
使用静态映射为您不希望动态编制索引选项,或者独立于索引中的其他字段配置单个字段。使用静态映射时, MongoDB Search 仅对您在mappings.fields 中指定的字段编制索引。您还可以使用静态映射将字段排除在索引之外。
要使用静态映射仅为某些字段配置索引选项,设立为mappings.dynamic false,并为要建立索引的每个字段指定字段名称、数据类型和其他配置选项。您可以按任意顺序指定字段。
如果您忽略 mappings.dynamic 字段,则默认为 false。
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
要定义嵌套字段的索引,必须为该嵌套字段的每个父字段定义映射。不能使用点表示法对嵌套字段进行静态索引。有关示例,请参阅下面的示例或组合映射示例。
以下示例显示了将一个字段索引为多种类型的字段定义。
1 { 2 "mappings": { 3 "dynamic": true|false | { 4 "typeSet": "<type-set-name>" 5 }, 6 "fields": { 7 "<field-name>": [ 8 { 9 "type": "<field-type>", 10 ... 11 }, 12 { 13 "type": "<field-type>", 14 ... 15 }, 16 ... 17 ], 18 ... 19 } 20 }. 21 "typeSets": [ 22 { 23 "name": "<typeset-name>", 24 "types": [ 25 { 26 "type": "<field-type>" 27 }, 28 ... 29 ] 30 }, 31 ... 32 ] 33 }
MongoDB搜索字段类型
MongoDB Search 不支持以下BSON数据类型:
Decimal128
带作用域的 JavaScript 代码
Max key
Min key
正则表达式
时间戳
MongoDB Search 会自动在 mongot 上存储字符串类型的字段。您可以使用索引定义中的 在MongoDB搜索索引中定义存储的源字段 选项,在MongoDB搜索上存储所有支持 数据类型 的字段。要学习;了解有关 mongot 和MongoDB Search节点架构的更多信息,请参阅MongoDB Search 部署选项。
下表列出了支持的BSON数据类型以及可用于对BSON数据类型索引的MongoDB搜索字段类型。该表还列出了可用于查询字段值的操作符和收集器。
BSON 类型 | MongoDB搜索字段类型 | 运算符和收集器 |
|---|---|---|
支持数组中数据类型的操作符。 | ||
布尔 | ||
Date | ||
Date | ||
double | ||
double | ||
double | ||
32 位整数 | ||
32 位整数 | ||
64 位整型 | ||
64 位整型 | ||
null | 不适用 | |
对象 | 支持对象中字段类型的操作符。 | |
对象 | embeddedDocument(用于对象数组) | |
ObjectId | ||
字符串 | ||
字符串 | ||
字符串 | ||
字符串 | ||
这些操作符不支持字符串大量。
MongoDB Search 不包含用于索引null 值的字段类型,因为MongoDB Search 会自动为静态和动态索引字段的 null 值索引。
已弃用。要学习;了解有关已弃用的分面(Facet)字段类型及其更新对应项的更多信息,请参阅比较分面字段类型。
注意
您可以使用 选项在MongoDB SearchstoredSource 上存储所有支持数据类型的字段。
示例
以下示例使用sample_mflix.movies 集合演示如何配置字段以使用动态和静态映射进行索引。如果加载示例数据,则可以在集合上创建这些索引。要学习;了解如何创建MongoDB Search 索引,请参阅MongoDB Search 快速入门。
动态映射示例
以下索引定义示例演示了动态映射。
在此索引定义中,dynamic 布尔标志设立为 true,以自动为集合中的所有动态可索引字段索引。
{ mappings: { "dynamic": true } }
以下索引定义为指定字段类型配置动态映射。它索引:
集合中作为
number字段类型的所有数值都使用该类型的默认设置。集合中
autocomplete类型的所有字符串值均使用edgeGram分词策略,每个词元最少有 4 个字符,最多有 10 个字符。
{ "mappings": { "dynamic": { "typeSet": "movieFieldTypes" } }, "typeSets": [ { "name": "movieFieldTypes", "types": [ { "type": "number" }, { "type": "autocomplete", "analyzer": "lucene.standard", "tokenization": "edgeGram", "minGrams": 4, "maxGrams": 10 } ] } ] }
此索引定义:
将默认索引分析器指定为 lucene.standard。
将默认搜索分析器指定为 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
使用名为
first的typeSet将根级别的所有string字段的自动索引配置为以下字段类型:token类型,使用该类型的默认设置。autocomplete类型,使用该类型的默认设置。
为
awards文档指定静态映射,其中包含具有数字值和文本值的字段。但是,索引定义使用名为second的typeSet,仅配置对文档中类型为number的字段进行自动索引。
{ "mappings": { "dynamic": { "typeSet": "first" }, "fields": { "awards": { "type": "document", "dynamic": { "typeSet": "second" } } } }, "typeSets": [ { "name": "first", "types": [ { "type": "token" }, { "type": "autocomplete" } ] }, { "name": "second", "types": [ { "type": "number" } ] } ] }
此索引定义:
将默认索引分析器指定为 lucene.standard。
将默认搜索分析器指定为 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
在根级别启用对所有动态可索引字段的自动索引。
启用对
tomatoes文档内所有动态可索引字段的自动索引,但在tomatoes.viewer文档中仅配置对number类型的自动索引。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": true, "fields": { "tomatoes": { "type": "document", "dynamic": true, "fields": { "viewer": { "type": "document", "dynamic": { "typeSet": "numericOnly" } } } } } }, "typeSets": [ { "name": "numericOnly", "types": [ { "type": "number" } ] } ] }
静态映射示例
以下索引定义示例演示了静态映射。
将默认索引分析器指定为 lucene.standard。
将默认搜索分析器指定为 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
指定静态字段映射 (
dynamic:false),这意味着未显式提及的字段不会被编入索引。因此,索引定义包括:awards字段,其类型为document。它具有三个嵌入式子字段:wins、nominations和text。wins和nominations子字段默认使用 lucene.standard分析器进行查询。 MongoDB Search 为int64字段中的nominations值建立索引。text子字段默认使用 lucene.english分析器进行查询。它使用ignoreAbove选项忽略任何长度超过255 字节的字符串。title字段,其类型为string。它默认使用 lucene.whitespace 分析器进行查询。它有一个名为mySecondaryAnalyzer的multi分析器,它默认使用 lucene.french 分析器进行查询。genres字段,它是一个字符串大量。默认下,它使用lucene.standard分析器进行查询。对于索引数组, MongoDB Search 仅需要大量元素的数据类型。您不必在索引定义中指定数据包含在大量中。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "awards": { "type": "document", "fields": { "wins": { "type": "number" }, "nominations": { "type": "number", "representation": "int64" }, "text": { "type": "string", "analyzer": "lucene.english", "ignoreAbove": 255 } } }, "title": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "genres": { "type": "string", "analyzer": "lucene.standard" } } } }
此索引定义:
将默认索引分析器指定为 lucene.standard。
将默认搜索分析器指定为 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
使用名为
indexedTypes的typeSet配置特定字段类型的动态映射,其中指定以下内容:必须使用
token类型的默认设置将string类型的字段自动索引为token类型。必须使用
number类型的默认设置将number类型的字段自动索引为number类型。
不将
plot字段纳入索引。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": { "typeSet": "indexedTypes" }, "fields": { "plot": [] } }, "typeSets": [ { "name": "indexedTypes", "types": [ { "type": "token" }, { "type": "number" } ] } ] }
组合映射示例
以下索引定义示例将动态映射与静态映射相结合。
此索引定义:
将默认索引分析器指定为 lucene.standard。
将默认搜索分析器指定为 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
指定静态字段映射 (
dynamic:false),这意味着未显式提及的字段和字段类型不会被编入索引。因此,索引定义包括:title字段,其类型为string。它默认使用 lucene.whitespace 分析器进行查询。它有一个名为mySecondaryAnalyzer的multi分析器,它默认使用 lucene.french 分析器进行查询。genres字段,它是一组字符串。默认情况下,它使用 lucene.standard 分析器进行查询。awards字段,其类型为document。它具有三个嵌入式子字段:wins、nominations和text。该索引定义无需明确提及文档中的每个嵌套字段,而是可为文档中的所有子字段启用动态映射。默认下,它使用 lucene.standard分析器进行查询。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "title": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "genres": { "type": "string", "analyzer": "lucene.standard" }, "awards": { "type": "document", "dynamic": true } } } }
此索引定义:
将默认索引分析器指定为 lucene.standard。
将默认搜索分析器指定为 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
指定静态字段映射 (
dynamic:false),这意味着未显式提及的字段和字段类型不会被编入索引。因此,索引定义仅包括awards字段,其类型为document。awards字段具有三个嵌入式子字段:winsnominations、 和text。索引索引使用字段字段字段文档动态索引:名为dynamictruedocumentmovieAwards的类型定义:同时使用
lucene.english和lucene.french分析器对类型为string的字段进行索引。使用
number类型的默认设置对number类型的字段进行索引。使用
edgeGram分词策略对string类型和autocomplete类型的字段进行索引,创建长度在三到五个字符之间的词元。{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "awards": { "type": "document", "dynamic": { "typeSet": "movieAwards" } } } }, "typeSets": [ { "name": "movieAwards", "types": [ { "type": "string", "multi": { "english": { "type": "string", "analyzer": "lucene.english" }, "french": { "type": "string", "analyzer": "lucene.french" } } }, { "type": "number" }, { "type": "autocomplete", "analyzer": "lucene.standard", "tokenization": "edgeGram", "minGrams": 3, "maxGrams": 5, "foldDiacritics": false } ] } ] }
在此索引定义中:
默认索引分析器是 lucene.standard
默认搜索分析器是 lucene.standard。如果您希望查询词的解析术语与其在MongoDB搜索索引中的存储方式不同,则可以更改搜索分析器。
该索引为名为
first的typeSet定义中定义的字段类型指定动态映射。firsttypeSet定义使用字段类型的默认设置,将类型为string的所有字段索引为token类型,并将类型为number的所有字段索引为number类型。索引定义指定了
awards字段的静态映射,但使用名为second的typeSet为awards文档中的字段配置了动态映射。second字段类型定义使用该类型的默认设置,将awards文档中类型为string的所有字段索引为autocomplete类型。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": { "typeSet": "first" }, "fields": { "awards": { "type": "document", "dynamic": { "typeSet": "second" } } } }, "typeSets": [ { "name": "first", "types": [ { "type": "token" }, { "type": "number" } ] }, { "name": "second", "types": [ { "type": "autocomplete" } ] } ] }