ElasticSearch分词器定义
ElasticSearch分词器主要是:将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具。
举一个分词简单的例子,比如:你输入mikechen的互联网架构,会自动帮你分成两个单词,一个是 mikechen,另一个是 互联网架构。
如下图所示:
ElasticSearch分词器原理
ElasticSearch的分词器由三种组件构成:
1.字符过滤器(Character Filters)
character filter 字符过滤器:在一段文本分词之前,先进行预处理,比如:说最常见的就是 过滤html标签。
<div> <span>mikechen的互联网架构<span> </div>
如果想获取其中文本:mikechen的互联网架构,你首先需要过滤的就是html标签。
2.分词器(Tokenizer)
按照规则切分为单词,比如:英文分词根据空格将单词分开,中文分词按单字隔开。
3.过滤加工(Token Filters)
将切分的单词进行加工,比如大写转小写,删除 stopwords,增加同义语等。
ElasticSearch分词器流程,如下图所示:
从图中可以看出,从上到下依次经过:
- 字符过滤:Character Filters;
- 分词器:Tokenizer ;
- 过滤加工:Token Filters;
这个顺序比较好理解,一个文本进来肯定要:先对文本数据进行处理,再去分词,最后对分词的结果进行过滤。
ElasticSearch分词器分类
ElasticSearch常见的内置分词器,有以下几类:
- Standard Analyzer:默认分词器,英文按单词词切分,并小写处理;
- Simple Analyzer:按照单词切分,符号被过滤, 小写处理;
- Stop Analyzer:小写处理,停用词过滤;
- Whitespace Analyzer:按照空格切分,不转小写;
- Keyword Analyzer:不分词,直接将输入当作输出;
- Pattern Analyzer:采用正则表达式分词;
- Language:提供了 30 多种常见语言的分词器;
- Customer Analyzer:自定义分词器;
下面我分别详解各大分词器的原理及使用示例。
1.标准分词器(Standard Analyzer)
Standard Analyzer:是默认分词器,英文按单词词切分,并小写处理;
使用示例:
下面是未被分词前的英文:
POST _analyze { "analyzer": "standard", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
采用标准分词器,分词后:
the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone
上面的英文按单词来切分,并且做了小写处理。
2.简单分词器(Simple Analyzer)
简单分词器(Simple Analyzer):按照单词切分,符号被过滤, 小写处理。
使用示例:
POST _analyze { "analyzer": "simple", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
采用简单分词器,分词后:
the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone
按照单词来切分,数字、以及符号被过滤了,并小写处理。
3.停用词分词器(Stop Analyzer)
停用词分词器(Stop Analyzer):主要采用小写处理,停用词过滤(the、a、is)。
使用示例:
POST _analyze { "analyzer": "stop", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
采用停用分词器,分词后:
quick, brown, foxes, jumped, over, lazy, dog, s, bone
上面把停用词过滤(the、a、is)过滤了,然后小写处理,比如:The就被过滤了。
4.空白分词器(Whitespace Analyzer)
空白分词器(Whitespace Analyzer):非常容易理解,就是按照空白切分,比如:空格、制表符等,但是不转小写。
使用示例:
POST _analyze { "analyzer": "whitespace", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
采用空白分词器,分词后:
The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone.
按照空白切分,但是不转小写。
5.关键词分析器(Keyword Analyzer)
关键词分析器:不分词,直接将输入当作输出。
使用示例:
POST _analyze { "analyzer": "keyword", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
采用关键词分词器,分词后:
he 2 QUICK Brown-Foxes jumped over the lazy dog's bone.
不分词,直接将输入当作输出。
6.正则表达式分词(Pattern Analyzer)
正则表达式分词:就是采用正则表达式分词。
使用示例:
POST _analyze { "analyzer": "pattern", "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }
采用正则表达式分词器,分词后:
the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone
默认使用的正则表达式是\W+,在匹配\W+的地方切词。
备注:\w包括英文字母、阿拉伯数字、_,\W是任意一个非\w字符,中文字符也算\W。
7.语言分词器(Language)
按照语言来分词,提供了 30 多种常见语言的分词器。
比如:如英语分词器(english),就是某一种常见语言的分词器。
8.Customer Analyzer
当内置分析器不能满足您的需求时,您可以创建一个自定义分析器。
可以自定义分词器:
Character Filter;
Tokenizer;
Token Filter;
然后,通过自组合不同的组件实现。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》