这篇博客主要讲:分词器概念
、ES内置分词器
、ES中文分词器
。html
Analysis
: 文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词。Analysis是经过Analyzer来实现的。git
当一个文档被索引时,每一个Field均可能会建立一个倒排索引(Mapping能够设置不索引该Field)。github
倒排索引的过程就是将文档经过Analyzer分红一个一个的Term,每个Term都指向包含这个Term的文档集合。正则表达式
当查询query时,Elasticsearch会根据搜索类型决定是否对query进行analyze,而后和倒排索引中的term进行相关性查询,匹配相应的文档。算法
分析器(analyzer)都由三种构件块组成的:character filters
, tokenizers
, token filters
。数组
1) character filter 字符过滤器
app
在一段文本进行分词以前,先进行预处理,好比说最多见的就是,过滤html标签(<span>hello<span> --> hello),& --> and(I&you --> I and you)
2) tokenizers 分词器
机器学习
英文分词能够根据空格将单词分开,中文分词比较复杂,能够采用机器学习算法来分词。elasticsearch
3) Token filters Token过滤器
ide
将切分的单词进行加工。大小写转换(例将“Quick”转为小写),去掉词(例如停用词像“a”、“and”、“the”等等),或者增长词(例如同义词像“jump”和“leap”)。
三者顺序
:Character Filters--->Tokenizer--->Token Filter
三者个数
:analyzer = CharFilters(0个或多个) + Tokenizer(刚好一个) + TokenFilters(0个或多个)
Standard Analyzer - 默认分词器,按词切分,小写处理
Simple Analyzer - 按照非字母切分(符号被过滤), 小写处理
Stop Analyzer - 小写处理,停用词过滤(the,a,is)
Whitespace Analyzer - 按照空格切分,不转小写
Keyword Analyzer - 不分词,直接将输入看成输出
Patter Analyzer - 正则表达式,默认\W+(非字符分割)
Language - 提供了30多种常见语言的分词器
Customer Analyzer 自定义分词器
PUT new_index { "settings": { "analysis": { "analyzer": { "std_folded": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "asciifolding" ] } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "std_folded" #指定分词器 }, "content": { "type": "text", "analyzer": "whitespace" #指定分词器 } } } }
这里讲解下常见的几个分词器:Standard Analyzer
、Simple Analyzer
、whitespace Analyzer
。
1)示例
standard 是默认的分析器。它提供了基于语法的标记化(基于Unicode文本分割算法),适用于大多数语言
POST _analyze { "analyzer": "standard", "text": "Like X 国庆放假的" }
运行结果
2)配置
标准分析器接受下列参数:
_english_
或 包含中止词列表的数组,默认是 _none_
PUT new_index { "settings": { "analysis": { "analyzer": { "my_english_analyzer": { "type": "standard", #设置分词器为standard "max_token_length": 5, #设置分词最大为5 "stopwords": "_english_" #设置过滤词 } } } } }
simple 分析器当它遇到只要不是字母的字符,就将文本解析成term,并且全部的term都是小写的。
POST _analyze { "analyzer": "simple", "text": "Like X 国庆放假 的" }
运行结果
POST _analyze { "analyzer": "whitespace", "text": "Like X 国庆放假 的" }
返回
中文的分词器如今你们比较推荐的就是 IK分词器
,固然也有些其它的好比 smartCN、HanLP。
这里只讲如何使用IK作为中文分词。
开源分词器 Ik 的github:https://github.com/medcl/elasticsearch-analysis-ik
注意
IK分词器的版本要你安装ES的版本一致,我这边是7.1.0那么就在github找到对应版本,而后启动命令
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.1.0/elasticsearch-analysis-ik-7.1.0.zip
运行结果
注意
安装完插件后需重启Es,才能生效。
IK有两种颗粒度的拆分:
ik_smart
: 会作最粗粒度的拆分
ik_max_word
: 会将文本作最细粒度的拆分
1) ik_smart 拆分
GET /_analyze { "text":"中华人民共和国国徽", "analyzer":"ik_smart" }
运行结果
2)ik_max_word 拆分
GET /_analyze { "text":"中华人民共和国国徽", "analyzer":"ik_max_word" }
运行结果
三、Elasticsearch拼音分词和IK分词的安装及使用
我相信,不管从此的道路多么坎坷,只要抓住今天,早晚会在奋斗中尝到人生的甘甜。抓住人生中的一分一秒,赛过虚度中的一月一年!(15)