ElasticSearch分词器详解(8大分词器原理与使用示例)

ElasticSearch分词器详解(8大分词器原理与使用示例)-mikechen

ElasticSearch分词器定义

ElasticSearch分词器主要是:将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具。

举一个分词简单的例子,比如:你输入mikechen的互联网架构,会自动帮你分成两个单词,一个是 mikechen,另一个是 互联网架构。

如下图所示:

ElasticSearch分词器详解(8大分词器原理与使用示例)-mikechen

 

ElasticSearch分词器原理

ElasticSearch的分词器由三种组件构成:

ElasticSearch分词器详解(8大分词器原理与使用示例)-mikechen

1.字符过滤器(Character Filters)

character filter 字符过滤器:在一段文本分词之前,先进行预处理,比如:说最常见的就是 过滤html标签。

<div>
<span>mikechen的互联网架构<span>
</div>

如果想获取其中文本:mikechen的互联网架构,你首先需要过滤的就是html标签。

 

2.分词器(Tokenizer)

按照规则切分为单词,比如:英文分词根据空格将单词分开,中文分词按单字隔开。

 

3.过滤加工(Token Filters)

将切分的单词进行加工,比如大写转小写,删除 stopwords,增加同义语等。

 

ElasticSearch分词器流程,如下图所示:

ElasticSearch分词器详解(8大分词器原理与使用示例)-mikechen

从图中可以看出,从上到下依次经过:

  1. 字符过滤:Character Filters;
  2. 分词器:Tokenizer ;
  3. 过滤加工:Token Filters;

这个顺序比较好理解,一个文本进来肯定要:先对文本数据进行处理,再去分词,最后对分词的结果进行过滤。

 

ElasticSearch分词器分类

ElasticSearch常见的内置分词器,有以下几类:

  1. Standard Analyzer:默认分词器,英文按单词词切分,并小写处理;
  2. Simple Analyzer:按照单词切分,符号被过滤, 小写处理;
  3. Stop Analyzer:小写处理,停用词过滤;
  4. Whitespace Analyzer:按照空格切分,不转小写;
  5. Keyword Analyzer:不分词,直接将输入当作输出;
  6. Pattern Analyzer:采用正则表达式分词;
  7. Language:提供了 30 多种常见语言的分词器;
  8. 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

当内置分析器不能满足您的需求时,您可以创建一个自定义分析器。

可以自定义分词器:

ElasticSearch分词器详解(8大分词器原理与使用示例)-mikechen

Character Filter;

Tokenizer;

Token Filter;

然后,通过自组合不同的组件实现。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法