一.概述
Tokenizer分词器接收字符流(es的text类型),将其分解为单个term(通常是单个单词), 然后输出标记流。分词器除了分解,还负责记录以下内容:
1)记录每个单词(term)的顺序或位置(用于”phrase短语“和单词邻近性查询)
2)term原始单词的开始和结束字符偏移量(使用 ”highlighting 高亮“ 搜索显示)
3)token类型,生成每个term的分类。例如:字母、数字。
Elasticsearch有许多内置的Tokenizer,可用于构建自定义的Tokenizer。Tokenizer有三种分类:
1)面向单词的分词器,这种分析器是将文本拆分为一个个的单词。
2)部分单词的分词器,这种分析器是将文本拆分为任意组合的字母(通过配置1~n个)。
3)结构化文本的分词器,该类型分词器通常与结构化文本一起使用,例如:邮件地址、邮政编码。
分析器与分词器关系总结:
前面章节有讲到一个分析器的组合包含:一个Tokenizer分词器(必需),0或多个charactcr filter、 0或多个token filter。
对于Elasticsearch内置的许多分析器和分词器,二者的名称许多都一样。如: Standard分析器和Standard分词器,它们之间的关系是Standard分析器包含了一个Standard分词器。
对于分析器与分词器,可以直接使用内置的,也都可以是创建自定义的。
二. 面向单词的分词器
2.1 Standard Tokenizerc(标准分词器)
Standard分析器包含了Standard 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5)
2.2 Letter Tokenizer(字母分词器)
分词规则是:遇到字符时(如空格、下划线等)拆分。合适欧洲语言,但对于一些亚洲语言来说单词是不用空格分隔。
POST _analyze { "tokenizer": "letter", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
分词结果:[ The, QUICK, Brown, Foxes, jumped, over, the, lazy, dog, s, bone ]
2.3 Lowercase Tokenizer(小写分词器)
分词规则与Letter Tokenizer相似,再转为小写的分词。功能上是 Letter Tokenizer与小写的token filter相结合,但它的效益更高。
POST _analyze { "tokenizer": "lowercase", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
分词结果:[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
2.4 Whitespace Tokenizer (空白分词器)
Whitespace 分析器包含了Whitespace 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5)
2.5 uax_url_email Tokenizer
该分析器与Standard分析器相似,只不过它将url和电子邮件识别为单个term。
POST _analyze { "tokenizer": "uax_url_email", "text": "Email me at [email protected]" }
分词结果:[ Email, me, at, [email protected] ]
2.6 Classic Tokenizer(经典分词器)
经典分词器是基于语法的分词器,适应于英语文档。该分析器有以下特点:
1)根据标点符号拆分单词,并删除标点符号。
2)根据字符拆分的单词,如字符:中划线 -
3)它将电子邮件地址和互联网主机名识别为一个term。
POST _analyze { "tokenizer": "classic", "text": "[email protected] The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
分词结果:[ [email protected], The, 2, QUICK, Brown, Foxes, jumped, over, the, lazy, dog's, bone ]
该分词器接受一个参数,max_token_length最大令牌长度。如果令牌超过此长度,则按max_token_length间隔进行拆分。默认值 255
下面是配置max_token_length长度为5的示例:
PUT my-index-000001 { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "my_tokenizer" } }, "tokenizer": { "my_tokenizer": { "type": "classic", "max_token_length": 5 } } } } }
POST my-index-000001/_analyze { "analyzer": "my_analyzer", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
分词结果:[ The, 2, QUICK, Brown, Foxes, over, the, lazy, dog's, bone ] 丢失了jumped单词,长度为6
三.部分单词的分词器
3.1 N-Gram Tokenizer
3.2 Edge N-Gram Tokenizer
二种分词器比较常用,将再下一篇单独篇讲。
四.结构化文本的分词器
4.1 Keyword Tokenizer (关键字分词器)
Keyword 分析器包含了Keyword 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5)
4.2 Pattern Tokenizer (模式分词器)
Pattern 分析器包含了Pattern 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5)
4.3 Simple Pattern Tokenizer (简单模式分词器)
simple_pattern 简单模式分词器使用Lucene正则表达式,简单模式分词器对比模式分词器功能有限,但通常比模式分词器分词更快。
自定义一个简单模式分析,将文本拆分为3位数字的词
PUT my-index-000001 { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "my_tokenizer" } }, "tokenizer": { "my_tokenizer": { "type": "simple_pattern", "pattern": "[0123456789]{3}" } } } } }
POST my-index-000001/_analyze { "analyzer": "my_analyzer", "text": "fd-786-335-514-x" }
分词结果:[ 786, 335, 514 ]
将文本中拆分为3个数字为一个词,如果文本是:fd-1786-335-514-x 分词结果:[ 178, 335, 514 ]
4.4 Char Group Tokenizer
char_group 分词器可通过要分割的字符进行配置,这通常比运行正则表达式性能更好。
POST _analyze { "tokenizer": { "type": "char_group", "tokenize_on_chars": [ "whitespace", "-", "\n" ] }, "text": "The QUICK brown-fox" }
分词结果:[The,QUICK,brown,fox ]
4.5 Simple Pattern Split Tokenizer (简单模式拆分 分词器)
simple_pattern_split 简单模式拆分分词器使用Lucene正则表达式,对比模式分词器功能有限,但通常比模式分词器分词更快。
自定义一个简单模式拆分分词器,将文本以 _ 下划线来拆分
PUT my-index-000001 { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "my_tokenizer" } }, "tokenizer": { "my_tokenizer": { "type": "simple_pattern_split", "pattern": "_" } } } } }
POST my-index-000001/_analyze { "analyzer": "my_analyzer", "text": "fd_786_335_514_x" }
分词结果:[ fd,786, 335, 514,x ]
4.6 Path Tokenizer (路径分词器)
path_hierarchy 分词器,将文本以路径分隔符进行分割 ,该分词器接收以下重要参数:
1) delimiter 设置分隔符字符。默认值为 /
2) replacement 设置替换字符,默认为delimiter
3)skip :跳过令牌的数量。默认为0
自定义一个路径分析器
PUT my-index-000001 { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "my_tokenizer" } }, "tokenizer": { "my_tokenizer": { "type": "path_hierarchy", "delimiter": "-", "replacement": "/", "skip": 2 } } } } }
POST my-index-000001/_analyze { "analyzer": "my_analyzer", "text": "one-two-three-four-five" }
分词结果:[/three, /three/four, /three/four/five] 使用skip跳过了前面二个令牌
参考官方资料: Tokenizer reference
标签:内置,tokenizer,Tokenizer,分析器,analyzer,Elasticsearch,分词器,my From: https://www.cnblogs.com/MrHSR/p/18113230