Docs 菜单
Docs 主页
/
MongoDB Atlas
/ / / / /

分词器

在此页面上

  • edgeGram
  • 属性
  • 例子
  • keyword
  • 属性
  • 例子
  • nGram
  • 属性
  • 例子
  • regexCaptureGroup
  • 属性
  • 例子
  • regexSplit
  • 属性
  • 例子
  • 标准
  • 属性
  • 例子
  • uaxUrlEmail
  • 属性
  • 例子
  • whitespace
  • 属性
  • 例子

自定义分析器的分词器决定 Atlas Search 如何将文本分割为数据段以进行索引。分词器需要一个类型字段,有些还支持额外的选项。

"tokenizer": {
"type": "<tokenizer-type>",
"<additional-option>": "<value>"
}

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

注意

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

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

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

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

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

edgeGram 分词器将文本输入左侧(或“边缘”)的输入标记为给定大小的 n 元模型。您无法在同义词自动完成字段映射定义analyzer 字段中将自定义分析器与 edgeGram 分词器结合使用。

它具有以下属性:

注意

edgeGram 分词器可按单词或跨输入文本中的单词生成多个输出标记,从而生成标记图。

由于自动完成字段类型映射定义和具有同义词映射的分析器仅在与不生成图的分词器一起使用时才有效,因此不能将 analyzer 字段中带有 edgeGram 分词器的自定义分析器用于自动完成字段类型映射定义或带有同义词映射的分析器。

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 edgeGram
minGram
整型
要包含在创建的最短词元中的字符数。
maxGram
整型
要包含在创建的最长词元中的字符数。

以下索引定义使用名为 edgegramExample 的自定义分析器对 minutes 集合中的 message 字段建立索引。它使用 edgeGram 分词器创建 27 个字符长的词元(可搜索词),从 message 字段中单词左侧的第一个字符开始。

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

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

  3. Analyzer Name 字段中输入 edgegramExample

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

  5. 从下拉列表中选择 edgeGram,然后为以下字段键入值:

    字段
    minGram
    2
    maxGram
    7
  6. 单击 Add,将自定义分析器添加到索引。

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

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

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

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

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

{
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "edgegramExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "edgegramExample",
"tokenFilters": [],
"tokenizer": {
"maxGram": 7,
"minGram": 2,
"type": "edgeGram"
}
}
]
}

下面的查询在 minutes 集合的 message 字段中搜索以 tr 开头的文本。

1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "tr",
6 "path": "message"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "message": 1
14 }
15 }
16])
{ _id: 1, message: 'try to siGn-In' },
{ _id: 3, message: 'try to sign-in' }

Atlas Search 在结果中返回具有 _id: 1_id: 3 的文档,因为 Atlas Search 使用文档的 edgeGram 分词器创建了一个值为 tr 的词元,该词元与搜索词匹配。如果使用 standard 分词器为 message 字段建立索引,Atlas Search 将不会返回搜索词 tr 的任何结果。

下表列出了 edgeGram 分词器以及与之相比较的 standard 分词器为结果中的文档创建的词元:

分词器
Token Outputs
standard
try, to , sign , in
edgeGram
tr, try , try{SPACE} , try t , try to , try to{SPACE}

keyword分词器将整个输入标记为单个词元。Atlas Search 不会使用keyword分词器对超过 32766 个字符的字符串字段编制索引。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 keyword

以下索引定义使用名为 keywordExample 的自定义分析器对 minutes 集合中的 message 字段建立索引。它使用 keyword 分词器在整个字段上创建作为单个术语的词元(可搜索词)。

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

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

  3. Analyzer Name 字段中输入 keywordExample

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

  5. 从下拉列表中选择 keyword

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

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

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

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

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

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

{
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "keywordExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "keywordExample",
"tokenFilters": [],
"tokenizer": {
"type": "keyword"
}
}
]
}

下面的查询在 minutes 集合的 message 字段中搜索词语 try to sign-in

1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "try to sign-in",
6 "path": "message"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "message": 1
14 }
15 }
16])
{ _id: 3, message: 'try to sign-in' }

Atlas Search 会在结果中返回具有 _id: 3 的文档,因为 Atlas Search 已使用文档的 keyword 分词器创建了一个值为 try to sign-in 的词元,该词元与搜索词匹配。如果您使用 standard 分词器为 message 字段建立索引,则 Atlas Search 将针对搜索词 try to sign-in 返回具有 _id: 1_id: 2_id: 3 的文档,因为每个文档都包含 standard 分词器创建的一些词元。

下表列出了 keyword 分词器以及与之相比较的 standard 分词器为具有 _id: 3 的文档创建的词元:

分词器
Token Outputs
standard
try, to , sign , in
keyword
try to sign-in

nGram 分词器标记为给定大小的文本块或“n-grams”。对于同义词自动完成字段映射定义,不能在 analyzer 字段中使用带有 nGram 分词器的自定义分析器。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 nGram
minGram
整型
要包含在创建的最短词元中的字符数。
maxGram
整型
要包含在创建的最长词元中的字符数。

以下索引定义使用名为 ngramExample 的自定义分析器为 minutes 集合中的 title 字段建立索引,并使用 nGram 分词器在 title 字段中创建长度介于 46 个字符之间的词元(可搜索术语)。

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

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

  3. Analyzer Name 字段中输入 ngramExample

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

  5. 从下拉列表中选择 nGram,然后为以下字段键入值:

    字段
    minGram
    4
    maxGram
    6
  6. 单击 Add,将自定义分析器添加到索引。

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

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

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

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

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

{
"mappings": {
"dynamic": true,
"fields": {
"title": {
"analyzer": "ngramExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "ngramExample",
"tokenFilters": [],
"tokenizer": {
"maxGram": 6,
"minGram": 4,
"type": "nGram"
}
}
]
}

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

1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "week",
6 "path": "title"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "title": 1
14 }
15 }
16])
{ _id: 1, title: "The team's weekly meeting" }

Atlas Search 会在结果中返回具有 _id: 1 的文档,因为 Atlas Search 已使用文档的 nGram 分词器创建了一个值为 week 的词元,该词元与搜索词匹配。如果使用 standardedgeGram 分词器为 title 字段建立索引,Atlas Search 将不会返回搜索词 week 的任何结果。

下表列出了 nGram 分词器以及与之相比,standardedgeGram 分词器为具有 _id: 1 的文档创建的标记:

分词器
Token Outputs
standard
The, team's , weekly , meeting
edgeGram
The{SPACE}, The t , The te
nGram
The{SPACE}, The t, The te, he t, ... , week, weekl, weekly, eekl, ..., eetin, eeting, etin, eting, ting

regexCaptureGroup 分词器与正则表达式模式相匹配以提取词元。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 regexCaptureGroup
pattern
字符串
要匹配的正则表达式。
group
整型
匹配表达式中要提取为标记的字符群组的索引。使用 0 提取所有字符组。

以下索引定义使用名为 phoneNumberExtractor 的自定义分析器对 minutes 集合中的 page_updated_by.phone 字段建立索引。它使用以下命令:

  • mappings 字符过滤器,删除前三位数字周围的括号并用破折号替换所有空格和句点

  • regexCaptureGroup 分词器,用于根据文本输入中存在的第一个美国格式的电话号码创建单个词元

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

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

  3. Analyzer Name 字段中输入 phoneNumberExtractor

  4. 展开 Character Filters 并单击 Add character filter

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

  6. Original 字段中输入以下字符,一次一个,并将相应的 Replacement 字段留空。

    原始
    更换
    -
    .
    (
    )
  7. 单击 Add character filter(连接)。

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

  9. 从下拉列表中选择 regexCaptureGroup,然后为以下字段键入值:

    字段
    pattern
    ^\\b\\d{3}[-]?\\d{3}[-]?\\d{4}\\b$
    group
    0
  10. 单击 Add,将自定义分析器添加到索引。

  11. Field Mappings 部分中,单击 Add Field Mapping 以在 page_updated_by.phone 字段上应用自定义分析器。

  12. Field Name 下拉列表中选择 page_updated_by.phone,并从 Data Type 下拉列表中选择字符串

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

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

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

{
"mappings": {
"dynamic": true,
"fields": {
"page_updated_by": {
"fields": {
"phone": {
"analyzer": "phoneNumberExtractor",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"charFilters": [
{
"mappings": {
" ": "-",
"(": "",
")": "",
".": "-"
},
"type": "mapping"
}
],
"name": "phoneNumberExtractor",
"tokenFilters": [],
"tokenizer": {
"group": 0,
"pattern": "^\\b\\d{3}[-]?\\d{3}[-]?\\d{4}\\b$",
"type": "regexCaptureGroup"
}
}
]
}

以下查询会在 minutes 集合的 page_updated_by.phone 字段中搜索电话号码 123-456-9870

1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "123-456-9870",
6 "path": "page_updated_by.phone"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "page_updated_by.phone": 1
14 }
15 }
16])
{ _id: 3, page_updated_by: { phone: '(123).456.9870' }

Atlas Search 在结果中返回具有 _id: 3 的文档,因为 Atlas Search 使用文档的 regexCaptureGroup 分词器创建了一个值为 123-456-7890 的词元,该词元与搜索词匹配。如果使用 standard 分词器为 page_updated_by.phone 字段建立索引,则 Atlas Search 将返回搜索词 123-456-7890 的所有文档。

下表列出了 regexCaptureGroup 分词器以及与之相比较的 standard 分词器为具有 _id: 3 的文档创建的词元:

分词器
Token Outputs
standard
123, 456.9870
regexCaptureGroup
123-456-9870

regexSplit 分词器使用基于正则表达式的分隔符拆分词元。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 regexSplit
pattern
字符串
要匹配的正则表达式。

以下索引定义使用名为 dashDotSpaceSplitter 的自定义分析器对 minutes 集合中的 page_updated_by.phone 字段建立索引。它使用 regexSplit 分词器从 page_updated_by.phone 字段中的一个或多个连字符、句点和空格创建词元(可搜索词)。

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

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

  3. Analyzer Name 字段中输入 dashDotSpaceSplitter

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

  5. 从下拉列表中选择 regexSplit,然后为以下字段键入值:

    字段
    pattern
    [-. ]+
  6. 单击 Add,将自定义分析器添加到索引。

  7. Field Mappings 部分中,单击 Add Field Mapping 以在 page_updated_by.phone 字段上应用自定义分析器。

  8. Field Name 下拉列表中选择 page_updated_by.phone,并从 Data Type 下拉列表中选择字符串

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

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

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

{
"mappings": {
"dynamic": true,
"fields": {
"page_updated_by": {
"fields": {
"phone": {
"analyzer": "dashDotSpaceSplitter",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "dashDotSpaceSplitter",
"tokenFilters": [],
"tokenizer": {
"pattern": "[-. ]+",
"type": "regexSplit"
}
}
]
}

下面的查询在 minutes 集合的 page_updated_by.phone 字段中搜索数字 9870

1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "9870",
6 "path": "page_updated_by.phone"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "page_updated_by.phone": 1
14 }
15 }
16])
{ _id: 3, page_updated_by: { phone: '(123).456.9870' }

Atlas Search 在结果中返回具有 _id: 3 的文档,因为 Atlas Search 使用文档的 regexSplit 分词器创建了一个值为 9870 的词元,该词元与搜索词匹配。如果使用 standard 分词器为 page_updated_by.phone 字段建立索引,Atlas Search 将不会返回搜索词 9870 的任何结果。

下表列出了 regexCaptureGroup 分词器以及与之相比较的 standard 分词器为具有 _id: 3 的文档创建的词元:

分词器
Token Outputs
standard
123, 456.9870
regexSplit
(123), 456 , 9870

standard 分词器根据 Unicode 文本分割算法中的分词规则进行分词。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 standard
maxTokenLength
整型
no

单个标记的最大长度。大于此长度的标记将按 maxTokenLength 分割为多个标记。

默认值255

以下索引定义使用名为 standardExample 的自定义分析器对 minutes 集合中的 message 字段建立索引。它使用 standard 分词器和停用词词元过滤器

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

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

  3. Analyzer Name 字段中输入 standardExample

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

  5. 从下拉列表中选择 standard

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

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

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

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

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

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

{
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "standardExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "standardExample",
"tokenFilters": [],
"tokenizer": {
"type": "standard"
}
}
]
}

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

1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "signature",
6 "path": "message"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "message": 1
14 }
15 }
16])
{ _id: 4, message: 'write down your signature or phone №' }

Atlas Search 返回具有 _id: 4 的文档,因为 Atlas Search 使用文档的 standard 分词器创建了一个值为 signature 的词元,该词元与搜索词匹配。如果使用 keyword 分词器为 message 字段建立索引,Atlas Search 将不会返回搜索词 signature 的任何结果。

下表列出了 standard 分词器以及与之相比较的 keyword 分析器为具有 _id: 4 的文档创建的词元:

分词器
Token Outputs
standard
write, down , your , signature , or , phone
keyword
write down your signature or phone №

uaxUrlEmail分词器对URL和电子邮件地址进行分词。 尽管uaxUrlEmail 分词器基于 Unicode 文本分割算法 的分词规则进行分词 ,我们建议仅当索引字段值包含uaxUrlEmail URL 和电子邮件地址时才使用 分词器。对于不包含URL或电子邮件地址的字段,请使用标准分词器根据分词规则创建词元。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 uaxUrlEmail
maxTokenLength
int
no

一个词元中的最大字符数。

默认值255

以下索引定义使用名为 basicEmailAddressAnalyzer 的自定义分析器对 minutes 集合中的 page_updated_by.email 字段建立索引。它使用 uaxUrlEmail 分词器从 page_updated_by.email 字段中的 URL 和电子邮件地址创建词元(可搜索的术语)。

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

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

  3. Analyzer Name 字段中输入 basicEmailAddressAnalyzer

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

  5. 从下拉列表中选择 uaxUrlEmail

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

  7. Field Mappings 部分,单击 Add Field Mapping,在 page_updated_by.email 字段中应用自定义分析器。

  8. Field Name下拉列表中选择 page_updated_by.email,并从 Data Type 下拉列表中选择 String(字符串)。

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

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

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

{
"mappings": {
"fields": {
"page_updated_by": {
"fields": {
"email": {
"analyzer": "basicEmailAddressAnalyzer",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"name": "basicEmailAddressAnalyzer",
"tokenizer": {
"type": "uaxUrlEmail"
}
}
]
}

下面的查询会在 minutes 集合的 page_updated_by.email 字段中搜索电子邮件 lewinsky@example.com

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

Atlas Search 会在结果中返回具有 _id: 3 的文档,因为 Atlas Search 已使用文档的 uaxUrlEmail 分词器创建了一个值为 lewinsky@example.com 的词元,该词元与搜索词匹配。如果使用 standard 分词器为 page_updated_by.email 字段建立索引,Atlas Search 则会返回针对搜索词 lewinsky@example.com 的所有文档。

下表列出了 uaxUrlEmail 分词器以及与之相比较的 standard 分词器为具有 _id: 3 的文档创建的词元:

分词器
Token Outputs
standard
lewinsky, example.com
uaxUrlEmail
lewinsky@example.com

以下索引定义使用名为 emailAddressAnalyzer 的自定义分析器对 minutes 集合中的 page_updated_by.email 字段建立索引。它使用以下命令:

  • 采用 edgeGram 分词策略autocomplete 类型

  • uaxUrlEmail 分词器,用于从 URL 和电子邮件地址创建词元(可搜索词语)

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

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

  3. Analyzer Name 字段中输入 emailAddressAnalyzer

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

  5. 从下拉列表中选择 uaxUrlEmail

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

  7. Field Mappings 部分,单击 Add Field Mapping,在 page_updated_by.email 字段中应用自定义分析器。

  8. Field Name 下拉列表中选择 page_updated_by.email,并从 Data Type 下拉列表中选择自动完成

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

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

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

{
"mappings": {
"fields": {
"page_updated_by": {
"fields": {
"email": {
"analyzer": "emailAddressAnalyzer",
"tokenization": "edgeGram",
"type": "autocomplete"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"name": "emailAddressAnalyzer",
"tokenizer": {
"type": "uaxUrlEmail"
}
}
]
}

下面的查询在 minutes 集合的 page_updated_by.email 字段中搜索词语 exam

db.minutes.aggregate([
{
"$search": {
"autocomplete": {
"query": "lewinsky@example.com",
"path": "page_updated_by.email"
}
}
},
{
"$project": {
"_id": 1,
"page_updated_by.email": 1
}
}
])
_id: 3, page_updated_by: { email: 'lewinsky@example.com' } }

Atlas Search 会在结果中返回具有 _id: 3 的文档,因为 Atlas Search 已使用文档的 uaxUrlEmail 分词器创建了一个值为 lewinsky@example.com 的词元,该词元与搜索词匹配。如果使用 standard 分词器为 page_updated_by.email 字段建立索引,Atlas Search 则会返回针对搜索词 lewinsky@example.com 的所有文档。

下表列出了 uaxUrlEmail 分词器以及与之相比较的 standard 分词器为具有 _id: 3 的文档创建的词元:

分词器
Atlas Search 字段类型
Token Outputs
standard
autocomplete edgeGram
le, lew, lewi, lewin, lewins, lewinsk, lewinsky, lewinsky@, lewinsky, ex, exa, exam, examp, exampl, example, example., example.c, example.co, example.com
uaxUrlEmail
autocomplete edgeGram
le, lew, lewi, lewin, lewins, lewinsk, lewinsky, lewinsky@, lewinsky@e, lewinsky@ex, lewinsky@exa, lewinsky@exam, lewinsky@examp, lewinsky@exampl

whitespace分词器根据单词之间出现的空格进行分词。

它具有以下属性:

名称
类型
必需?
说明
type
字符串
标识此分词器类型的可读标签。值必须是 whitespace
maxTokenLength
整型
no

单个标记的最大长度。大于此长度的标记将按 maxTokenLength 分割为多个标记。

默认值255

以下索引定义使用名为 whitespaceExample 的自定义分析器对 minutes 集合中的 message 字段建立索引。它使用 whitespace 分词器从 message 字段中的任意空格创建词元(可搜索词)。

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

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

  3. Analyzer Name 字段中输入 whitespaceExample

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

  5. 从下拉列表中选择 whitespace

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

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

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

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

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

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

{
"mappings": {
"dynamic": true,
"fields": {
"message": {
"analyzer": "whitespaceExample",
"type": "string"
}
}
},
"analyzers": [
{
"charFilters": [],
"name": "whitespaceExample",
"tokenFilters": [],
"tokenizer": {
"type": "whitespace"
}
}
]
}

下面的查询在 minutes 集合的 message 字段中搜索词语 SIGN-IN

1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "SIGN-IN",
6 "path": "message"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "message": 1
14 }
15 }
16])
{ _id: 2, message: 'do not forget to SIGN-IN' }

Atlas Search 在结果中返回具有 _id: 2 的文档,因为 Atlas Search 使用文档的 whitespace 分词器创建了一个值为 SIGN-IN 的词元,该词元与搜索词匹配。如果使用 standard 分词器为 message 字段建立索引,则对于搜索词 SIGN-IN,Atlas Search 将返回具有 _id: 1_id: 2_id: 3 文档。

下表列出了 whitespace 分词器以及与之相比较的 standard 分词器为具有 _id: 2 的文档创建的词元:

分词器
Token Outputs
standard
do, not , forget , to , sign , in
whitespace
do, not , forget , to , SIGN-IN

后退

字符筛选器