《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.5.中文分词器/ IK分词器/ pinyin分词器(中) https://developer.aliyun.com/article/1229400
pinyin 分词器
首先,下载 pinyin 分词器插件:https://github.com/medcl/elasticsearch-analysis-pinyin
本地编译并打包后,上传到 ES 安装目录下的 plugins 下并解压,然后重启 ES,重启后查看是否安装成功:
./bin/elasticsearch-plugin list ik pinyin
可以看到 pinyin 插件已经安装成功:
PUT /analyze_chinese_pinyin/ { "settings" : { "analysis" : { "analyzer" : { "pinyin_analyzer" : { "tokenizer" : "my_pinyin" } }, "tokenizer" : { "my_pinyin" : { "type" : "pinyin", "keep_separate_first_letter" : false, "keep_full_pinyin" : true, "keep_original" : true, "limit_first_letter_length" : 16, "lowercase" : true, "remove_duplicated_term" : true } } } } } GET /analyze_chinese_pinyin/_analyze { "text": ["南京市长江大桥"], "analyzer": "pinyin_analyzer" } #返回结果 { "tokens" : [ { "token" : "nan", }, { "token" : "南京市长江大桥", }, { "token" : "njscjdq", }, { "token" : "jing", }, { "token" : "shi", }, { "token" : "chang", }, { "token" : "jiang", }, { "token" : "da", }, { "token" : "qiao", } ] } #设置测试数据 POST analyze_chinese_pinyin/_bulk {"index":{"_id":1}} {"name":"南京市长江大桥"} #根据拼音查询 njscjdq POST analyze_chinese_pinyin/_search { "query": { "match": { "name.pinyin": "njscjdq" } } } #返回结果 "hits" : [ { "_source" : { "name" : "南京市长江大桥" } } ] #通过 nan 查询 POST analyze_chinese_pinyin/_search { "query": { "match": { "name.pinyin": "nan" } } } #返回结果 "hits" : [ { "_source" : { "name" : "南京市长江大桥" } } ]
因为 南京长江大桥 经过 pinyin_analyzer 分词器分词后,包含 nan 和 njscjdq 所以都能匹配查询到记录。
Smart Chinese Analysis
参考:https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-smartcn.html
Smart Chinese Analysis 插件将 Lucene 的智能中文分析模块集成到 Elasticsearch 中,
提供了中文或中英文混合文本的分析器。该分析器使用概率知识来找到简体中文文本的最佳分词。文本首先被分解成句子,然后每个句子被分割成单词。
此插件必须在每个节点上安装且需要重启才生效,此插件提供了 smartcn 分析器、smartcn_tokenizer tokenizer 等。
/bin/elasticsearch-plugin install analysis-smartcn -> Installing analysis-smartcn -> Downloading analysis-smartcn from elastic [=================================================] 100% -> Installed analysis-smartcn
同样执行查看已安装插件的列表:
./bin/elasticsearch-plugin list analysis-smartcn ik pinyin
安装成功后,需要重启 ES 以便插件生效:
POST _analyze { "analyzer": "smartcn", "text":"南京市长江大桥" } #返回结果 { "tokens" : [ { "token" : "南京市", }, { "token" : "长江", }, { "token" : "大桥", } ] }
hanlp 中文分词器
安装插件:
./bin/elasticsearch-plugin install https://github.com/KennFalcon/elasticsearch-analysis-hanlp/releases/download/v7.10.0/elasticsearch-analysis-hanlp-7.10.0.zip
安装后查看插件安装情况,安装成功后也同样需要重启 ES:
./bin/elasticsearch-plugin list analysis-hanlp analysis-smartcn ik pinyin GET _analyze { "text": "南京市长江大桥", "tokenizer": "hanlp" } #返回结果 { "tokens" : [ { "token" : "南京市", }, { "token" : "长江大桥", } ] }
小结
通过以上比较,没有哪一种分词器能处理各种不同的场景需求,在实际业务开发中,要根据不同的业务场景、不同的字段设置不同的分词器,以满足实际业务的需要。
创作人简介:
李增胜,Elasticsearch 认证工程师、PMP 项目管理认证,现就职于汇通达网络股份有限公司,任产业交易平台交易域技术经理,从事微服务架构、搜索架构方向开发与管理工作。技术关注:电商、产业互联网等领域。