首页 运维干货Elasticsearch是怎么进行分词的?

Elasticsearch是怎么进行分词的?

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

搜索引擎这篇文章中写道,搜索引擎中有一个分词,切词的步骤,就是使用Analyzer来实现的。这篇文章将对Analyzer分词器进行铺开讲解。

Analysis与Analyzer分词器

  • Analysis – 文本分析是把全文本转换一系列单词 (term/token)的过程,也叫分词
  • Analysis 是 通过 Analyzer来实现的
    • 可使用 Elasticsearch 内置的分析器/或者按需定制化分析器
  • 除了在数据写入时转换词条,匹配 Query 语句时候也需要用相同的分析器对查询语句进行分析

Elasticsearch是怎么进行分词的?插图

Analyzer的组成

  • 分词器是专门处理分词的组件,Analyzer 由三部分组成,分别入下:
  1. Character Filters :针对原始文本处理,例如去除html
  2. Tokenizer:按照原则切分为单词
  3. Token Filter:将切分的单词进行加工,将单词从大写转换为小写,删除 stopwords,增加同义词

Elasticsearch是怎么进行分词的?插图1

Elasticsearch内置的分词器

  • Standard Analyzer:默认分词器,按词切分,小写处理
  • Simple Analyzer:按照非字母切分(符号被过滤),小写处理
  • Stop Analyzer:小写处理,停用词过滤(the, a, is)
  • Whitespace Analyzer:按照空格切分,不转小写
  • Keyword Analyzer:不分词,直接将输入当做输出
  • Patter Analyzer:正则表达式,默认 \W+ (非字符分割)
  • Language:提供共了30多种常见语言的分词器
  • Customer Analyzer:自定义分词器

_analyzer API简单介绍

关于Analyzer的几种用法如下

//指定analyzer进行测试
GET _analyze
{
  "analyzer": "standard",                           #指定Analyzer分词器
  "text" : "Mastering Elasticsearch, elasticsearch in Action"       #使用分词器要拆分的文本
}

//指定索引字段进行测试Analyzer
POST bulk_index/_analyze                            #对指定的索引进行分词器拆分
{   
  "field": "title",                                 #标题
  "text": "Mastering Elasticsearch"                 #要拆分的文本
}

//自定义分词器进行测试
POST _analyze
{
  "tokenizer": "standard",                          
  "filter": ["lowercase"],
  "text": "Mastering Elasticsearch"
}

Standard Analyzer分词器

Elasticsearch是怎么进行分词的?插图2
上面又讲到 Standard Analyzer是Elasticsearch默认的分词器,按词切分,主要是按照词汇空格去切分,然后转小写处理

实例

//standard
GET _analyze
{
  "analyzer": "standard",                               //指定分词器
  "text": "3 running Quick brown-foxes leap over lazy dogs in the summer evening."          //要拆分的文本
}

结果如下
运行结果可以看到,我们的text都被拆分成了一个个单词,并进行转小写处理
Elasticsearch是怎么进行分词的?插图3

Simple Analyzer分词器

simple analyzer分词器按非字母划分,非字母的都被去掉,并且进行转小写处理。
Elasticsearch是怎么进行分词的?插图4
实例

//Simple
GET _analyze
{
  "analyzer": "simple",
  "text": "3 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

上面的测试,下面效果可以看到,Simple会把非字母的都去掉,3 running 中的 3 已经被去掉了,然后再进行了一个转小写处理
Elasticsearch是怎么进行分词的?插图5

Stop Analyzer

Stop Analyzer分词器会将文本进行转小写处理,然后过滤掉停用词(the, a, is…)
Elasticsearch是怎么进行分词的?插图6

实例

//Stop
GET _analyze
{
  "analyzer": "stop",
  "text": "3 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

运行结果如下图所示,将所有文本进行了转小写处理,然后过滤掉了停用词 (3 in the)
Elasticsearch是怎么进行分词的?插图7

Whitespace Analyzer分词

Whitespace分词器是按照空格切分,然后不转小写
Elasticsearch是怎么进行分词的?插图8

实例

//whitespace
GET _analyze
{
  "analyzer": "whitespace",
  "text": "中华 人民 共 和国 3 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

可以看到如下图所示,按照空格拆分后的文本,没有进行小写转换
Elasticsearch是怎么进行分词的?插图9

Keyword Analyzer 分词

keyword即不会进行分词,而是按照源文本信息当做输出
Elasticsearch是怎么进行分词的?插图10

实例

//Keyword
GET _analyze
{
  "analyzer": "keyword",
  "text": "中华 人民 共 和国 3 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

可以看到如下图所示,没有拆分字符,也没有转小写处理和停用词过滤,而是按照源文件信息输出
Elasticsearch是怎么进行分词的?插图11

Pattern Analyzer分词

Patter Analyzer是通过正则表达式进行分词,默认是 \W+ ,非字符的符号进行分割。
Elasticsearch是怎么进行分词的?插图12

实例

//Pattern
GET _analyze
{
  "analyzer": "pattern",
  "text": "中华 人民 共 和国 3 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

可以看到如下图所示,pattern analyzer对非字符的符号进行了分割,然后进行了转小写处理,我们文本中的 中华 人民 共 和国brown-foxes中的 – 连接符,不是字符,所以pattern对他们进行了分割。

Elasticsearch是怎么进行分词的?插图13

Language Analyzer

Elasticsearch为不同国家语言的输入提供了Language Analyzer的一个分词器
我们可以在其中指定分词的语言来进行分词

实例

//Language
GET _analyze
{
  "analyzer": "english",
  "text": "3 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

如下图所示运行结果,由 english 来进行分词后,把 running 转换成了 run,然后foxes转换为了 foxevening转换为了 even,还把所有的词转换为了小写,并有停用词过滤功能,把 in the 过滤掉了

Elasticsearch是怎么进行分词的?插图14

ICU Analyzer

ICU Analyzer需要通过插件的形式获取
ICU ANalyzer提供了 Unicode 的支持,更好的支持亚洲语言,所以在中文分词上ICU Analyzer用的比较普遍
./elasticsearch-plugin install analysis-icu
安装完成后重启Elasticsearch后查看插件

curl -XGET 'http://192.168.31.215:9201/_cat/plugins?v'
name          component    version
elastic_node1 analysis-icu 7.4.0

Elasticsearch是怎么进行分词的?插图15

实例

//我们先看标准的 _analyze
GET _analyze
{
  "analyzer": "standard",
  "text": "他说的却是在理!"
}

标准的_analyze运行结果如下,标准的_analyze分词器是把每个词单独分开了
Elasticsearch是怎么进行分词的?插图16

//icu_analyzer我们再来看icu_analyzer
GET _analyze
{
  "analyzer": "icu_analyzer",
  "text": "他说的确实在理!"
}

分词结果如下,说的和确实放在了一起,要比其它分词器好多了
Elasticsearch是怎么进行分词的?插图17

IK 中文分词器

IK中文分词器支持自定义词库,支持热更新分词字典
IK分词器项目地址:https://github.com/medcl/elasticsearch-analysis-ik
IK分词器版本地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

1.安装IK分词器

方法一在线安装:
#使用elastic用户来进行安装
#安装的IK分词器版本要和Elasticsearch版本一致
[elastic@elastic elastic_node1]$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.0/elasticsearch-analysis-ik-7.4.0.zip

方法二离线安装:
[elastic@elastic elastic_node1]$ mkdir plugins/analysis-ik
[elastic@elastic elastic_node1]$ cd plugins/analysis-ik
#然后将下载的zip包解压到analysis-ik目录即可
[elastic@elastic analysis-ik]$ unzip -o  elasticsearch-analysis-ik-7.4.0.zip -d /usr/local/elastic_node1/plugins/analysis-ik/

2.安装完成后需要重启Elasticsearch
重启过程略

3.查看插件

[root@elastic elastic_node1]# curl -XGET -u elastic:26tBktGolYCyZD2pPISW  'http://192.168.31.215:9201/_cat/plugins?v'
name          component    version
elastic_node1 analysis-icu 7.4.0
elastic_node1 analysis-ik  7.4.0

4.实例
自 IK分词插件v5.0.0 起移除名为 ik 的analyzer和tokenizer,请分别使用 ik_smart 和 ik_max_word。

//ik_max_word
GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "他说的确实在理!"
}

//ik_smart
GET _analyze
{
  "analyzer": "ik_smart",
  "text": "他说的确实在理!"
}

Elasticsearch是怎么进行分词的?插图18

本文链接:https://www.yunweipai.com/34589.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部