Docs 菜单

Docs 主页启动和管理 MongoDBMongoDB Atlas

分词器

在此页面上

  • edgeGram
  • 属性
  • 例子
  • 关键字
  • 属性
  • 例子
  • nGram
  • 属性
  • 例子
  • regexCaptureGroup
  • 属性
  • 例子
  • regexSplit
  • 属性
  • 例子
  • 标准
  • 属性
  • 例子
  • uaxUrlEmail
  • 属性
  • 例子
  • 空格
  • 属性
  • 例子

自定义分析器的分词器决定 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 字段中单词左侧的第一个字符开始。

下面的查询在 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 分词器为结果中的文档创建的词元:

分词器
令牌输出
standard
trytosignin
edgeGram
trtrytry{SPACE}try ttry totry to{SPACE}

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

它具有以下属性:

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

以下索引定义使用名为 keywordExample 的自定义分析器对 minutes 集合中的 message 字段建立索引。它使用 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 的文档创建的词元:

分词器
令牌输出
standard
trytosignin
keyword
try to sign-in

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

它具有以下属性:

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

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

下面的查询在 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 的文档创建的标记:

分词器
令牌输出
standard
Theteam'sweeklymeeting
edgeGram
The{SPACE}The tThe te
nGram
The{SPACE}The tThe tehe t,...,weekweeklweeklyeekl,...,eetineetingetinetingting

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

它具有以下属性:

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

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

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

  • 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 的文档创建的词元:

分词器
令牌输出
standard
123456.9870
regexCaptureGroup
123-456-9870

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

它具有以下属性:

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

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

下面的查询在 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 的文档创建的词元:

分词器
令牌输出
standard
123456.9870
regexSplit
(123)4569870

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

它具有以下属性:

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

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

默认值255

以下索引定义使用名为 standardExample 的自定义分析器对 minutes 集合中的 message 字段建立索引。它使用 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 的文档创建的词元:

分词器
令牌输出
standard
writedownyoursignatureorphone
keyword
write down your signature or phone №

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

它具有以下属性:

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

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

默认值255

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

它具有以下属性:

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

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

默认值255

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

下面的查询在 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 的文档创建的词元:

分词器
令牌输出
standard
donotforgettosignin
whitespace
donotforgettoSIGN-IN
← 字符筛选器