4 ElasticSearch分词器
4.1 内置分词器
ElasticSearch 核心功能就是数据检索,首先通过索引将文档写入es。查询分析主要分为两个步骤:
- 词条化:分词器将输入的文本转化为词条流。
- 过滤:比如停用词过滤器会从词条中去除不相干的词条(的,嗯,啊,呢);另外还有同义词过滤器、小写过滤器等。
ElasticSearch 中内置了多种分词器可以供使用:
分词器 | 作用 |
---|---|
Standard Analyzer | 标准分词器 |
Simple Analyzer | 简单分词器,基于非字母字符进行分词,单词会被转化为小写字母 |
Whitespace Analyzer | 空格分词器 |
Stop Analyzer | 类似于简单分词器,但是增加了停用词的功能 |
Keyword Analyzer | 关键词分词器,输入文本等于输出文本 |
Pattern Analyzer | 利用正则表达式对文本进行切分,支持停用词 |
Language Analyzer | 针对特定语言进行的分词器 |
Fingerprint Analyzer | 指纹分析仪分词器,通过创建标记进行检测 |
4.2 中文分词器
在 Es 中,使用较多的中文分词器是 elasticsearch-analysis-ik,这个是 es 的一个第三方插件,代码托管在 GitHub 上:
4.2.1 安装
- 首先打开分词器官网:https://github.com/medcl/elasticsearch-analysis-ik。
- 在 https://github.com/medcl/elasticsearch-analysis-ik/releases 页面找到最新的正式版,下载下来。我们这里的下载链接是 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip。
- 将下载文件解压。
- 在 es/plugins 目录下,新建 ik 目录,并将解压后的所有文件拷贝到 ik 目录下。
- 重启 es 服务。
4.2.2 测试
- 使用elastic-head:
请求体
POST http://192.168.19.10:9200/first_test/_analyze
{
"analyzer":"ik_smart",
"text":"我想查询中国人"
}
// first_test为索引
{
"tokens": [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "想",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "查询",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "中国人",
"start_offset": 4,
"end_offset": 7,
"type": "CN_WORD",
"position": 3
}
]
}
- 使用kibana测试
请求体
GET first_test/_analyze
{
"analyzer": "ik_max_word",
"text": "我是中国人"
}
analyzer说明:指定分词方式
- ik_max_word:会将文本做最细粒度的拆分
- ik_smart: 会做最粗粒度的拆分
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "中国人",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "中国",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "国人",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 4
}
]
}
4.3 自定义扩展词库
4.3.1 本地自定义
在 es/plugins/ik/config 目录下,新建 ext.dic 文件(文件名任意),在该文件中可以配置自定义的词库。
ext.dic
我是中国人
我是男人
如果有多个词,换行写入新词即可。
然后在 es/plugins/ik/config/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">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>
4.2.3.2 远程词库
也可以配置远程词库,远程词库支持热更新(不用重启 es 就可以生效)。热更新只需要提供一个接口,接口返回扩展词即可。