Elasticsearch学习笔记(3)

前言

上一篇文章我们介绍了Elasticsearch的一些核心概念,本篇文章我们来看下Elasticsearch的分词器。

正文

Elasticsearch分词器介绍

内置分词器

Elasticsearch 核心功能就是数据检索,首先通过索引将文档写入es。查询分析则主要分为两个步骤:

  1. 词条化:分词器将输入的文本转为一个个的词条流。
  2. 过滤:比如停用词过滤器会从词条中除去不相干的词条;另外还有同义词过滤器,小写过滤器等。

Elasticsearch中内置了多种分词器可以供使用。

内置分词器:

分词器作用
Standard Analyzer标准分词器,适用于英语等
Simple Analyzer简单分词器,基于非字母字符进行分词,单词会被转为小写字母
Whitespace Analyzer空格分词器,按照空格进行切分
Stop Analyzer停用词分词器,类似于简单分词器,但是增加了停用词的功能
Keyword Analyzer关键词分词器,输入文本等于输出文本(不分词)
Pattern Analyzer利用正则表达式对文本进行切分的分词器,支持停用词
Language Analyzer针对特定语言的分词器
Fingerprint Analyzer指纹分析仪分词器,通过创建标记进行重复检测

中文分词器

在 ES 中,使用比较多的中文分词器是 elasticsearch-analysis-ik,这个是es的一个第三方插件,代码托管在 GitHub上:

安装

它提供了两种使用方式:

第一种:

  1. 首先打开上述中文分词器地址:https://github.com/medcl/elasticsearch-analysis-ik
  2. https://github.com/medcl/elasticsearch-analysis-ik/releases 页面找到最新的正式版,下载下来。
  3. 将下载文件解压。
  4. 在 es/plugins 目录下,新建ik目录,并将解压后的所有文件拷贝进去。
  5. 重启 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
2
3
4
5
6
git clone https://github.com/medcl/elasticsearch-analysis-ik
cd elasticsearch-analysis-ik
git checkout tags/{version}
mvn clean
mvn compile
mvn package

需要注意版本。

Elasticsearch启动时会提示加载我们插件:

测试

我们创建一个索引来测试一下:

这儿先使用Postman来测试一下,使用PUT请求创建TEST索引。

PUT http://localhost:9200/test

在该索引中进行分词测试:

POST http://localhost:9200/test/_analyze

1
2
3
4
{
"analyzer":"ik_max_word",
"text":"美国留给伊拉克的是个烂摊子吗"
}

两种分词模式 ik_max_wordik_smartik_max_word 的分词更细致。

如果我们对 累觉不爱 进行分析呢?

可以看到哪种分法都不太符合我们的期望,我们想把 累觉不爱 看做一个词,该如何处理呢。

这就需要自定义扩展词库。

自定义扩展词库

本地自定义

在 plugins/ik/config 目录下,新建 ext.dic 文件(文件名任意),在该文件中可以配置自定义词库。

在新建文件里添上我们的 累觉不爱 。(如果有多个词,换行写入即可)

同时打开该目录下的 IKAnalyzer.cfg.xml 文件,如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

重启ES。

我们再用分词测试,可以看到两种分词模式都能得到我们想要的结果。

远程词库

也可以配置远程词库,远程词库支持热更新(不用重启ES)。

热更新只需要提供一个接口,接口返回扩展词即可。

具体使用方式如下,新建一个 SpringBoot 项目,引入 Web 依赖即可,然后在 resource/static 文件夹下新建 ext.dic ,写入扩展词。

接下来在IKAnalyzer.cfg.xml 文件里配置远程扩展接口。

1
2
3
4
5
6
7
8
9
10
11
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://localhost:8080/ext.dic</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

热更新,主要是响应头的 Last_Modified 或者 ETag 字段发生变化, ik 就会自动重新加载远程依赖扩展词典。

结语

本文介绍了Elasticsearch 分词器,以及如何使用中文分词器,以及分词器的词库配置。




-------------文章结束啦 ~\(≧▽≦)/~ 感谢您的阅读-------------

您的支持就是我创作的动力!

欢迎关注我的其它发布渠道