Elasticsearch内置了不少分词器,但大多数是针对英文的分词器.下面比较一下系统默认的分词器和经常使用中文分词器的区别及使用方法html
系统默认分词器
1. standard分词器
默认分析仪,若是未指定则使用该分词器, 它会将英文词汇单元转换成小写形式,并去除停用词和标点符号. 支持中文采用的方法为单字切分java
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.htmlgit
2. simple分词器
首先会经过非字母字符来分割文本信息,而后将词汇单元统一为小写形式,该分析器会去掉数字类型的字符.对中文不进行分词github
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-simple-analyzer.html正则表达式
3. stop 分词器
在simple分词器的基础上增长了去除英文经常使用单词(如the, a 等).也能够自定义要去除的经常使用单词.对中文不进行分词app
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stop-analyzer.htmlelasticsearch
4. whitespace 分词器
仅仅是去除空格,对字符没有lowcase化.不对生成的词汇单元进行其余的规范化处理.对中文不进行分词maven
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-whitespace-analyzer.htmlide
5. keyword分词器
Keyword分词器把整个输入做为一个单独词汇单元(也就是对英文不进行分词),方便特殊类型的文本进行索引和检索.针对邮政编码,地址等文本信息使用关键词分词器进行索引项创建很是方便.对中文不进行分词工具
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html
6. pattern分词器
使用正则表达式进行分词.不支持中文
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-analyzer.html
7. language分词器
一个用于解析特殊语言文本的analyzer集合。( arabic,armenian, basque, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english, finnish, french,galician, german, greek, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian,persian, portuguese, romanian, russian, sorani, spanish, swedish, turkish, thai.)没有中文
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html
8. fingerprint分词器
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-fingerprint-analyzer.html
中文分词器
1. ik-analyzer
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.
安装
cd elasticsearch-6.4.2 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip
ik带有两个分词器
ik_max_word: 细粒度分词, 会将文本作最细粒度的拆分.
ik_smart: 粗粒度分词, 会将文本作最粗粒度的拆分.
POST _analyze { "analyzer": "ik_max_word", "text": "中华人民共和国国歌" } 结果 [中华人民共和国, 中华人民, 中华, 华人, 人民共和国, 人民, 共和国, 共和, 国, 国歌]
POST _analyze { "analyzer": "ik_smart", "text": "中华人民共和国国歌" } 结果 [中华人民共和国, 国歌]
2. pinyin分词器
将中文转换为拼音,将拼音进行分词
POST _analyze { "analyzer": "pinyin", "text": "李小龙" } 结果 [li, xiao, logn, lxl]
下载后解压缩
elasticsearch-analysis-pinyin下载网址:github.com/medcl/elast…
查看修改pom.xml文件中对应elasticsearch的版本号
<elasticsearch.version>6.4.2</elasticsearch.version>
在解压缩的文件夹目录下,执行mvn打包命令(没有maven的自行下载):
mvn package
生成target目录, 进入target/releases目录,解压其中的zip压缩包,有以下文件
将这三个文件拷贝到es安装目录下的plugins
目录下的pinyin
文件夹中(pinyin文件夹须要本身建立,能够任意命名).
重启elasticsearch,拼音分词器到此安装完成。
PUT /pinyinTestIndex { "index" : { "analysis" : { "analyzer" : { "default" : { //默认分词器使用ik分词器 "tokenizer" : "ik_max_word" }, "pinyin_analyzer" : { //自定义拼音分词器 "tokenizer" : "my_pinyin" } }, "tokenizer" : { "my_pinyin" : { //拼音分词器配置 "type" : "pinyin", "keep_first_letter":true, "keep_separate_first_letter" : false, "keep_full_pinyin" : false, "limit_first_letter_length" : 20, "lowercase" : true, "keep_none_chinese":false } } } } } keep_first_letter:包含首字母,例如:刘德华> ldh,default:true。 keep_separate_first_letter:将字母分割,例如:刘德华> l,d,h,default:false。 keep_full_pinyin:包含全拼拼音,例如:刘德华> [ liu,de,hua],default:true。 limit_first_letter_length:设置first_letter结果的最大长度,default:16。 lowercase:小写非中文字母,default:true。 keep_none_chinese: 不在结果中保留非中文字母或数字,default:true。
所以,个人拼音分词器会有以下效果 -- 若是字符串为刘德华,通过分词后成为ldh,若是字符串为刘德华A,通过分词后成为ldha,若是字符串为刘德华1,通过分词后成为ldh1。此种分词效果知足咱们的业务需求,固然还有其余的配置可选,来知足不一样的业务需求。其余配置可参考elasticsearch-analysis-pinyin下载网址中的README.md
选项进行选取。
POST /pinyinTestIndex/dev/_mapping { "dev": { "properties": { "name": { //name字段 "type": "text", //字符串类型支持分词 "analyzer": "pinyin_analyzer", //使用拼音分词 "fields": { //包含的另外一种不分词效果 "keyword": { "type": "keyword", "ignore_above": 256 } } } } } }