栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【手把手】ElasticSearch的分词器相关

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【手把手】ElasticSearch的分词器相关

normalization 规范化

不同的分词器对词语的切分也不一样。

character filter 字符过滤器

分词之前的预处理,过滤无用字符

HTML Strip

自定义字符过滤器my_analyzer,作用是过滤数据中的html标签

可使用"escaped_tags":["a"]设置保留不被过滤的标签

Mapping

通过自定义的过滤器,可以将聊天、留言或者弹幕之类的发言根据需求进行屏蔽或替换。

Pattern Replace

通过正则表达式进行数据的替换。

token filter 令牌过滤器

停用词、时态转换、大小写转换、同义词转换、语气词处理等。

可以看到"东邪"检索到"黄药师"的分词,"西毒"检索到"欧阳锋"的分词。

除了自定义的以外,也可以使用ES自带的,比如大小写的转换: 

甚至可以通过自定义脚本动态的控制过滤逻辑,比如将长度大于5的字符串转为全大写:

也可以将一些语句中没有什么意义的语气词等作为停用词不参与检索:

也可以将一些语句中不管有没有意义所有的词都不作为停用词参与检索:

当然也可以手动自定义去设置那些词作为停用词使用:

tokenizer 分词器

其实在上面的过程中一直都在使用分词器,ES中默认的分词器是standard。这个分词器在切词的时候是基于英文的空格去切分,对于英文检索来说简单粗暴,直接好用。

但是对于中文来说,standard也是非常简单粗暴的按照每一个汉字来进行切割,这就很难受了

虽然ES官方提供了很多个分词器,其实对于中文的支持都不好用:

standard:默认分词器,中文会逐字拆分;

pattern:以正则匹配分隔符,把文本拆分成若干词项;

simple pattern:以正则匹配词项,速度比pattern会快一些;

whitespace:以空白符分隔,把文本拆分成若干词项;

既然官方提供的不好用,那就得自己手动来自定义分词器:

char_filter:内置或自定义字符过滤器;

token_filter:内置或自定义token过滤器;

tokenizer:内置或自定义分词器;

值得一提的是my_tokenizer的设置,"pattern": "[,.!;?]"指的是文本会按照[]中有的符号去切割

ES安装IK分词器 

进入到ES的根目录下的插件目录下,下载IK分词器安装包

cd /usr/local/source/elasticsearch-7.10.0/plugins/

mkdir ik

cd ik/

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.0/elasticsearch-analysis-ik-7.10.0.zip

解压IK分词器安装包,重启ES服务

unzip elasticsearch-analysis-ik-7.10.0.zip

rm -rf elasticsearch-analysis-ik-7.10.0.zip

cd ../../bin/

./elasticsearch

指定使用IK分词器查看分词效果:

ik_max_word对文本的分词粒度比较小

ik_smart对文本的分词粒度比较小

根据IK分词器官方提供的文档,提供了两个analyzer和两个tokenizer,都是ik_smart和ik_max_word。

IK文件描述

IKAnalyzer.cfg.xml:IK分词器配置文件

main.dic:IK分词器主词库,也是IK最大的词库,收录了20多万常用的汉语词汇

stopword.dic:英文停用词库,不会建立在倒排索引中

quantifier.dic:特殊词库,计量单位

suffix.dic:特殊词库,行政、地理单位

surname.dic:特殊词库,百家姓

preposition.dic:特殊词库,语气词

当某些文本无法被正确分词,可以自定义分词

vim custom.dic

vim customstopword.dic

vim IKAnalyzer.cfg.xml

重启ES服务

热更新

基于远程词库的热更新

每次在修改完IK分词器的配置文件之后,都需要对ES服务进行重新启动

现在每天网络热门词汇层出不穷,按照词汇更新的速度频率经常重启ES服务显示是不可能的。在新版本中,IK分词器官方可以支持配置远程扩展字典和扩展停止词字典:

并且官方也提供了非常详细的使用步骤说明:

下面就按照官方提供的教程来试试:

先定义好热词文件和停用词文件:

写段代码给读出来看看:

修改IK分词器配置文件:

重启ES服务

验证分词器是否可以远程读词

给热词文件新增一个热词

ES服务在未重启的基础上有读取到新增的热词

基于MySQL数据库的热更新

使用静态文件加远程访问的形式进行热词更新,虽然上手比较简单,但是缺点也非常明显:

1、词库的管理很不方便,必须直接操作磁盘文件,检索页很麻烦;

2、文件的读写没有专门的优化,词汇量大的情况下性能是个问题;

3、多一层接口的调用和网络传输;

IK访问MySQL数据库驱动下载:

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-versions.html
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html

IK分词器下载地址:

https://github.com/medcl/elasticsearch-analysis-ik/(下载未经编译的.tar.gz压缩包)

在加载词典的方法中,添加一个连接数据库,从数据库中查询词语的操作即可。

​​​​​​​

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号