上课我们介绍了倒排索引,在里面提到了分词的概念,分词器就是用来分词的。
分词器是ES中专门处理分词的组件,英文为Analyzer,定义为:从一串文本中切分出一个一个的词条,并对每个词条进行标准化。它由三部分组成,
- Character Filters:分词之前进行预处理,比如去除html标签
- Tokenizer:将原始文本按照一定规则切分为单词
- Token Filters:针对Tokenizer处理的单词进行再加工,比如转小写、删除或增新等处理,也就是标准化
预定义的分词器
ES自带的分词器有如下:
- Standard Analyzer
- 默认分词器
- 按词切分,支持多语言
- 小写处理
- 支持中文采用的方法为单字切分
- Simple Analyzer
- 按照非字母切分
- 小写处理
- Whitespace Analyzer
- 空白字符作为分隔符
- Stop Analyzer
- 相比Simple Analyzer多了去除请用词处理
- 停用词指语气助词等修饰性词语,如the, an, 的, 这等
- Keyword Analyzer
- 不分词,直接将输入作为一个单词输出
- Pattern Analyzer
- 通过正则表达式自定义分隔符
- 默认是\W+,即非字词的符号作为分隔符
ES默认对中文分词是一个一个字来解析,这种情况会导致解析过于复杂,效率低下,所以目前有几个开源的中文分词器,来专门解决中文分词,其中常用的叫IK
中文分词
- 难点
- 中文分词指的是将一个汉字序列切分为一个一个的单独的词。在英文中,单词之间以空格作为自然分界词,汉语中词没有一个形式上的分界符
- 上下文不同,分词结果迥异,比如交叉歧义问题
- 常见分词系统
- IK:实现中英文单词的切分,可自定义词库,支持热更新分词词典
- jieba:支持分词和词性标注,支持繁体分词,自定义词典,并行分词等
- Hanlp:由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用
- THUAC:中文分词和词性标注
安装配置ik中文分词插件
# 在Elasticsearch安装目录下执行命令,然后重启es
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
# 如果由于网络慢,安装失败,可以先下载好zip压缩包,将下面命令改为实际的路径,执行,然后重启es
bin/elasticsearch-plugin install file:///path/to/elasticsearch-analysis-ik-6.3.0.zip
ik两种分词模式ik_max_word 和 ik_smart 什么区别?
- ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
- ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
你也可以直接上IK的github的教程来配置,https://github.com/medcl/elasticsearch-analysis-ik。
安装完后,修改elasticsearch.yml文件,把ik分词器设置为es的默认分词器
index.analysis.analyzer.default.type:ik
重启es,注意es中的每个节点都要进行上述配置。