Docs 菜单
Docs 主页
/
MongoDB 阿特拉斯
/ / / / /

词元筛选器

在此页面上

  • asciiFolding
  • 属性
  • 例子
  • daitchMokotoffSoundex
  • 属性
  • 例子
  • edgeGram
  • 属性
  • 例子
  • englishPossessive
  • 属性
  • 例子
  • flattenGraph
  • 属性
  • 例子
  • icuFolding
  • 属性
  • 例子
  • icuNormalizer
  • 属性
  • 例子
  • kStemming
  • 属性
  • 例子
  • 长度
  • 属性
  • 例子
  • lowercase
  • 属性
  • 举例
  • nGram
  • 属性
  • 例子
  • porterStemming
  • 属性
  • 例子
  • 正则表达式(Regex)
  • 属性
  • 例子
  • reverse
  • 属性
  • 例子
  • shingle
  • 属性
  • 例子
  • snowballStemming
  • 属性
  • 例子
  • spanishPluralStemming
  • 属性
  • 例子
  • Stempel
  • 属性
  • 例子
  • stopword
  • 属性
  • 例子
  • trim
  • 属性
  • 例子
  • wordDelimiterGraph
  • 属性
  • 例子

词元筛选器执行如下操作:

  • 提取词干,这会将相关词语(例如“talking”、“talked”和“talks”)缩减为词根“talk”。

  • 编辑,这会从公共文档中删除敏感信息。

词元筛选器始终需要使用类型字段,某些词元筛选器还采用额外的选项。它采用以下语法:

"tokenFilters": [
{
"type": "<token-filter-type>",
"<additional-option>": <value>
}
]

以下样本索引定义和查询使用名为 minutes样本集合。如果您将minutes集合添加到 Atlas 集群中的数据库,则可以从 Atlas 用户界面中的 Atlas Search 可视化编辑器或 JSON编辑器创建以下样本索引,并针对该集合运行样本查询。要创建这些索引,请在 Atlas 用户界面中选择首选配置方法后,选择数据库和集合,然后优化索引以添加使用词元筛选器的自定义分析器。

注意

当您在 Atlas UI 中使用 Visual Editor 添加自定义分析器时,Atlas UI 会在 Custom Analyzers 部分中显示有关分析器的以下详细信息。

名称
标识自定义分析器的标签。
用于
使用自定义分析器的字段。如果自定义分析器不用于分析任何字段,则值为 None
字符筛选器
在自定义分析器中配置的 Atlas Search 字符筛选器
分词器
在自定义分析器中配置的 Atlas Search 分词器
词元筛选器
在自定义分析器中配置的 Atlas Search 词元过滤器
操作

可单击的图标,指示可以对自定义分析器执行的操作。

  • 单击 编辑自定义分析器。

  • 单击 删除自定义分析器。

词元筛选器转换 基本拉丁 asciiFoldingUnicode 区块 以外的字母、数字和符号 unicode 字符 转换为对应的 ASCII 码 (如果可用)。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 asciiFolding
originalTokens
字符串
没有

此字符串指定在词元过滤器的输出中是否包含或省略原始词元。值可以是以下值之一:

  • include — 在词元筛选器输出中包含原始词元和转换的词元。如果要支持对原始词元和转换形式的查询,我们建议使用该值。

  • omit — 省略原始词元,仅在词元筛选器输出中包含转换的词元。如果要仅查询原始词元的转换形式,请使用该值。

默认值omit

以下索引定义使用名为 asciiConverter 的自定义分析器对 minutes 集合中的 page_updated_by.first_name 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 应用 asciiFolding 词元筛选器,以将字段值转换为等效的 ASCII 字符。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 asciiConverter

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 asciiFolding

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add 可创建自定义分析器。

  10. Field Mappings 部分,单击 Add Field Mapping 可对 page_updated_by.first_name字段应用自定义分析器。

  11. 选择 page_updated_by.first_name(位于 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  12. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 asciiConverter

  13. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"dynamic": false,
"fields": {
"page_updated_by": {
"type": "document",
"dynamic": false,
"fields": {
"first_name": {
"type": "string",
"analyzer": "asciiConverter"
}
}
}
}
},
"analyzers": [
{
"name": "asciiConverter",
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "asciiFolding"
}
]
}
]
}

以下查询使用等效的 ASCII 字符在 minutes 集合的 first_name 字段中搜索名称。

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "Sian",
"path": "page_updated_by.first_name"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.last_name": 1,
"page_updated_by.first_name": 1
}
}
])
[
{
_id: 1,
page_updated_by: { last_name: 'AUERBACH', first_name: 'Siân'}
}
]

Atlas Search 在结果中返回具有 _id: 1 的文档,因为 Atlas Search 为文档中的 page_updated_by.first_name 字段创建了以下词元(可搜索字词),然后使用该词元与查询字词 Sian 进行匹配:

字段名称
输出词元
page_updated_by.first_name
Sian

daitchMokotoffSoundex词元筛选器根据 Daitch-Mokotoff Soundex 为发音相同的单词创建词元 语音算法。此筛选器可以为每个输入生成多个编码,其中每个编码的词元是一个6位数字。

注意

不要在以下位置中使用 daitchMokotoffSoundex 词元筛选器:

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 daitchMokotoffSoundex
originalTokens
字符串
没有

此字符串指定在词元过滤器的输出中是否包含或省略原始词元。值可以是以下值之一:

  • include — 在词元筛选器输出中包含原始词元和编码的词元。如果要查询原始词元以及编码形式,我们建议使用该值。

  • omit — 省略原始词元,仅在词元筛选器输出中包含编码的词元。如果要仅查询原始词元的编码形式,请使用该值。

默认值include

以下索引定义使用名为 dmsAnalyzer 的自定义分析器对 minutes 集合中的 page_updated_by.last_name 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 应用 daitchMokotoffSoundex 词元过滤器,对发音相同的单词的标记进行编码。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 dmsAnalyzer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉菜单中选择 daitchMokotoffSoundex,然后为 originalTokens 字段选择下表中显示的值:

    字段
    originalTokens
    include
  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add 可创建自定义分析器。

  10. Field Mappings 部分,单击 Add Field Mapping 可对 page_updated_by.last_name字段应用自定义分析器。

  11. 选择 page_updated_by.last_name(位于 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  12. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 dmsAnalyzer

  13. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"dynamic": false,
"fields": {
"page_updated_by": {
"type": "document",
"dynamic": false,
"fields": {
"last_name": {
"type": "string",
"analyzer": "dmsAnalyzer"
}
}
}
}
},
"analyzers": [
{
"name": "dmsAnalyzer",
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "daitchMokotoffSoundex",
"originalTokens": "include"
}
]
}
]
}

以下查询在分钟集合的 page_updated_by.last_name 字段中搜索听起来类似于 AUERBACH 的词语。

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "AUERBACH",
"path": "page_updated_by.last_name"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.last_name": 1
}
}
])
[
{ "_id" : 1, "page_updated_by" : { "last_name" : "AUERBACH" } }
{ "_id" : 2, "page_updated_by" : { "last_name" : "OHRBACH" } }
]

Atlas Search 返回包含 _id: 1_id: 2 的文档,因为两个文档中的词语在语音上相似,并使用相同的 6 位数字(097400097500)进行编码。下表显示了 Atlas Search 为结果中的文档创建的词元(可搜索词语和 6 位数字编码):

文档 ID
输出词元
"_id": 1
AUERBACH, 097400 , 097500
"_id": 2
OHRBACH, 097400 , 097500

edgeGram 词元筛选器将文本输入左侧(或“边缘”)的输入拆分为 n 个配置大小的词语。

注意

通常,词元筛选器的运行方式与管道类似,每个输入词元生成不超过 1 个输出词元,然后将其输入到后续词元中。相比之下,edgeGram 词元筛选器是一种图表生成筛选器,它从单个输入词元中生成多个输出词元。

由于 同义词 自动完成 字段类型映射定义仅在与不生成图表的词元筛选器一起使用时才有效,因此您无法在 同义词 自动完成 字段类型映射定义中使用 edgeGram 词元 筛选器。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 edgeGram
minGram
整型
指定生成的 n 个词语的最小长度的数字。值必须小于或等于 maxGram
maxGram
整型
指定生成的 n 个词语的最大长度的数字。值必须大于或等于 minGram
termNotInBounds
字符串
没有

字符串,用于指定对短于 minGram 或长于 maxGram 的令牌创建索引。接受的值为:

  • include

  • omit

如果指定了 include,比 minGram 短或比 maxGram长的词元将按原样进行索引。如果指定了 omit,则不会对这些词元进行索引。

默认值omit

以下索引定义使用名为 titleAutocomplete 的自定义分析器对 minutes 集合中的 title 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 将以下筛选器应用于词元:

    • icuFolding 词元筛选器,用于将字符折叠应用于词元。

    • edgeGram 词元筛选器,用于从左侧创建 4 到 7 个字符长的词元。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 titleAutocomplete

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 icuFolding,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉菜单中选择 edgeGram,然后在字段中输入下表中显示的值:

    字段
    minGram
    4
    maxGram
    7
  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 以对标题字段应用自定义分析器。

  13. Field Name 下拉列表中选择 Title(标题),然后从 Data Type 下拉列表中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 titleAutocomplete

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "titleAutocomplete",
"mappings": {
"dynamic": false,
"fields": {
"title": {
"type": "string",
"analyzer": "titleAutocomplete"
}
}
},
"analyzers": [
{
"name": "titleAutocomplete",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "icuFolding"
},
{
"type": "edgeGram",
"minGram": 4,
"maxGram": 7
}
]
}
]
}

以下查询在 minutes 集合的 title 字段中搜索以 mee 开头并后跟任意数量的其他字符的词语。

db.minutes.aggregate([
{
"$search": {
"wildcard": {
"query": "mee*",
"path": "title",
"allowAnalyzedField": true
}
}
},
{
"$project": {
"_id": 1,
"title": 1
}
}
])
[
{ _id: 1, title: 'The team's weekly meeting' },
{ _id: 3, title: 'The regular board meeting' }
]

Atlas Search 返回包含 _id: 1_id: 3 的文档,因为这些文档包含与查询条件匹配的词语 meeting。具体来说,Atlas Search 为结果中的文档创建以下 4 到 7 个字符长的词元(可搜索词语),然后将其与查询词语 mee* 进行匹配:

文档 ID
输出词元
"_id": 1
team, team' , team's , week , weekl , weekly , meet , meeti , meetin , meeting
"_id": 3
regu, regul , regula , regular , boar , board , meet , meeti , meetin , meeting

englishPossessive 词元筛选器从词语中删除所有格(末尾的 's)。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 englishPossessive

以下索引定义使用名为 englishPossessiveStemmer 的自定义分析器对 minutes 集合中的 title 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元(搜索词语)。

  2. 应用englishPossessive 词元筛选器从词元中删除所有格(末尾的's )。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 englishPossessiveStemmer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 englishPossessive

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add 可创建自定义分析器。

  10. Field Mappings 部分中,单击 Add Field Mapping 以对标题字段应用自定义分析器。

  11. Field Name 下拉列表中选择 Title(标题),然后从 Data Type 下拉列表中选择 String(字符串)。

  12. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 englishPossessiveStemmer

  13. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"title": {
"type": "string",
"analyzer": "englishPossessiveStemmer"
}
}
},
"analyzers": [
{
"name": "englishPossessiveStemmer",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "englishPossessive"
}
]
}
]
}

以下查询在 minutes 集合的 title 字段中搜索词语 team

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "team",
"path": "title"
}
}
},
{
"$project": {
"_id": 1,
"title": 1
}
}
])
[
{
_id: 1,
title: 'The team's weekly meeting'
},
{
_id: 2,
title: 'The check-in with sales team'
}
]

Atlas Search 返回在 title 字段中包含 team 术语的结果。Atlas Search 会返回包含 _id: 1 的文档,因为 Atlas Search 在分析过程中将 title 字段中的 team's 转换为令牌 team。具体来说,Atlas Search 会对结果中的文档创建以下令牌(可搜索术语),然后将其与查询术语匹配:

文档 ID
输出词元
"_id": 1
The, team , weekly , meeting
"_id": 2
The, check , in , with , sales , team

flattenGraph 词元过滤器将词元过滤器图表转换为适合编制索引的平面形式。如果使用 wordDelimiterGraph 词元过滤器,请在 wordDelimiterGraph 词元过滤器后面使用该过滤器。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 flattenGraph

以下索引定义使用名为 wordDelimiterGraphFlatten 的自定义分析器为分钟集合中的 message 字段编制索引。自定义分析器指定以下内容:

  1. 应用空格分词器,以根据词语之间出现的空格创建词元。

  2. 将以下过滤器应用于词元:

    • wordDelimiterGraph 词元筛选器,用于根据子词拆分词元,为原始词生成词元,并保护词SIGN_IN免遭分隔。

    • flattenGraph 词元过滤器,用于将词元扁平化为平面形式。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 wordDelimiterGraphFlatten

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 whitespace

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉菜单中选择 wordDelimiterGraph,并为词元筛选器配置以下字段。

    1. 选择以下字段:

      字段
      delimiterOptions.generateWordParts
      true
      delimiterOptions.preserveOriginal
      true
    2. protectedWords.words 字段中输入 SIGN_IN

    3. 选择 protectedWords.ignoreCase

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add token filter 可添加另一个词元筛选器。

  10. 从下拉列表中选择 flattenGraph

  11. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  12. 单击 Add 可创建自定义分析器。

  13. Field Mappings 部分中,单击 Add Field Mapping 以在message(消息)字段上应用自定义分析器。

  14. Field Name 下拉列表中选择 message(消息),并从 Data Type 下拉列表中选择String(字符串)。

  15. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 wordDelimiterGraphFlatten

  16. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"message": {
"type": "string",
"analyzer": "wordDelimiterGraphFlatten"
}
}
},
"analyzers": [
{
"name": "wordDelimiterGraphFlatten",
"charFilters": [],
"tokenizer": {
"type": "whitespace"
},
"tokenFilters": [
{
"type": "wordDelimiterGraph",
"delimiterOptions" : {
"generateWordParts" : true,
"preserveOriginal" : true
},
"protectedWords": {
"words": [
"SIGN_IN"
],
"ignoreCase": false
}
},
{
"type": "flattenGraph"
}
]
}
]
}

以下查询在 minutes 集合的 message 字段中搜索词语 sign

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "sign",
"path": "message"
}
}
},
{
"$project": {
"_id": 1,
"message": 1
}
}
])
[
{
_id: 3,
message: 'try to sign-in'
}
]

Atlas Search 在查询词语sign的结果中返回包含_id: 3的文档,即使该文档在title字段中包含带连字符的词语sign-inwordDelimiterGraph 词元筛选器创建词元筛选器图表,而flattenGraph 词元筛选器将词元筛选器图表转换为适合编制索引的平面形式。 具体来说,Atlas Search 为结果中的文档创建以下词元(可搜索词语),然后将其与查询词语sign进行匹配:

文档 ID
输出词元
_id: 3
try, to , sign-in , sign , in

icuFolding词元筛选器应用 Unicode30 技术报告中的字符折叠 # 例如删除重音、大小写折叠、规范重复项折叠以及报告中详细介绍的许多其他功能。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 icuFolding

以下索引定义使用名为 diacriticFolder 的自定义分析器对 minutes 集合中的 text.sv_FI 字段进行索引。自定义分析器指定以下内容:

  1. 应用关键字分词器,以将字符串字段中的所有词语作为单个词语进行分词。

  2. 使用 icuFolding 词元筛选器应用折叠,例如删除重音、大小写折叠、规范重复项折叠等。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 diacriticFolder

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 keyword

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 icuFolding

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add 可创建自定义分析器。

  10. Field Mappings 部分中,单击 Add Field Mapping 可对 text.sv_FI嵌套字段应用自定义分析器。

  11. 选择 text.sv_FI(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  12. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 diacriticFolder

  13. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "diacriticFolder",
"mappings": {
"fields": {
"text": {
"type": "document",
"fields": {
"sv_FI": {
"analyzer": "diacriticFolder",
"type": "string"
}
}
}
}
},
"analyzers": [
{
"name": "diacriticFolder",
"charFilters": [],
"tokenizer": {
"type": "keyword"
},
"tokenFilters": [
{
"type": "icuFolding"
}
]
}
]
}

以下查询使用 wildcard 操作符在 minutes 集合的 text.sv_FI 字段中搜索所有包含词语 avdelning(前后具有任意数量的其他字符)的词语。

db.minutes.aggregate([
{
"$search": {
"index": "default",
"wildcard": {
"query": "*avdelning*",
"path": "text.sv_FI",
"allowAnalyzedField": true
}
}
},
{
"$project": {
"_id": 1,
"text.sv_FI": 1
}
}
])
[
{
_id: 1,
text: { sv_FI: 'Den här sidan behandlar avdelningsmöten' }
},
{
_id: 2,
text: { sv_FI: 'Först talade chefen för försäljningsavdelningen' }
}
]

Atlas Search 在结果中返回包含 _id: 1_id: 2 的文档,因为这些文档包含查询词 avdelning,在具有 _id: 1 的文档中后跟其他字符,在具有 _id: 2 的文档中前后包含其他字符。具体来说,Atlas Search 为结果中的文档创建以下词元,然后将其与查询词 *avdelning* 进行匹配。

文档 ID
输出词元
_id: 1
den har sidan behandlar avdelningsmoten
_id: 2
forst talade chefen for forsaljningsavdelningen

icuNormalizer词元筛选器使用标准 Unicode 规范化模式对词元进行规范化。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 icuNormalizer
normalizationForm
字符串
没有

要应用的规范化形式。接受的值为:

  • nfd (规范分解)

  • nfc (规范分解,然后是规范组合)

  • nfkd (兼容性分解)

  • nfkc (兼容性分解,然后是规范组合)

要了解有关支持的规范化形式的更多信息,请参阅 第 1.2节:规范化形式,UTR# 。15

默认值nfc

以下索引定义使用名为 textNormalizer 的自定义分析器对 minutes 集合中的 message 字段进行索引。自定义分析器指定以下内容:

  1. 使用空格分词器根据词之间出现的空格创建标记。

  2. 使用 icuNormalizer 词元筛选器,通过兼容性分解和随后的规范组合对词元进行规范化。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 textNormalizer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 whitespace

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉菜单中选择 icuNormalizer,然后从 normalizationForm 下拉菜单中选择 nfkc

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add 可创建自定义分析器。

  10. Field Mappings 部分中,单击 Add Field Mapping 以在message(消息)字段上应用自定义分析器。

  11. Field Name 下拉列表中选择 message(消息),并从 Data Type 下拉列表中选择String(字符串)。

  12. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 textNormalizer

  13. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "textNormalizer",
"mappings": {
"fields": {
"message": {
"type": "string",
"analyzer": "textNormalizer"
}
}
},
"analyzers": [
{
"name": "textNormalizer",
"charFilters": [],
"tokenizer": {
"type": "whitespace"
},
"tokenFilters": [
{
"type": "icuNormalizer",
"normalizationForm": "nfkc"
}
]
}
]
}

以下查询在 minutes 集合的 message 字段中搜索词语 1

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "1",
"path": "message"
}
}
},
{
"$project": {
"_id": 1,
"message": 1
}
}
])
[ { _id: 2, message: 'do not forget to SIGN-IN. See ① for details.' } ]

Atlas Search 在查询词 1 的结果中返回包含 _id: 2 的文档,即使该文档在 message 字段中包含带圆圈的数字 ,因为 icuNormalizer 词元筛选器使用 nfkc 规范化形式为该字符创建 1 词元。下表显示了 Atlas Search 使用 nfkc 规范化形式为结果中的文档创建的词元(可搜索词语),并比较了它为其他规范化形式创建的词元。

规范化形式
输出词元
matches 1
nfd
do, not , forget , to , SIGN-IN. , See , , for , details.
X
nfc
do, not , forget , to , SIGN-IN. , See , , for , details.
X
nfkd
do, not , forget , to , SIGN-IN. , See , 1 , for , details.
nfkc
do, not , forget , to , SIGN-IN. , See , 1 , for , details.

kStemming 词元筛选器将算法词干提取与内置的英语词典结合使用,以提取词语的词干。它要求使用小写文本,而不会修改大写文本。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 kStemming

以下索引定义使用名为 kStemmer 的自定义分析器对 minutes 集合中的 text.en_US 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 将以下筛选器应用于词元:

    • lowercase 词元过滤器,用于将词元转换为小写。

    • kStemming 词元过滤器,它结合使用算法词干提取和内置的英语词典以提取词语的词干。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 kStemmer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉列表中选择 kStemming

  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 可对 text.en_US嵌套字段应用自定义分析器。

  13. 选择 text.en_US(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 kStemmer

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "kStemmer",
"mappings": {
"dynamic": true
},
"analyzers": [
{
"name": "kStemmer",
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "lowercase"
},
{
"type": "kStemming"
}
]
}
]
}

以下查询在 minutes 集合的 text.en_US 字段中搜索词语 Meeting

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "Meeting",
"path": "text.en_US"
}
}
},
{
"$project": {
"_id": 1,
"text.en_US": 1
}
}
])
[
{
_id: 1,
text: {
en_US: '<head> This page deals with department meetings. </head>'
}
}
]

Atlas Search 返回包含_id: 1的文档,其中包含小写的复数词语meetings 。 Atlas Search 将查询词与文档进行匹配,因为lowercase词元筛选器将词元文本规范化为小写,而kStemming 词元筛选器允许 Atlas Search 将文档text.en_US字段中的复数meetings与单数查询词进行匹配。 Atlas Search 还使用索引分析器(如果指定,则使用searchAnalyzer )分析查询词。 具体来说,Atlas Search 为结果中的文档创建以下词元(可搜索词语),然后使用这些词元匹配查询词语:

head, this, page, deal, with, department, meeting, head

length 词元筛选器删除太短或太长的词元。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 length
min
整型
没有

指定词元的最大长度的数字。值必须小于或等于 max

默认值0

max
整型
没有

指定词元的最大长度的数字。值必须大于或等于 min

默认值255

以下索引定义使用名为 longOnly 的自定义分析器对 minutes 集合中的 text.sv_FI 字段进行索引。自定义分析器指定以下内容:

  1. 使用标准分词器,以根据分词规则创建词元。

  2. 将以下筛选器应用于词元:

    • icuFolding 词元过滤器,用于应用字符折叠。

    • length 词元筛选器,它仅对分词后至少为 20 个 UTF-16 代码单元长的词元进行索引。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 longOnly

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 icuFolding,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉菜单中选择 length 并为词元筛选器配置以下字段:

    字段
    min
    20
  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 可对 text.sv.FI 嵌套字段应用自定义分析器。

  13. Field Name 下拉菜单中选择嵌套的 text.sv.FI,并从 Data Type 下拉菜单中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 longOnly

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"text": {
"type": "document",
"dynamic": true,
"fields": {
"sv_FI": {
"type": "string",
"analyzer": "longOnly"
}
}
}
}
},
"analyzers": [
{
"name": "longOnly",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "icuFolding"
},
{
"type": "length",
"min": 20
}
]
}
]
}

以下查询在 minutes 集合的 text.sv_FI 字段中搜索词语 forsaljningsavdelningen

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "forsaljningsavdelningen",
"path": "text.sv_FI"
}
}
},
{
"$project": {
"_id": 1,
"text.sv_FI": 1
}
}
])
[
{
_id: 2,
text: {
sv_FI: 'Först talade chefen för försäljningsavdelningen'
}
}
]

Atlas Search 返回包含 _id: 2 的文档,其中包含词语 försäljningsavdelningen。Atlas Search 将文档与查询词语进行匹配,因为该词语超过 20 个字符。此外,虽然查询词语 forsaljningsavdelningen 不包含变音符号,但 Atlas Search 折叠文档中的原始词语的变音符号以将查询词语与文档进行匹配。具体来说,Atlas Search 为包含 _id: 2 的文档创建以下词元(可搜索词语)。

forsaljningsavdelningen

Atlas Search 不会返回集合的 text.sv_FI 字段中的任何其他词语的搜索结果,因为该字段中的所有其他词语都少于 20 个字符。

lowercase 词元筛选器将词元文本规范化为小写。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 lowercase

以下示例索引定义使用 nGram 分词策略为 minutes 集合中的 title 字段构建 autocomplete 类型的索引。它会对 title 字段应用名为 keywordLowerer 的自定义分析器。自定义分析器指定以下内容:

  1. 应用关键字分词器为字符串或字符串数组创建单个词元。

  2. 应用 lowercase 词元筛选器将词元文本转换为小写。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 keywordLowerer

  4. 如果 Tokenizer 已折叠,请将其展开,然后从下拉菜单中选择 keyword

  5. 展开 Token Filters,然后单击 Add token filter

  6. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  7. Field Mappings 部分中,单击 Add Field Mapping 以对标题字段应用自定义分析器。

  8. Field Name 下拉菜单中选择 title(标题),并从 Data Type 下拉菜单中选择 Autocomplete(自动完成)。

  9. 在数据类型的属性部分中,从属性的下拉菜单中选择以下值:

    属性名称
    Analyzer

    keywordLowerer

    Tokenization

    nGram

  10. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下内容:

{
"mappings": {
"fields": {
"title": {
"analyzer": "keywordLowerer",
"tokenization": "nGram",
"type": "autocomplete"
}
}
},
"analyzers": [
{
"name": "keywordLowerer",
"charFilters": [],
"tokenizer": {
"type": "keyword"
},
"tokenFilters": [
{
"type": "lowercase"
}
]
}
]
}

以下查询使用 autocomplete 操作符在 title 字段中搜索字符 standup

db.minutes.aggregate([
{
"$search": {
"index": "default",
"autocomplete": {
"query": "standup",
"path": "title"
}
}
},
{
"$project": {
"_id": 1,
"title": 1
}
}
])
[ { _id: 4, title: 'The daily huddle on tHe StandUpApp2' } ]

Atlas Search 返回结果中包含 _id: 4 的文档,因为该文档包含查询词 standup。Atlas Search 使用 keyword 分词器、lowercase 词元筛选器和 autocomplete 类型的 nGram 分词策略为 title 字段创建词元。具体来说,Atlas Search 使用 keyword 分词器将整个字符串分为单个词元,该词元仅支持整个字符串的精确匹配,然后使用 lowercase 词元筛选器将词元转换为小写。对于结果中的文档,Atlas Search 使用自定义分析器创建以下词元:

文档 ID
输出词元
_id: 4
the daily huddle on the standupapp2

应用自定义分析器后,Atlas Search 会创建更多采用 n 元语法的词元,因为 Atlas Search 会对 title 字段构建索引定义中指定的 autocomplete 类型的索引。Atlas Search 使用采用 n 元语法的词元(其中包括 standup 的词元)来将文档与查询词 standup 进行匹配。

以下索引定义使用名为 lowerCaser 的自定义分析器对 minutes 集合中的 message 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,根据分词规则创建词元。

  2. 将以下筛选器应用于词元:

    • icuNormalizer使用标准 Unicode 规范化模式对词元进行规范化。

    • lowercase 词元筛选器,用于将词元文本转换为小写。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 lowerCaser

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉菜单中选择 icuNormalizer,然后从 normalizationForm 下拉菜单中选择 nfkd

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add token filter 可添加另一个词元筛选器。

  10. 从下拉列表中选择 lowercase

  11. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  12. 单击 Add 可创建自定义分析器。

  13. Field Mappings 部分中,单击 Add Field Mapping 以在message(消息)字段上应用自定义分析器。

  14. Field Name 下拉列表中选择 message(消息),并从 Data Type 下拉列表中选择String(字符串)。

  15. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 lowerCaser

  16. 单击 Add,然后单击 Save Changes

{
"mappings": {
"fields": {
"message": {
"type": "string",
"analyzer": "lowerCaser"
}
}
},
"analyzers": [
{
"name": "lowerCaser",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "icuNormalizer",
"normalizationForm": "nfkd"
},
{
"type": "lowercase"
}
]
}
]
}

以下查询在message字段中搜索sign-in一词。

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "sign-in",
"path": "message"
}
}
},
{
"$project": {
"_id": 1,
"message": 1
}
}
])
[
{ _id: 1, message: 'try to siGn-In' },
{ _id: 3, message: 'try to sign-in' },
{ _id: 2, message: 'do not forget to SIGN-IN. See ① for details.' }
]

Atlas Search 在查询词sign-in的结果中返回包含_id: 1_id: 3_id: 2的文档,因为icuNormalizer分词器首先通过分割文本(包括带连字符的单词)来创建单独的词元,但保留文档中的原始字母大小写,然后lowercase词元筛选器将这些词元转换为小写。 Atlas Search 还使用索引分析器(如果指定,则使用searchAnalyzer )分析查询词语,拆分查询词语并将其与文档匹配。

规范化形式
输出词元
_id: 1
try, to , sign , in
_id: 3
try, to , sign , in
_id: 2
do, not , forget , to , sign , in , see , for , details

nGram词元筛选器将输入拆分为 n 个已配置大小的词语。您不能在 同义词 自动完成 映射定义中使用 nGram 词元 筛选器。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 nGram
minGram
整型
指定生成的 n 个词语的最小长度的数字。值必须小于或等于 maxGram
maxGram
整型
指定生成的 n 个词语的最大长度的数字。值必须大于或等于 minGram
termNotInBounds
字符串
没有

字符串,用于指定对短于 minGram 或长于 maxGram 的令牌创建索引。接受的值为:

  • include

  • omit

如果指定了 include,比 minGram 短或比 maxGram长的词元将按原样进行索引。如果指定了 omit,则不会对这些词元进行索引。

默认值omit

以下索引定义使用名为 titleAutocomplete 的自定义分析器为分钟集合中的 title 字段编制索引。自定义分析器函数指定以下内容:

  1. 应用标准分词器以根据分词规则创建词元。

  2. 将一系列词元筛选器应用于词元:

    • englishPossessive 从词语中删除所有格(末尾的 's)。

    • nGram 将词语拆分为 4 到 7 个字符长的词语。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 titleAutocomplete

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 englishPossessive,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉菜单中选择 nGram 并为词元筛选器配置以下字段:

    字段
    minGram
    4
    maxGram
    7
  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 以对标题字段应用自定义分析器。

  13. Field Name 下拉列表中选择 Title(标题),然后从 Data Type 下拉列表中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 titleAutocomplete

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"title": {
"type": "string",
"analyzer": "titleAutocomplete"
}
}
},
"analyzers": [
{
"name": "titleAutocomplete",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "englishPossessive"
},
{
"type": "nGram",
"minGram": 4,
"maxGram": 7
}
]
}
]
}

以下查询使用 wildcard 操作符在 minutes 集合的 title 字段中搜索词语 meet,该词语后面具有任意数量的其他字符。

db.minutes.aggregate([
{
"$search": {
"index": "default",
"wildcard": {
"query": "meet*",
"path": "title",
"allowAnalyzedField": true
}
}
},
{
"$project": {
"_id": 1,
"title": 1
}
}
])
[
{ _id: 1, title: 'The team's weekly meeting' },
{ _id: 3, title: 'The regular board meeting' }
]

Atlas Search 返回包含 _id: 1_id: 3 的文档,因为这些文档包含词语 meeting,Atlas Search 创建以下词元(可搜索词语)以将其与查询条件 meet* 进行匹配。

规范化形式
输出词元
_id: 2
team, week , weekl , weekly , eekl , eekly , ekly , meet , meeti , meetin , meeting , eeti , eeti , eetingetinetingting
_id: 3
regu, regul , regula , regular , egul , egula , egular , gula , gular , ular , boar , board , oard , meetmeetimeetinmeetingeetieetieetingetinetingting

注意

Atlas Search 不会为少于 4 个字符的词语(例如 the )和多于 7 个字符的词语创建词元,因为 termNotInBounds 参数默认设置为 omit。如果您将 termNotInBounds 参数值设置为 include,Atlas Search 也会为词语 the 创建词元。

porterStemming 词元筛选器使用 porter 词干提取算法,从英语词语中删除常见的形态后缀和屈折后缀。它要求使用小写文本,对于大写文本无效。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 porterStemming

以下索引定义使用名为 porterStemmer 的自定义分析器对 minutes 集合中的 title 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 将以下词元筛选器应用于词元:

    • lowercase 词元过滤器,用于将词语转换为小写。

    • porterStemming 词元过滤器,用于从词语中删除常见的形态后缀和屈折后缀。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 porterStemmer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉列表中选择 porterStemming

  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 以对标题字段应用自定义分析器。

  13. Field Name 下拉列表中选择 Title(标题),然后从 Data Type 下拉列表中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 porterStemmer

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"title": {
"type": "string",
"analyzer": "porterStemmer"
}
}
},
"analyzers": [
{
"name": "porterStemmer",
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "lowercase"
},
{
"type": "porterStemming"
}
]
}
]
}

以下查询在 minutes 集合的 title 字段中搜索词语 Meet

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "Meet",
"path": "title"
}
}
},
{
"$project": {
"_id": 1,
"title": 1
}
}
])
[
{
_id: 1,
title: 'The team's weekly meeting'
},
{
_id: 3,
title: 'The regular board meeting'
}
]

Atlas Search 返回包含_id: 1_id: 3的文档,因为小写词元筛选器将词元文本规范为小写,然后porterStemming词元筛选器从meeting词元中提取形态后缀以创建meet词元,该词元Atlas Search 与查询词Meet匹配。 具体来说,Atlas Search 为结果中的文档创建以下词元(可搜索词语),然后将其与查询词语Meet进行匹配:

规范化形式
输出词元
_id: 1
the, team' , weekli , meet
_id: 3
the, regular , board , meet

regex 词元筛选器将正则表达式应用于每个词元,以将匹配项替换为指定的字符串。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器的人类可读标签。值必须是 regex
pattern
字符串
应用于每个词元的正则表达式模式。
replacement
字符串

替换字符串,用于在出现匹配模式时进行替换。

注意

如果您指定空string ("") 以忽略或删除词元, Atlas Search将创建一个包含空string的词元。 要删除包含空字符串的词元,请在regex词元筛选器后面使用停用词词元筛选器。 例如:

"analyzers": [
{
"name": "custom.analyzer.name",
"charFilters": [],
"tokenizer": {
"type": "whitespace"
},
"tokenFilters": [
{
"matches": "all",
"pattern": "^(?!\\$)\\w+",
"replacement": "",
"type": "regex"
},
{
"type": "stopword",
"tokens": [""]
}
]
}
]
matches
字符串

可接受的值为:

  • all

  • first

如果 matches 设置为 all,则替换所有匹配的模式。否则,仅替换第一个匹配的模式。

以下索引定义使用名为 emailRedact 的自定义分析器对 minutes 集合中的 page_updated_by.email 字段进行索引。自定义分析器指定以下内容:

  1. 应用关键字分词器,以将字段值中的所有词语作为单个词语进行索引。

  2. 将以下词元筛选器应用于词元:

    • lowercase 词元过滤器,用于将词元中的大写字符转换为小写。

    • regex 词元筛选器,用于查找词元中看起来像电子邮件地址的字符串,并将其替换为词语 redacted

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 emailRedact

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 keyword

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉菜单中选择 regex 并为词元筛选器配置以下内容:

    1. pattern 字段中输入 ^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,5})$

    2. replacement 字段中输入 redacted

    3. matches 下拉列表中选择 all

  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 可对 page_updated_by.email 嵌套字段应用自定义分析器。

  13. Field Name 下拉菜单中选择嵌套的 page_updated_by.email,并从 Data Type 下拉菜单中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 emailRedact

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "lucene.standard",
"mappings": {
"dynamic": false,
"fields": {
"page_updated_by": {
"type": "document",
"fields": {
"email": {
"type": "string",
"analyzer": "emailRedact"
}
}
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "emailRedact",
"tokenizer": {
"type": "keyword"
},
"tokenFilters": [
{
"type": "lowercase"
},
{
"matches": "all",
"pattern": "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,5})$",
"replacement": "redacted",
"type": "regex"
}
]
}
]
}

以下查询使用 wildcard 操作符在 minutes 集合的 page_updated_by.email 字段中搜索前面带有任意数量的其他字符的词语 example.com

1db.minutes.aggregate([
2 {
3 "$search": {
4 "index": "default",
5 "wildcard": {
6 "query": "*example.com",
7 "path": "page_updated_by.email",
8 "allowAnalyzedField": true
9 }
10 }
11 },
12 {
13 "$project": {
14 "_id": 1,
15 "page_updated_by.email": 1
16 }
17 }
18])

尽管 page_updated_by.email 字段在电子邮件地址中包含字词 example.com,但 Atlas Search 不会返回任何查询结果。Atlas Search 将与自定义分析器中提供的正则表达式匹配的字符串标记为词 redacted,因此 Atlas Search 不会将查询词与任何文档相匹配。

reverse 词元筛选器颠倒每个字符串词元的顺序。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器的人类可读标签。值必须是 reverse

以下索引定义使用名为 keywordReverse 的自定义分析器对 minutes 集合中的 page_updated_by.email 字段进行索引。该自定义分析器指定以下内容:

  • 应用关键字分词器,以将整个字符串作为单个词语进行分词。

  • 应用 reverse 词元筛选器以颠倒字符串词元的顺序。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 keywordReverse

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 keyword

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 reverse

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add 可创建自定义分析器。

  10. Field Mappings 部分中,单击 Add Field Mapping 可对 page_updated_by.email 嵌套字段应用自定义分析器。

  11. Field Name 下拉菜单中选择嵌套的 page_updated_by.email,并从 Data Type 下拉菜单中选择 String(字符串)。

  12. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 keywordReverse

  13. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "lucene.keyword",
"mappings": {
"dynamic":
},
"analyzers": [
{
"name": "keywordReverse",
"charFilters": [],
"tokenizer": {
"type": "keyword"
},
"tokenFilters": [
{
"type": "reverse"
}
]
}
]
}

以下查询使用 wildcard 操作符搜索 minutes 集合中的 page_updated_by.email 字段,以按倒序匹配字符 @example.com 前面的任何字符。reverse 词元筛选器可以加快前导通配符查询的速度。

db.minutes.aggregate([
{
"$search": {
"index": "default",
"wildcard": {
"query": "*@example.com",
"path": "page_updated_by.email",
"allowAnalyzedField": true
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.email": 1,
}
}
])

对于前面的查询,Atlas Search 将自定义分析器应用于通配符查询以将查询转换如下:

moc.elpmaxe@*

然后,Atlas Search 针对索引的词元运行查询,这些词元也是倒序的。该查询返回以下文档:

[
{ _id: 1, page_updated_by: { email: 'auerbach@example.com' } },
{ _id: 2, page_updated_by: { email: 'ohrback@example.com' } },
{ _id: 3, page_updated_by: { email: 'lewinsky@example.com' } },
{ _id: 4, page_updated_by: { email: 'levinski@example.com' } }
]

具体来说,Atlas Search 为结果中的文档创建以下词元(可搜索词语),然后将其与查询词语 moc.elpmaxe@* 进行匹配:

规范化形式
输出词元
_id: 1
moc.elpmaxe@hcabreua
_id: 2
moc.elpmaxe@kcabrho
_id: 3
moc.elpmaxe@yksniwel
_id: 4
moc.elpmaxe@iksnivel

shingle 词元筛选器通过一系列词元构建 shingle(拆分为 n 个词语)。您无法在 synonymautocomplete 映射定义中使用 shingle 词元筛选器。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 shingle
minShingleSize
整型
每个 shingle 的最小词元数。必须小于或等于 maxShingleSize
maxShingleSize
整型
每个 shingle 的最大词元数。必须大于或等于 minShingleSize

minutes 集合中的 page_updated_by.email 字段的以下索引定义示例使用两个自定义分析器(emailAutocompleteIndexemailAutocompleteSearch)以实施类似于自动完成的功能。在索引创建期间,Atlas Search 使用 emailAutocompleteIndex 分析器执行以下操作:

  • 将字段中的 @ 字符替换为 AT

  • 使用空格分词器创建词元

  • Shingle 词元

  • 创建这些shingle 词元的 edgeGram

在搜索期间,Atlas Search 使用 emailAutocompleteSearch 分析器执行以下操作:

  • 将字段中的 @ 字符替换为 AT

  • 使用空格分词器创建词元

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 emailAutocompleteIndex

  4. 展开 Character Filters,然后单击 Add character filter

  5. 从下拉菜单中选择 mapping,然后点击 Add mapping

  6. 输入以下键和值:

    @
    AT
  7. 单击 Add character filter 可将字符筛选器添加到自定义分析器中。

  8. 如果 Tokenizer 已折叠,请将其展开。

  9. 从下拉菜单中选择 whitespace,并在 maxTokenLength 字段中输入 15

  10. 展开 Token Filters,然后单击 Add token filter

  11. 从下拉菜单中选择 shingle,然后配置以下字段。

    字段
    字段值
    minShingleSize
    2
    minShingleSize
    3
  12. 单击 Add token filter 可添加另一个词元筛选器。

  13. 单击 Add token filter 可添加另一个词元筛选器。

  14. 从下拉菜单中选择 edgeGram 并为词元筛选器配置以下字段:

    字段
    字段值
    minGram
    2
    maxGram
    15
  15. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  16. 单击 Add,将自定义分析器添加到索引。

  17. Custom Analyzers 部分中,单击 Add Custom Analyzer

  18. 选择 Create Your Own 单选按钮并单击 Next

  19. Analyzer Name 字段中输入 emailAutocompleteSearch

  20. 展开 Character Filters,然后单击 Add character filter

  21. 从下拉菜单中选择 mapping,然后点击 Add mapping

  22. 输入以下键和值:

    @
    AT
  23. 单击 Add character filter 可将字符筛选器添加到自定义分析器中。

  24. 如果 Tokenizer 已折叠,请将其展开。

  25. 从下拉菜单中选择 whitespace,并在 maxTokenLength 字段中输入 15

  26. 单击 Add,将自定义分析器添加到索引。

  27. Field Mappings 部分中,单击 Add Field Mapping 可对 page_updated_by.email 嵌套字段应用自定义分析器。

  28. Field Name 下拉菜单中选择嵌套的 page_updated_by.email,并从 Data Type 下拉菜单中选择 String(字符串)。

  29. 在数据类型的属性部分中,从 Index Analyzer 下拉菜单中选择 emailAutocompleteIndex,并从 Search Analyzer 下拉菜单中选择 emailAutocompleteSearch

  30. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

1{
2 "analyzer": "lucene.keyword",
3 "mappings": {
4 "dynamic": true,
5 "fields": {
6 "page_updated_by": {
7 "type": "document",
8 "fields": {
9 "email": {
10 "type": "string",
11 "analyzer": "emailAutocompleteIndex",
12 "searchAnalyzer": "emailAutocompleteSearch"
13 }
14 }
15 }
16 }
17 },
18 "analyzers": [
19 {
20 "name": "emailAutocompleteIndex",
21 "charFilters": [
22 {
23 "mappings": {
24 "@": "AT"
25 },
26 "type": "mapping"
27 }
28 ],
29 "tokenizer": {
30 "maxTokenLength": 15,
31 "type": "whitespace"
32 },
33 "tokenFilters": [
34 {
35 "maxShingleSize": 3,
36 **** "minShingleSize": 2,
37 "type": "shingle"
38 },
39 {
40 "maxGram": 15,
41 "minGram": 2,
42 "type": "edgeGram"
43 }
44 ]
45 },
46 {
47 "name": "emailAutocompleteSearch",
48 "charFilters": [
49 {
50 "mappings": {
51 "@": "AT"
52 },
53 "type": "mapping"
54 }
55 ],
56 "tokenizer": {
57 "maxTokenLength": 15,
58 "type": "whitespace"
59 }
60 }
61 ]
62}

以下查询在 minutes 集合的 page_updated_by.email 字段中搜索电子邮件地址:

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "auerbach@ex",
"path": "page_updated_by.email"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.email": 1
}
}
])
[ { _id: 1, page_updated_by: { email: 'auerbach@example.com' } } ]

Atlas Search 使用 emailAutocompleteSearch 分析器创建搜索词元,然后将其与使用 emailAutocompleteIndex 分析器创建的索引词元进行匹配。下表显示了 Atlas Search 创建的搜索词元和索引词元(最多 15 个字符):

搜索词元
索引令牌
auerbachATexamp
au, aue , auer , auerb , auerba , auerbac , auerbach , auerbachA , auerbachAT , auerbachATe , auerbachATex , auerbachATexa , auerbachATexam , auerbachATexamp

snowballStemming词元使用 Snowball 生成的词干分析器筛选 Stems 词元。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 snowballStemming
stemmerName
字符串

以下值是有效的:

  • arabic

  • armenian

  • basque

  • catalan

  • danish

  • dutch

  • english

  • estonian

  • finnish

  • french

  • german

  • german2 (替代德语词干分析器。在大多数情况下,通过将 ü 扩展为 ue 来处理变音符号。)

  • hungarian

  • irish

  • italian

  • kp (Kraaij-Pohlmann 词干分析器,这是荷兰语的替代词干分析器。)

  • lithuanian

  • lovins (首次发布的“Lovins JB”词干提取算法。)

  • norwegian

  • porter (原始的 Porter 英语词干提取算法。)

  • portuguese

  • romanian

  • russian

  • spanish

  • swedish

  • turkish

以下索引定义使用名为 frenchStemmer 的自定义分析器对 minutes 集合中的 text.fr_CA 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 将以下词元筛选器应用于词元:

    • lowercase 词元过滤器,用于将词元转换为小写。

    • french 用于提取词语的词干的 snowballStemming 词元筛选器变体。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 frenchStemmer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉菜单中选择 snowballStemming,然后从 stemmerName 下拉菜单中选择 french

  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 可对 text.fr_CA嵌套字段应用自定义分析器。

  13. 选择 text.fr_CA(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 frenchStemmer

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"text": {
"type": "document",
"fields": {
"fr_CA": {
"type": "string",
"analyzer": "frenchStemmer"
}
}
}
}
},
"analyzers": [
{
"name": "frenchStemmer",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "lowercase"
},
{
"type": "snowballStemming",
"stemmerName": "french"
}
]
}
]
}

以下查询在 minutes 集合的 text.fr_CA 字段中搜索词语 réunion

db.minutes.aggregate([
{
"$search": {
"text": {
"query": "réunion",
"path": "text.fr_CA"
}
}
},
{
"$project": {
"_id": 1,
"text.fr_CA": 1
}
}
])
[
{
_id: 1,
text: { fr_CA: 'Cette page traite des réunions de département' }
}
]

Atlas Search 在结果中返回包含 _id: 1 的文档。Atlas Search 将查询词语与文档进行匹配,因为它为文档创建以下词元,然后使用这些词元与查询词语 réunion 进行匹配:

文档 ID
输出词元
_id: 1
cet, pag , trait , de , réunion , de , départ

spanishPluralStemming 词元筛选器提取西班牙语复数词语的词干。它要求使用小写文本。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 spanishPluralStemming

以下索引定义使用名为 spanishPluralStemmer 的自定义分析器对 minutes 集合中的 text.es_MX 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 将以下词元筛选器应用于词元:

    • lowercase 词元过滤器,用于将西班牙语词语转换为小写。

    • spanishPluralStemming 词元筛选器,用于为词元中的复数西班牙语词语提取单数形式的词干。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 spanishPluralStemmer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉列表中选择 spanishPluralStemming

  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 可对 text.es_MX嵌套字段应用自定义分析器。

  13. 选择 text.es_MX(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 spanishPluralStemmer

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "spanishPluralStemmer",
"mappings": {
"fields": {
"text: {
"type": "document",
"fields": {
"es_MX": {
"analyzer": "spanishPluralStemmer",
"searchAnalyzer": "spanishPluralStemmer",
"type": "string"
}
}
}
}
},
"analyzers": [
{
"name": "spanishPluralStemmer",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "lowercase"
},
{
"type": "spanishPluralStemming"
}
]
}
]
}

以下查询在 minutes 集合的 text.es_MX 字段中搜索西班牙语词语 punto

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "punto",
"path": "text.es_MX"
}
}
},
{
"$project": {
"_id": 1,
"text.es_MX": 1
}
}
])
[
{
_id: 4,
text : {
es_MX: 'La página ha sido actualizada con los puntos de la agenda.',
}
}
]

Atlas Search 返回包含 _id: 4 的文档,因为文档中的 text.es_MX 字段包含复数词语 puntos。Atlas Search 将该文档与查询词语 punto 进行匹配,因为 Atlas Search 从词语中去除复数 (s),以将 puntos 作为 punto 进行分析。具体来说,Atlas Search 为结果中的文档创建以下词元(可搜索词语),然后使用这些词元匹配查询词语:

文档 ID
输出词元
_id: 4
la, pagina , ha , sido , actualizada , con , los , punto , de , la , agenda

stempel 词元过滤器使用 Lucene 的 默认波兰语词干分析器表提取波兰语词语的词干。它要求使用小写文本。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 stempel

以下索引定义使用名为 stempelStemmer 的自定义分析器对 minutes 集合中的 text.pl_PL 字段进行索引。自定义分析器指定以下内容:

  1. 应用标准分词器,以根据分词规则创建词元。

  2. 将以下筛选器应用于词元:

    • lowercase 词元过滤器,用于将词语转换为小写。

    • stempel 词元过滤器用于删除波兰语字词。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 stempelStemmer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 standard

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉列表中选择 stempel

  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 可对 text.pl_PL嵌套字段应用自定义分析器。

  13. 选择 text.pl_PL(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 stempelStemmer

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"analyzer": "stempelStemmer",
"mappings": {
"dynamic": true,
"fields": {
"text.pl_PL": {
"analyzer": "stempelStemmer",
"searchAnalyzer": "stempelStemmer",
"type": "string"
}
}
},
"analyzers": [
{
"name": "stempelStemmer",
"charFilters": [],
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "lowercase"
},
{
"type": "stempel"
}
]
}
]
}

以下查询在 minutes 集合的 text.pl_PL 字段中搜索波兰语词语 punkt

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "punkt",
"path": "text.pl_PL"
}
}
},
{
"$project": {
"_id": 1,
"text.pl_PL": 1
}
}
])
[
{
_id: 4,
text: {
pl_PL: 'Strona została zaktualizowana o punkty porządku obrad.'
}
}
]

Atlas Search 返回包含 _id: 4 的文档,因为文档中的 text.pl_PL 字段包含复数词语 punkty。Atlas Search 将该文档与查询词语 punkt 进行匹配,因为 Atlas Search 从词语中去除复数 (y),以将 punkty 作为 punkt 进行分析。具体来说,Atlas Search 会为结果中的文档创建以下标记(可搜索词语),然后将其与查询词语进行匹配:

文档 ID
输出词元
_id: 4
strona, zostać , zaktualizować , o , punkt , porządek , obrada

stopword 词元筛选器删除与指定停用词对应的词元。该词元筛选器不分析指定的停用词。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 stopword
tokens
字符串数组
该列表包含与要删除的词元对应的停用词。值必须是一个或多个停用词。
ignoreCase
布尔
没有

该标记指示在筛选要删除的词元时是否忽略停用词大小写。值可以是以下值之一:

  • true — 忽略大小写并删除所有与指定停用词匹配的词元

  • false — 区分大小写,只删除与指定大小写完全匹配的令牌

默认值true

以下索引定义使用名为 stopwordRemover 的自定义分析器对 minutes 集合中的 title 字段进行索引。自定义分析器指定以下内容:

  1. 应用空格分词器,以根据词语之间出现的空格创建词元。

  2. 应用 stopword 词元过滤器删除与定义的停用词 istheat 匹配的标记。词元过滤器不区分大小写,并将删除与指定停用词匹配的所有词元。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 stopwordRemover

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 whitespace

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉菜单中选择 stopword,然后在 tokens 字段中输入以下内容:

    is, the , at

  8. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  9. 单击 Add 可创建自定义分析器。

  10. Field Mappings 部分中,单击 Add Field Mapping 可对 text.en_US嵌套字段应用自定义分析器。

  11. 选择 text.en_US(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  12. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 stopwordRemover

  13. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"text": {
"type" : "document",
"fields": {
"en_US": {
"type": "string",
"analyzer": "stopwordRemover"
}
}
}
}
},
"analyzers": [
{
"name": "stopwordRemover",
"charFilters": [],
"tokenizer": {
"type": "whitespace"
},
"tokenFilters": [
{
"type": "stopword",
"tokens": ["is", "the", "at"]
}
]
}
]
}

以下查询在分钟集合的 text.en_US 字段中搜索短语 head of the sales

1db.minutes.aggregate([
2 {
3 "$search": {
4 "phrase": {
5 "query": "head of the sales",
6 "path": "text.en_US"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "text.en_US": 1
14 }
15 }
16])
1[
2 {
3 _id: 2,
4 text: { en_US: 'The head of the sales department spoke first.' }
5 }
6]

Atlas Search 返回包含 _id: 2 的文档,因为 en_US 字段包含查询词语。在分析期间,Atlas Search 不会为文档中的停用词 the 创建词元,但仍然能够将其与查询词语进行匹配,因为对于 string 字段,它还使用索引分析器或 searchAnalyzer(如果指定)分析查询词语,并从查询词语中删除停用词,从而允许 Atlas Search 将查询词语与文档进行匹配。具体来说,Atlas Search 为结果中的文档创建以下词元:

文档 ID
输出词元
_id: 2
head, of , sales , department , spoke , first.

trim 词元过滤器会删除词元中的前导和尾随空格。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 trim

以下索引定义使用名为 tokenTrimmer 的自定义分析器对 minutes 集合中的 text.en_US 进行索引。该自定义分析器指定以下内容:

  • 应用 htmlStrip 字符过滤器从文本中删除除 a 标签之外的所有 HTML 标记。

  • 应用关键字分词器,为整个字符串创建单个词元。

  • 应用 trim 词元筛选器,以删除词元中的前导和尾随空格。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 tokenTrimmer

  4. 展开 Character Filters,然后单击 Add character filter

  5. 从下拉菜单中选择 htmlStrip,然后在 ignoredTags 字段中输入 a

  6. 单击 Add character filter 可将字符筛选器添加到自定义分析器中。

  7. 如果 Tokenizer 已折叠,请将其展开。

  8. 从下拉列表中选择 keyword

  9. 展开 Token Filters,然后单击 Add token filter

  10. 从下拉列表中选择 trim

  11. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  12. 单击 Add,将自定义分析器添加到索引。

  13. Field Mappings 部分中,单击 Add Field Mapping 可对 text.en_US嵌套字段应用自定义分析器。

  14. 选择 text.en_US(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。

  15. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 tokenTrimmer

  16. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"text": {
"type": "document",
"fields": {
"en_US": {
"type": "string",
"analyzer": "tokenTrimmer"
}
}
}
}
},
"analyzers": [
{
"name": "tokenTrimmer",
"charFilters": [{
"type": "htmlStrip",
"ignoredTags": ["a"]
}],
"tokenizer": {
"type": "keyword"
},
"tokenFilters": [
{
"type": "trim"
}
]
}
]
}

以下查询在 minutes 集合的 text.en_US 字段中搜索前后具有任意数量的其他字符的短语 *department meetings*

1db.minutes.aggregate([
2 {
3 "$search": {
4 "wildcard": {
5 "query": "*department meetings*",
6 "path": "text.en_US",
7 "allowAnalyzedField": true
8 }
9 }
10 },
11 {
12 "$project": {
13 "_id": 1,
14 "text.en_US": 1
15 }
16 }
17])
1[
2 {
3 _id: 1,
4 text: { en_US: '<head> This page deals with department meetings. </head>' }
5 }
6]

Atlas Search 返回包含 _id: 1 的文档,因为 en_US 字段包含查询词语 department meetings。Atlas Search 为结果中的文档创建以下词元,这表明 Atlas Search 删除了 HTML 标记,为整个字符串创建了单个词元,并删除了词元中的前导和尾随空格:

文档 ID
输出词元
_id: 1
This page deals with department meetings.

wordDelimiterGraph 词元筛选器根据配置的规则将词元拆分为子词元。我们建议您不要将该词元筛选器与标准分词器一起使用,因为该分词器删除该词元筛选器用于确定边界的很多词语内分隔符。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识该词元筛选器类型的人类可读标签。值必须是 wordDelimiterGraph
delimiterOptions
对象
没有

该对象包含确定如何将词语拆分为子词语的规则。

默认值{}

delimiterOptions
.generateWordParts
布尔
没有

该标记指示是否根据子词语拆分词元。例如,如果为 true,该选项将 PowerShot 拆分为 PowerShot

默认值true

delimiterOptions
.generateNumberParts
布尔
没有

该标记指示是否根据子编号拆分词元。例如,如果为 true,该选项将 100-2 拆分为 1002

默认值true

delimiterOptions
.concatenateWords
布尔
没有

该标记指示是否连接子词语串。例如,如果为 true,该选项将 wi-fi 连接到 wifi

默认值false

delimiterOptions
.concatenateNumbers
布尔
没有

该标记指示是否连接子数字串。例如,如果为 true,该选项将 100-2 连接到 1002

默认值false

delimiterOptions
.concatenateAll
布尔
没有

该标记指示是否连接所有内容。例如,如果为 true,该选项将 wi-fi-100-2 连接到 wifi1002

默认值false

delimiterOptions
.preserveOriginal
布尔
没有

该标记指示是否生成原始词语的词元。

默认值true

delimiterOptions
.splitOnCaseChange
布尔
没有

该标记指示是否根据字母大小写转换拆分词元。例如,如果为 true,该选项将 camelCase 拆分为 camelCase

默认值true

delimiterOptions
.splitOnNumerics
布尔
没有

该标记指示是否根据字母-数字转换拆分词元。例如,如果为 true,该选项将 g2g 拆分为 g2g

默认值true

delimiterOptions
.stemEnglishPossessive
布尔
没有

该标记指示是否从每个子词语中删除尾随所有格。例如,如果为 true,该选项将 who's 更改为 who

默认值true

delimiterOptions
.ignoreKeywords
布尔
没有

指示是否跳过将 keyword 属性设置为 true 词元的标志。

默认值false

protectedWords
对象
没有

该对象包含保护字选项。

默认值{}

protectedWords
.words
阵列
视条件而定
该列表包含要禁止分隔的词元。如果您指定 protectedWords,则必须指定该选项。
protectedWords
.ignoreCase
布尔
没有

该标记指示是否忽略保护字区分大小写。

默认值true

如果为 true,则在该选项后面应用 flattenGraph 词元过滤器,以使词元流适合进行索引。

以下索引定义使用名为 wordDelimiterGraphAnalyzer 的自定义分析器对 minutes 集合中的 title 字段进行索引。自定义分析器指定以下内容:

  1. 应用空格分词器,以根据词语之间出现的空格创建词元。

  2. 为以下内容应用 wordDelimiterGraph 词元过滤器:

    • 不要尝试拆分 istheat。排除区分大小写。例如,不会排除 IstHe

    • 在大小写发生变化时拆分词元,并删除仅包含英语字母表中的字母的词元。

  1. Custom Analyzers 部分中,单击 Add Custom Analyzer

  2. 选择 Create Your Own 单选按钮并单击 Next

  3. Analyzer Name 字段中输入 wordDelimiterGraphAnalyzer

  4. 如果 Tokenizer 已折叠,请将其展开。

  5. 从下拉列表中选择 whitespace

  6. 展开 Token Filters,然后单击 Add token filter

  7. 从下拉列表中选择 lowercase,然后单击 Add token filter 以将词元过滤器添加到您的自定义分析器中。

  8. 单击 Add token filter 可添加另一个词元筛选器。

  9. 从下拉菜单中选择 wordDelimiterGraph,然后配置以下字段:

    1. 取消选择 delimiterOptions.generateWordParts 然后选择 delimiterOptions.splitOnCaseChange

    2. protectedWords.words 字段中键入并从下拉菜单中选择单词 istheat,一次一个。

    3. 取消选择 protectedWords.ignoreCase

  10. 单击 Add token filter 可将词元筛选器添加到自定义分析器中。

  11. 单击 Add 可创建自定义分析器。

  12. Field Mappings 部分中,单击 Add Field Mapping 可对 title(标题)嵌套字段应用自定义分析器。

  13. Field Name 下拉菜单中选择嵌套的 title(标题),并从 Data Type 下拉菜单中选择 String(字符串)。

  14. 在数据类型的属性部分中,从 Index AnalyzerSearch Analyzer 下拉菜单中选择 wordDelimiterGraphAnalyzer

  15. 单击 Add,然后单击 Save Changes

将默认索引定义替换为以下示例:

{
"mappings": {
"fields": {
"title": {
"type": "string",
"analyzer": "wordDelimiterGraphAnalyzer"
}
}
},
"analyzers": [
{
"name": "wordDelimiterGraphAnalyzer",
"charFilters": [],
"tokenizer": {
"type": "whitespace"
},
"tokenFilters": [
{
"type": "wordDelimiterGraph",
"protectedWords": {
"words": ["is", "the", "at"],
"ignoreCase": false
},
"delimiterOptions" : {
"generateWordParts" : false,
"splitOnCaseChange" : true
}
}
]
}
]
}

以下查询在 minutes 集合的 title 字段中搜索词语 App2

db.minutes.aggregate([
{
"$search": {
"index": "default",
"text": {
"query": "App2",
"path": "title"
}
}
},
{
"$project": {
"_id": 1,
"title": 1
}
}
])
[
{
_id: 4,
title: 'The daily huddle on tHe StandUpApp2'
}
]

Atlas Search 返回包含 _id: 4 的文档,因为文档中的 title 字段包含 App2。Atlas Search 在大小写发生变化时拆分词元,并删除由拆分创建的仅包含字母的词元。它还使用索引分析器或 searchAnalyzer(如果指定)分析查询词语,以在大小写发生变化时拆分词语并删除 2 前面的字母。具体来说,对于 protectedWordsdelimiterOptions选项,Atlas Search 为包含 _id : 4 的文档创建以下词元:

wordDelimiterGraph 选项
输出词元
protectedWords
The, daily , huddle , on , t , He , Stand , Up , App , 2
delimiterOptions
The, daily , huddle , on , 2

后退

分词器

来年

2:定义字段映射