字符筛选器
字符筛选器一次检查一个字符的文本并执行筛选操作。 字符筛选器需要类型字段,有些还需要额外的选项。
"charFilters": [ { "type": "<filter-type>", "<additional-option>": <value> } ]
Atlas Search 支持四种类型的字符筛选器:
以下示例索引定义和查询使用名为 minutes
的 示例集合 。如果您将 minutes
集合添加到 Atlas 集群中的数据库,则可以从 Atlas UI 中的可视化编辑器或 JSON 编辑器创建以下示例索引,并针对该集合运行示例查询。要创建这些索引,请在 Atlas UI 中选择首选配置方法后,选择数据库和集合,然后按照本页上的示例优化索引,添加使用字符过滤器的自定义分析器。
注意
htmlStrip
htmlStrip
字符筛选器去除 HTML 结构。
属性
它具有以下属性:
名称 | 类型 | 必需? | 说明 |
---|---|---|---|
type | 字符串 | 是 | 标识此字符筛选器类型的人类可读标签。 值必须是 htmlStrip 。 |
ignoredTags | 字符串数组 | 是 | 包含要从过滤中排除的 HTML 标记的列表。 |
例子
以下索引定义示例使用名为htmlStrippingAnalyzer
的自定义分析器为分钟collection中的text.en_US
字段编制索引。自定义分析器指定以下内容:
使用
htmlStrip
字符筛选器从文本中删除除a
标签之外的所有 HTML 标签。根据 Unicode 文本分割算法 中的分词规则,使用标准分词器生成词元。
在 Custom Analyzers 部分中,单击 Add Custom Analyzer。
选择 Create Your Own 单选按钮并单击 Next。
在 Analyzer Name 字段中输入
htmlStrippingAnalyzer
。展开 Character Filters,然后单击 Add character filter。
从下拉菜单中选择 htmlStrip,然后在 ignoredTags 字段中输入
a
。单击 Add character filter(连接)。
如果Tokenizer已折叠,请将其展开,然后从下拉列表中选择standard 。
单击 Add,将自定义分析器添加到索引。
在 Field Mappings 部分中,单击 Add Field Mapping 可对 text.en_US嵌套字段应用自定义分析器。
选择 text.en_US(嵌套在 Field Name 下拉菜单中),然后从 Data Type 下拉菜单中选择 String(字符串)。
在数据类型的属性部分中,从 Index Analyzer 和 Search Analyzer 下拉菜单中选择
htmlStrippingAnalyzer
。单击 Add,然后单击 Save Changes。
将默认索引定义替换为以下内容:
1 { 2 "mappings": { 3 "fields": { 4 "text": { 5 "type": "document", 6 "dynamic": true, 7 "fields": { 8 "en_US": { 9 "analyzer": "htmlStrippingAnalyzer", 10 "type": "string" 11 } 12 } 13 } 14 } 15 }, 16 "analyzers": [{ 17 "name": "htmlStrippingAnalyzer", 18 "charFilters": [{ 19 "type": "htmlStrip", 20 "ignoredTags": ["a"] 21 }], 22 "tokenizer": { 23 "type": "standard" 24 }, 25 "tokenFilters": [] 26 }] 27 }
head
text.en_US
minutes
以下查询在collection的字段中查找字符串 的出现次数。
1 db.minutes.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "query": "head", 6 "path": "text.en_US" 7 } 8 } 9 }, 10 { 11 "$project": { 12 "_id": 1, 13 "text.en_US": 1 14 } 15 } 16 ])
[ { _id: 2, text: { en_US: "The head of the sales department spoke first." } }, { _id: 3, text: { en_US: "<body>We'll head out to the conference room by noon.</body>" } } ]
Atlas Search 不会返回包含_id: 1
的文档,因为字符串head
是 HTML 标签<head>
的一部分。带有_id: 3
的文档包含 HTML 标记,但字符串head
在其他位置,因此该文档是匹配项。 下表显示了 Atlas Search 使用htmlStrippingAnalyzer
为分钟collection中的文档_id: 1
、 _id: 2
和_id: 3
中的text.en_US
字段值生成的词元。
文档 ID | 输出词元 |
---|---|
_id: 1 | This , page , deals , with , department , meetings |
_id: 2 | The , head , of , the , sales , department , spoke , first |
_id: 3 | We'll , head , out , to , the , conference , room , by , noon |
icuNormalize
icuNormalize
字符过滤器使用 ICU Normalizer 对文本进行规范化。它基于 Lucene 的 ICUN ormalizer2 CharFilter。
属性
它具有以下属性:
名称 | 类型 | 必需? | 说明 |
---|---|---|---|
type | 字符串 | 是 | 标识此字符筛选器类型的人类可读标签。 值必须是 icuNormalize 。 |
例子
以下索引定义示例使用名为normalizingAnalyzer
的自定义分析器为分钟collection中的message
字段编制索引。自定义分析器指定以下内容:
使用
icuNormalize
字符筛选器对message
字段值中的文本进行规范化。使用空格分词器根据单词之间出现的空格对字段中的单词进行分词。
在 Custom Analyzers 部分中,单击 Add Custom Analyzer。
选择 Create Your Own 单选按钮并单击 Next。
在 Analyzer Name 字段中输入
normalizingAnalyzer
。展开 Character Filters,然后单击 Add character filter。
从下拉菜单中选择icuNormalize ,然后单击Add character filter 。
如果Tokenizer已折叠,请将其展开,然后从下拉列表中选择whitespace 。
单击 Add,将自定义分析器添加到索引。
在 Field Mappings 部分中,单击 Add Field Mapping 以在message(消息)字段上应用自定义分析器。
从 Field Name 下拉列表中选择 message(消息),并从 Data Type 下拉列表中选择String(字符串)。
在数据类型的属性部分,从Index Analyzer和Search Analyzer下拉列表中选择
normalizingAnalyzer
。单击 Add,然后单击 Save Changes。
将默认索引定义替换为以下内容:
1 { 2 "mappings": { 3 "fields": { 4 "message": { 5 "type": "string", 6 "analyzer": "normalizingAnalyzer" 7 } 8 } 9 }, 10 "analyzers": [ 11 { 12 "name": "normalizingAnalyzer", 13 "charFilters": [ 14 { 15 "type": "icuNormalize" 16 } 17 ], 18 "tokenizer": { 19 "type": "whitespace" 20 }, 21 "tokenFilters": [] 22 } 23 ] 24 }
no
message
minutes
以下查询在collection的字段中搜索字符串 (数字)的出现次数。
1 db.minutes.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "query": "no", 6 "path": "message" 7 } 8 } 9 }, 10 { 11 "$project": { 12 "_id": 1, 13 "message": 1, 14 "title": 1 15 } 16 } 17 ])
[ { _id: 4, title: 'The daily huddle on tHe StandUpApp2', message: 'write down your signature or phone №' } ]
Atlas Search 将包含_id: 4
的文档与查询术语no
进行匹配,因为它使用icuNormalize
字符筛选器对该字段中的数字符号№
进行了规范化,并为单词“number”的印刷缩写创建了词元no
。 ”。 Atlas Search 使用normalizingAnalyzer
为文档_id: 4
中的字段message
值生成以下词元:
文档 ID | 输出词元 |
---|---|
_id: 4 | write , down , your , signature , or , phone , no |
映射
mapping
字符筛选器将用户指定的规范化映射应用于字符。 它基于 Lucene 的 MappingCharFilter。
属性
它具有以下属性:
名称 | 类型 | 必需? | 说明 |
---|---|---|---|
type | 字符串 | 是 | 标识此字符筛选器类型的人类可读标签。 值必须是 mapping 。 |
mappings | 对象 | 是 | 包含以逗号分隔的映射列表的对象。 映射表示应用一个字符或一组字符替换另一个字符或一组字符,格式为 <original> : <replacement> 。 |
例子
以下索引定义示例使用名为mappingAnalyzer
的自定义分析器为分钟collection中的page_updated_by.phone
字段编制索引。自定义分析器指定以下内容:
使用
mapping
字符筛选器删除电话字段中连字符 (-
)、点 (.
)、左括号 ((
)、右括号 ()
) 和空格字符的实例。使用关键字分词器将整个输入分词为单个词元。
在 Custom Analyzers 部分中,单击 Add Custom Analyzer。
选择 Create Your Own 单选按钮并单击 Next。
在 Analyzer Name 字段中输入
mappingAnalyzer
。展开 Character Filters,然后单击 Add character filter。
从下拉菜单中选择 mapping,然后点击 Add mapping。
在 Original 字段中输入以下字符,一次一个,并将相应的 Replacement 字段留空。
原始更换-
.
(
)
{SPACE}单击 Add character filter(连接)。
如果Tokenizer已折叠,请将其展开,然后从下拉列表中选择keyword 。
单击 Add,将自定义分析器添加到索引。
在 Field Mappings 部分中,单击 Add Field Mapping 以对 page_updated_by.phone(嵌套)字段应用自定义分析器。
从 Field Name 下拉列表中选择 page_updated_by.phone(嵌套),并从Data Type 下拉列表中选择 String。
在数据类型的属性部分中,从 Index Analyzer 和 Search Analyzer 下拉菜单中选择
mappingAnalyzer
。单击 Add,然后单击 Save Changes。
将默认索引定义替换为以下内容:
1 { 2 "mappings": { 3 "fields": { 4 "page_updated_by": { 5 "fields": { 6 "phone": { 7 "analyzer": "mappingAnalyzer", 8 "type": "string" 9 } 10 }, 11 "type": "document" 12 } 13 } 14 }, 15 "analyzers": [ 16 { 17 "name": "mappingAnalyzer", 18 "charFilters": [ 19 { 20 "mappings": { 21 "-": "", 22 ".": "", 23 "(": "", 24 ")": "", 25 " ": "" 26 }, 27 "type": "mapping" 28 } 29 ], 30 "tokenizer": { 31 "type": "keyword" 32 } 33 } 34 ] 35 }
以下查询在page_updated_by.phone
字段中搜索字符串1234567890
。
1 db.minutes.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "query": "1234567890", 6 "path": "page_updated_by.phone" 7 } 8 } 9 }, 10 { 11 "$project": { 12 "_id": 1, 13 "page_updated_by.phone": 1, 14 "page_updated_by.last_name": 1 15 } 16 } 17 ])
[ { _id: 1, page_updated_by: { last_name: 'AUERBACH', phone: '(123)-456-7890' } } ]
Atlas Search 结果包含一个文档,其中phone
字符串中的数字与查询字符串匹配。即使查询不包含电话区号两边的括号以及数字之间的连字符,Atlas Search 也会将文档与查询字符串进行匹配,因为 Atlas Search 使用mapping
字符筛选器删除了这些字符,并为字段值创建了单个词元。具体来说,Atlas Search 为具有_id: 1
的文档中的phone
字段生成了以下词元:
文档 ID | 输出词元 |
---|---|
_id: 1 | 1234567890 |
对于搜索(123)-456-7890
、 123-456-7890
、 123.456.7890
等,Atlas Search 还会将文档与_id: 1
进行匹配,因为对于如何索引字符串字段字段,Atlas Search 还使用索引分析器(或如果已指定,则使用searchAnalyzer
)。 下表显示了 Atlas Search 通过删除查询术语中的连字符 ( -
)、点 ( .
)、左括号 ( (
)、右括号 ( )
) 和空格字符的实例而创建的词元:
查询术语 | 输出词元 |
---|---|
(123)-456-7890 | 1234567890 |
123-456-7890 | 1234567890 |
123.456.7890 | 1234567890 |
波斯语
persian
字符过滤器会用空格字符替换零宽度非连接符的实例。这个角色过滤器基于 Lucene 的 PersianCharFilter。
属性
它具有以下属性:
名称 | 类型 | 必需? | 说明 |
---|---|---|---|
type | 字符串 | 是 | 标识此字符筛选器类型的人类可读标签。 值必须是 persian 。 |
例子
以下索引定义示例使用名为persianCharacterIndex
的自定义分析器为分钟collection中的text.fa_IR
字段编制索引。自定义分析器指定以下内容:
应用
persian
字符筛选器,将字段值中的非打印字符替换为空格字符。使用空格分词器根据词之间出现的空格创建标记。
在 Custom Analyzers 部分中,单击 Add Custom Analyzer。
选择 Create Your Own 单选按钮并单击 Next。
在 Analyzer Name 字段中输入
persianCharacterIndex
。展开 Character Filters,然后单击 Add character filter。
从下拉菜单中选择persian ,然后单击Add character filter 。
如果Tokenizer已折叠,请将其展开,然后从下拉列表中选择whitespace 。
单击 Add,将自定义分析器添加到索引。
在 Field Mappings 部分中,单击 Add Field Mapping,将自定义分析器应用于 text.fa_IR(嵌套)字段。
从以下内容选择 text.fa_IR(嵌套)Field Name 下拉列表和 Data Type 下拉列表的 String中。
在数据类型的属性部分,从Index Analyzer和Search Analyzer下拉列表中选择
persianCharacterIndex
。单击 Add,然后单击 Save Changes。
将默认索引定义替换为以下内容:
1 { 2 "analyzer": "lucene.standard", 3 "mappings": { 4 "fields": { 5 "text": { 6 "dynamic": true, 7 "fields": { 8 "fa_IR": { 9 "analyzer": "persianCharacterIndex", 10 "type": "string" 11 } 12 }, 13 "type": "document" 14 } 15 } 16 }, 17 "analyzers": [ 18 { 19 "name": "persianCharacterIndex", 20 "charFilters": [ 21 { 22 "type": "persian" 23 } 24 ], 25 "tokenizer": { 26 "type": "whitespace" 27 } 28 } 29 ] 30 }
以下查询在text.fa_IR
字段中搜索صحبت
一词。
1 db.minutes.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "query": "صحبت", 6 "path": "text.fa_IR" 7 } 8 } 9 }, 10 { 11 "$project": { 12 "_id": 1, 13 "text.fa_IR": 1, 14 "page_updated_by.last_name": 1 15 } 16 } 17 ])
[ { _id: 2, page_updated_by: { last_name: 'OHRBACH' }, text: { fa_IR: 'ابتدا رئیس بخش فروش صحبت کرد' } } ]
Atlas Search 返回包含查询术语的_id: 2
文档。Atlas Search 将查询术语与文档进行匹配,方法是首先用空格字符替换零宽度非连接符的实例,然后根据单词之间出现的空格为字段值中的每个单词创建单独的词元。具体来说,Atlas Search 为包含_id: 2
的文档生成以下词元:
文档 ID | 输出词元 |
---|---|
_id: 2 | ابتدا , رئیس , بخش , فروش , صحبت , کرد |