Elasticsearch系列---使用中文分词器

前面的案例使用standard、english分词器,是英文原生的分词器,对中文分词支持不太好。中文作为全球最优美、最复杂的语言,目前中文分词器较多,ik-analyzer、结巴中文分词、THULAC、NLPIR和阿里的aliws都是非常优秀的,我们以ik-analyzer作为讲解的重点,其它分词器可以举一反三。

概要

本篇主要介绍中文分词器ik-analyzer的安装使用、自定义词库以及热更新方案。

分词器插件安装

我们Elasticsearch 6.3.1版本为例,集成IK分词器,其他的分词器过程也类似,在ES的bin目录下执行插件安装命令即可:
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.1/elasticsearch-analysis-ik-6.3.1.zip

其中install后面的那个的地址是 elasticsearch-analysis-ik 的github release对应ES版本的下载地址。

插件的版本最好与Elasticsearch版本保持一致,如果Elasticsearch为别的版本,下载对应版本的ik-analyzer插件即可。

安装成功后,ES启动日志就能看到如下信息:
[2019-11-27T12:17:15,255][INFO ][o.e.p.PluginsService] [node-1] loaded plugin [analysis-ik]

IK分词器 基础知识

IK分词器包含两种analyzer,一般用ik_max_word
ik_max_word:会将文本做最细粒度的拆分
ik_smart:会做最粗粒度的拆分

测试分词效果

# ik_max_word分词测试 GET /_analyze { "text": "您好祖国", "analyzer": "ik_smart" } # 响应如下: { "tokens": [ { "token": "您好", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 0 }, { "token": "祖国", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 1 } ] } # ik_max_word分词测试 GET /_analyze { "text": "我和我的祖国", "analyzer": "ik_max_word" } # 响应如下: { "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "和我", "start_offset": 1, "end_offset": 3, "type": "CN_WORD", "position": 1 }, { "token": "的", "start_offset": 3, "end_offset": 4, "type": "CN_CHAR", "position": 2 }, { "token": "祖国", "start_offset": 4, "end_offset": 6, "type": "CN_WORD", "position": 3 } ] } 配置文件

ik插件安装完成后,可以在elasticsearch-6.3.1/config/analysis-ik看到ik的配置文件IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict"></entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords"></entry> <!--用户可以在这里配置远程扩展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用户可以在这里配置远程扩展停止词字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>

该目录下带有许多文件,含义如下:

main.dic ik 原生内置的中文词库,里面有275909条现成的词语

quantifier.dic 量词和单位名称,如个,斤,克,米之类的

suffix.dic 常见后缀词,如江,村,省,市,局等

surname.dic 中国姓氏

stopword.dic 停用词,目前默认的是写的几个英文单词,如and, a, the等

preposition.dic 副词、语气助词,连接词等无实际含义的词语,如却,也,是,否则之类的

6.3.1版本的IK分词器还提供了额外的词库补充文件,extra开头的那几个就是,如extra_main.dic,共收录398716条现有的词语,默认没有使用,有需要可以在配置文件IKAnalyzer.cfg.xml上添加,其他类似。

最重要的是main.dic和stopword.dic。stopword(停用词),分词时会直接被干掉,不会建立在倒排索引中。

自定义词库

创建自定义词库文件mydic.dic,并在IKAnalyzer.cfg.xml的ext_dict属性里加上该文件名,可以在mydic.dic文件里补充自己的词汇,如网络流行词:跪族篮孩。

添加前的分词效果:

GET /forum/_analyze { "text": "跪族篮孩", "analyzer": "ik_max_word" } 响应结果: { "tokens": [ { "token": "跪", "start_offset": 0, "end_offset": 1, "type": "CN_WORD", "position": 0 }, { "token": "族", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 }, { "token": "篮", "start_offset": 2, "end_offset": 3, "type": "CN_WORD", "position": 2 }, { "token": "孩", "start_offset": 3, "end_offset": 4, "type": "CN_CHAR", "position": 3 } ] }

添加词库后:

{ "tokens": [ { "token": "跪族篮孩", "start_offset": 0, "end_offset": 4, "type": "CN_WORD", "position": 0 }, { "token": "跪", "start_offset": 0, "end_offset": 1, "type": "CN_WORD", "position": 1 }, { "token": "族", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 2 }, { "token": "篮", "start_offset": 2, "end_offset": 3, "type": "CN_WORD", "position": 3 }, { "token": "孩", "start_offset": 3, "end_offset": 4, "type": "CN_CHAR", "position": 4 } ] }

能看到完整的“跪族篮孩”,能看到完整的语词出现。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzjds.html