社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

Elasticsearch中的切词怎么实现的?

马哥Linux运维 • 5 年前 • 753 次点击  

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

Analysis与Analyzer分词器

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


Analyzer的组成

分词器是专门处理分词的组件,Analyzer 由三部分组成,分别入下:

1.Character Filters :针对原始文本处理,例如去除html2.Tokenizer:按照原则切分为单词3.Token Filter:将切分的单词进行加工,将单词从大写转换为小写,删除 stopwords,增加同义词


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"       #使用分词器要拆分的文本}
//指定索引字段进行测试AnalyzerPOST bulk_index/_analyze #对指定的索引进行分词器拆分{ "field": "title", #标题 "text": "Mastering Elasticsearch" #要拆分的文本}
//自定义分词器进行测试POST _analyze{ "tokenizer": "standard", "filter": ["lowercase"], "text": "Mastering Elasticsearch"}

Standard Analyzer分词器

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


实例

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

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


Simple Analyzer分词器

simple analyzer分词器按非字母划分,非字母的都被去掉,并且进行转小写处理。



实例

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

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


Stop Analyzer

Stop Analyzer分词器会将文本进行转小写处理,然后过滤掉停用词(the, a, is...)



实例

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

运行结果如下图所示,将所有文本进行了转小写处理,然后过滤掉了停用词 (3 in the)


Whitespace Analyzer分词

Whitespace分词器是按照空格切分,然后不转小写

实例

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

可以看到如下图所示,按照空格拆分后的文本,没有进行小写转换


Keyword Analyzer 分词

keyword即不会进行分词,而是按照源文本信息当做输出



实例

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

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



Pattern Analyzer分词

Patter Analyzer是通过正则表达式进行分词,默认是 \W+ ,非字符的符号进行分割。



实例

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

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

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 过滤掉了

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    versionelastic_node1 analysis-icu 7.4.0


实例


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

标准的_analyze运行结果如下,标准的_analyze分词器是把每个词单独分开了


//icu_analyzer我们再来看icu_analyzer


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

分词结果如下,说的和确实放在了一起,要比其它分词器好多了



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    versionelastic_node1 analysis-icu 7.4.0elastic_node1 analysis-ik  7.4.0

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

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



☆ END ☆

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/64145
 
753 次点击