前言
上一篇文章我们介绍了Elasticsearch的一些核心概念,本篇文章我们来看下Elasticsearch的分词器。
正文
Elasticsearch分词器介绍
内置分词器
Elasticsearch 核心功能就是数据检索,首先通过索引将文档写入es。查询分析则主要分为两个步骤:
- 词条化:分词器将输入的文本转为一个个的词条流。
- 过滤:比如停用词过滤器会从词条中除去不相干的词条;另外还有同义词过滤器,小写过滤器等。
Elasticsearch中内置了多种分词器可以供使用。
内置分词器:
分词器 | 作用 |
---|---|
Standard Analyzer | 标准分词器,适用于英语等 |
Simple Analyzer | 简单分词器,基于非字母字符进行分词,单词会被转为小写字母 |
Whitespace Analyzer | 空格分词器,按照空格进行切分 |
Stop Analyzer | 停用词分词器,类似于简单分词器,但是增加了停用词的功能 |
Keyword Analyzer | 关键词分词器,输入文本等于输出文本(不分词) |
Pattern Analyzer | 利用正则表达式对文本进行切分的分词器,支持停用词 |
Language Analyzer | 针对特定语言的分词器 |
Fingerprint Analyzer | 指纹分析仪分词器,通过创建标记进行重复检测 |
中文分词器
在 ES 中,使用比较多的中文分词器是 elasticsearch-analysis-ik,这个是es的一个第三方插件,代码托管在 GitHub上:
安装
它提供了两种使用方式:
第一种:
- 首先打开上述中文分词器地址:https://github.com/medcl/elasticsearch-analysis-ik
- 在 https://github.com/medcl/elasticsearch-analysis-ik/releases 页面找到最新的正式版,下载下来。
- 将下载文件解压。
- 在 es/plugins 目录下,新建ik目录,并将解压后的所有文件拷贝进去。
- 重启 es 服务。
第二种:
1 | ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip |
PS:
需要注意ES版本:
推荐第一种安装方式,我们可以方便的找到配置文件更改配置。
我们如果不下载安装包的话也可以自己编译:
1 | git clone https://github.com/medcl/elasticsearch-analysis-ik |
需要注意版本。
Elasticsearch启动时会提示加载我们插件:
测试
我们创建一个索引来测试一下:
这儿先使用Postman来测试一下,使用PUT请求创建TEST索引。
PUT http://localhost:9200/test
在该索引中进行分词测试:
POST http://localhost:9200/test/_analyze
1 | { |
两种分词模式 ik_max_word
和 ik_smart
, ik_max_word
的分词更细致。
如果我们对 累觉不爱 进行分析呢?
可以看到哪种分法都不太符合我们的期望,我们想把 累觉不爱 看做一个词,该如何处理呢。
这就需要自定义扩展词库。
自定义扩展词库
本地自定义
在 plugins/ik/config 目录下,新建 ext.dic 文件(文件名任意),在该文件中可以配置自定义词库。
在新建文件里添上我们的 累觉不爱 。(如果有多个词,换行写入即可)
同时打开该目录下的 IKAnalyzer.cfg.xml 文件,如下配置
1 |
|
重启ES。
我们再用分词测试,可以看到两种分词模式都能得到我们想要的结果。
远程词库
也可以配置远程词库,远程词库支持热更新(不用重启ES)。
热更新只需要提供一个接口,接口返回扩展词即可。
具体使用方式如下,新建一个 SpringBoot 项目,引入 Web 依赖即可,然后在 resource/static 文件夹下新建 ext.dic ,写入扩展词。
接下来在IKAnalyzer.cfg.xml 文件里配置远程扩展接口。
1 | <properties> |
热更新,主要是响应头的 Last_Modified
或者 ETag
字段发生变化, ik 就会自动重新加载远程依赖扩展词典。
结语
本文介绍了Elasticsearch 分词器,以及如何使用中文分词器,以及分词器的词库配置。