对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

自定义分析器的令牌过滤器

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

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

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

词元过滤器需要一个类型字段,有些还支持额外的选项。

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

The sample index definitions and queries on this page use the sample collection named minutes. To try these examples, load the minutes collection on your cluster and navigate to the Create a Search Index page in the Atlas UI following the steps in the Create a MongoDB Search Index tutorial. Then, select the minutes collection as your data source, and follow the example procedure to create an index from the Atlas UI or using mongosh.

MongoDB Search supports the following types of token filters:

asciiFolding 词元筛选器可将基本拉丁语 Unicode 区块中不存在的字母、数字和符号 Unicode 字符转换为对应的 ASCII 字符(如果有)。

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 asciiFolding

originalTokens

字符串

no

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

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

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

默认值omit

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

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

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

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

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

字段名称
输出词元

page_updated_by.first_name

Sian

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

注意

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 daitchMokotoffSoundex

originalTokens

字符串

no

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

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

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

默认值include

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

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

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

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

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

文档 ID
输出词元

"_id": 1

AUERBACH, 097400 , 097500

"_id": 2

OHRBACH, 097400 , 097500

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

注意

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

由于 synonymautocomplete 字段类型映射定义仅在与非图表生成词元过滤器一起使用时才有效,因此,您无法在 synonymautocomplete 字段类型映射定义中使用 edgeGram 词元过滤器。

对于使用regex(MongoDB搜索操作符)wildcard 操作符进行查询,您不能将 wordDelimiterGraph 词元过滤用作 searchAnalyzer,因为它为每个输入词元生成多个输出词元。在索引定义中指定不同的分析器作为 searchAnalyzer

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 edgeGram

minGram

整型

指定生成的 n 个词语的最小长度的数字。值必须小于或等于 maxGram

maxGram

整型

指定生成的 n 个词语的最大长度的数字。值必须大于或等于 minGram

termNotInBounds

字符串

no

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

  • include

  • omit

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

默认值omit

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

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

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

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

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

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

MongoDB Search 返回包含 _id: 1_id: 3 的文档,因为这些文档包含与查询条件匹配的术语meeting。具体来说, MongoDB 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 )。

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

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

文档 ID
输出词元

"_id": 1

The, team , weekly , meeting

"_id": 2

The, check , in , with , sales , team

englishMinimalStemming 词元过滤器将复数英语单词提取为单数形式的词干。与 kStemmingporterStemmingsnowballStemming 等更具侵略性的词干提取过滤器不同,此过滤器仅删除复数后缀,而不提取其他形态变化的词干。这样可以保留非复数词的原始形式,这在需要为非复数术语进行精确匹配的同时仍匹配单数和复数形式时有所帮助。

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 englishMinimalStemming

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

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

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

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

    • englishMinimalStemming 令片过滤器将复数词根据为单数形式,而不对其他词变体进行根据。

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

MongoDB Search 返回带有 _id: 1 的文档,因为 lowercase 词元过滤器将词元文本规范化为小写,而 englishMinimalStemming 词元过滤器将复数 meetings 词根化为单数 meeting,MongoDB Search 将其与查询词语进行匹配。具体来说,MongoDB Search 会为结果中的文档创建以下词元(可搜索词语),然后将其与查询词语 meeting 进行匹配:

文档 ID
输出词元

_id: 1

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

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 flattenGraph

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

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

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

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

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

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

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

文档 ID

输出词元

_id: 3

try, to , sign-in , sign , in

icuFolding 词元过滤应用 Unicode 技术报告 #30 中的字符折叠,例如删除重音、大小写折叠、规范重复项折叠以及报告中详细说明的许多其他内容。

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 icuFolding

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

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

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

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

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

文档 ID
输出词元

_id: 1

den har sidan behandlar avdelningsmoten

_id: 2

forst talade chefen for forsaljningsavdelningen

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 icuNormalizer

normalizationForm

字符串

no

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

  • nfd (规范分解)

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

  • nfkd (兼容性分解)

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

要学习;了解有关支持的规范化形式的详情,请参阅部分 1.2:规范化形式,UTR#15。

默认值nfc

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

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

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

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

MongoDB搜索会在查询术语1 的结果中返回包含 _id: 2 的文档,即使该文档在 message字段中包含带圆圈的数字 ,因为 icuNormalizer 词元过滤会为以下内容创建词元 1:此字符使用 nfkc 规范化形式。下表显示了MongoDB 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.

keywordRepeat 令牌过滤器会将每个传入的令牌发出两次,一次作为关键字,另一次作为非关键字。您可以使用后续令牌过滤器来提取非关键字令牌的词干,并保留关键字令牌。这可用于提升精确匹配和检索词干匹配。这通常与词干过滤器(如 porterStemming)结合使用,然后使用 removeDuplicates。

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 keywordRepeat

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

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

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

    • keywordRepeat 词元过滤器将创建两次词元,一次作为关键字词元,一次作为非关键字词元。

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

    • removeDuplicates 用于过滤流式传输中与上一个令牌位置和术语相同的令牌。

以下查询在 minutes 集合的 title 字段中使用 wildcard 操作符搜索术语 mee*

MongoDB 搜索返回标题字段中包含术语 meeting 的文档。keywordRepeat 令牌过滤器为结果中的文档生成以下词元:

标题
Keyword Tokens
Non-Keyword tokens

The team's weekly meeting

The, team's , weekly , meeting

The, team's , weekly , meeting

The regular board meeting

The, regular , board , meeting

The, regular , board , meeting

porterStemming 标记过滤器将非关键字标记还原为其根基本形式:

标题
Stemmed Non-Keyword Tokens

The team's weekly meeting

the, team , week , meet

The regular board meeting

the, regular , board , meet

removeDuplicates 令牌过滤器删除由前面的 keywordRepeat 令牌过滤器生成的流中的任何重复令牌:

标题
Tokens

The team's weekly meeting

the, team's, team, weekly, week, meeting, meet

The regular board meeting

the, regular , board , meeting , meet

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 kStemming

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

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

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

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

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

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

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

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

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 length

min

整型

no

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

默认值0

max

整型

no

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

默认值255

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

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

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

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

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

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

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

forsaljningsavdelningen

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

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 lowercase

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

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

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

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

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

文档 ID

输出词元

_id: 4

the daily huddle on the standupapp2

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

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

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

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

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

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

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

MongoDB Search 在查询术语sign-in 的结果中返回包含 _id: 1_id: 3_id: 2 的文档,因为 icuNormalizer分词器首先通过拆分文本(包括带连字符的单词)来创建单独的词元,但保留文档中的原始字母大小写,然后 lowercase 词元过滤将这些词元转换为小写。MongoDB 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 个配置大小的词语。您无法在 synonymautocomplete 映射定义中使用 nGram 词元过滤器。

注意

对于使用regex(MongoDB搜索操作符)wildcard 操作符进行查询,您不能将 wordDelimiterGraph 词元过滤用作 searchAnalyzer,因为它为每个输入词元生成多个输出词元。在索引定义中指定不同的分析器作为 searchAnalyzer

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 nGram

minGram

整型

指定生成的 n 个词语的最小长度的数字。值必须小于或等于 maxGram

maxGram

整型

指定生成的 n 个词语的最大长度的数字。值必须大于或等于 minGram

termNotInBounds

字符串

no

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

  • include

  • omit

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

默认值omit

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

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

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

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

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

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

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

规范化形式
输出词元

_id: 2

team, week, weekl, weekly, eekl, eekly, ekly, meet, meeti, meetin, meeting, eeti, eeti, eeting, etin, eting, ting

_id: 3

regu, regul, regula, regular, egul, egula, egular, gula, gular, ular, boar, board, oard, meet, meeti, meetin, meeting, eeti, eeti, eeting, etin, eting, ting

注意

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

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 porterStemming

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

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

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

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

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

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

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

规范化形式
输出词元

_id: 1

the, team' , weekli , meet

_id: 3

the, regular , board , meet

regex 词元过滤器将具有 Java 正则表达式语法 的正则表达式应用于每个词元,以将匹配项替换为指定的字符串。

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器的人类可读标签。值必须是 regex

pattern

字符串

应用于每个词元的正则表达式模式。

replacement

字符串

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

如果您指定空 string ("")以忽略或删除词元,MongoDB Search 将创建一个包含空 string 的词元。要删除包含空 string 的词元,请在 regex 词元过滤器后使用 stopword 词元过滤器。示例:

"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

以下查询使用 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,但MongoDB Search 不会返回任何查询结果。MongoDB Search 将与自定义分析器中提供的正则表达式匹配的字符串标记为单词 redacted,因此MongoDB Search 不会将查询术语与任何文档相匹配。

removeDuplicates 令牌过滤器会删除连续的重复令牌,即同一术语在同一位置的令牌。

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器的人类可读标签。值必须是 removeDuplicates

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

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

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

    • keywordRepeat 词元过滤器将词元创建两次,一次作为关键词,一次作为非关键词。

    • removeDuplicates 用于过滤流式传输中与上一个令牌位置和术语相同的令牌。

以下查询在 minutes 集合的 title 字段中使用 wildcard 操作符搜索术语 mee*

MongoDB 搜索返回标题字段中包含术语 meeting 的文档。keywordRepeat 令牌过滤器为结果中的文档生成以下词元:

标题
Keyword Tokens
Non-Keyword tokens

The team's weekly meeting

The, team's , weekly , meeting

the, team's , weekly , meeting

The regular board meeting

The, regular , board , meeting

the, regular , board , meeting

removeDuplicates 令牌过滤器会删除流中的重复令牌。

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器的人类可读标签。值必须是 reverse

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

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

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

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

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

moc.elpmaxe@*

然后, MongoDB Search 针对索引的词元运行查询,这些词元也是倒序的。具体来说, MongoDB 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 词元筛选器。

注意

对于使用regex(MongoDB搜索操作符)wildcard 操作符进行查询,您不能将 wordDelimiterGraph 词元过滤用作 searchAnalyzer,因为它为每个输入词元生成多个输出词元。在索引定义中指定不同的分析器作为 searchAnalyzer

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 shingle

minShingleSize

整型

每个 shingle 的最小词元数。必须大于或等于 2 且小于或等于 maxShingleSize

maxShingleSize

整型

每个 shingle 的最大词元数。必须大于或等于 minShingleSize

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

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

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

  • Shingle 词元

  • 创建这些shingle 词元的 edgeGram

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

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

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

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

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

搜索词元
Index Tokens

auerbachATexamp

au, aue, auer, auerb, auerba, auerbac, auerbach, auerbachA, auerbachAT, auerbachATe, auerbachATex, auerbachATexa, auerbachATexam, auerbachATexamp

The snowballStemming token filters stems tokens using a Snowball-generated stemmer.

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 snowballStemming

stemmerName

字符串

以下值是有效的:

  • arabic

  • armenian

  • basque

  • catalan

  • danish

  • dutch

  • english

  • estonian

  • finnish

  • french

  • german

  • german2 (已过时)

  • hungarian

  • irish

  • italian

  • lithuanian

  • norwegian

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

  • portuguese

  • romanian

  • russian

  • spanish

  • swedish

  • turkish

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

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

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

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

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

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

MongoDB Search 返回结果中包含 _id: 1 的文档。MongoDB 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 词元筛选器,用于为词元中的复数西班牙语词语提取单数形式的词干。

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

MongoDB Search 返回包含 _id: 4 的文档,因为文档中的 text.es_MX字段包含复数术语puntos。MongoDB搜索将此文档与查询术语punto 进行匹配,因为MongoDB搜索通过从术语中去除复数 (s),将 puntos 作为 punto 进行分析。具体来说, MongoDB 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 词元过滤器用于删除波兰语字词。

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

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

文档 ID
输出词元

_id: 4

strona, zostać, zaktualizować, o, punkt, porządek, obrada

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 stopword

tokens

字符串数组

该列表包含与要删除的词元对应的停用词。值必须是一个或多个停用词。

ignoreCase

布尔

no

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

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

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

默认值true

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

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

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

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

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

文档 ID
输出词元

_id: 2

head, of , sales , department , spoke , first.

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

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 trim

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

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

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

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

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

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

文档 ID
输出词元

_id: 1

This page deals with department meetings.

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

注意

对于使用regex(MongoDB搜索操作符)wildcard 操作符进行查询,您不能将 wordDelimiterGraph 词元过滤用作 searchAnalyzer,因为它为每个输入词元生成多个输出词元。在索引定义中指定不同的分析器作为 searchAnalyzer

它具有以下属性:

名称
类型
必需?
说明

type

字符串

标识该词元筛选器类型的人类可读标签。值必须是 wordDelimiterGraph

delimiterOptions

对象

no

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

默认值{}

delimiterOptions
.generateWordParts

布尔

no

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

默认值true

delimiterOptions
.generateNumberParts

布尔

no

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

默认值true

delimiterOptions
.concatenateWords

布尔

no

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

默认值false

delimiterOptions
.concatenateNumbers

布尔

no

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

默认值false

delimiterOptions
.concatenateAll

布尔

no

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

默认值false

delimiterOptions
.preserveOriginal

布尔

no

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

默认值true

delimiterOptions
.splitOnCaseChange

布尔

no

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

默认值true

delimiterOptions
.splitOnNumerics

布尔

no

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

默认值true

delimiterOptions
.stemEnglishPossessive

布尔

no

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

默认值true

delimiterOptions
.ignoreKeywords

布尔

no

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

默认值false

protectedWords

对象

no

该对象包含保护字选项。

默认值{}

protectedWords
.words

阵列

视条件而定

List that contains the tokens to protect from being split. If you specify protectedWords, you must specify this option.

protectedWords
.ignoreCase

布尔

no

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

默认值true

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

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

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

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

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

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

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

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

wordDelimiterGraph 选项
输出词元

protectedWords

The, daily, huddle, on, t, He, Stand, Up, App, 2

delimiterOptions

The, daily , huddle , on , 2