Elasticsearch 如何自定义扩展词库?

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Elasticsearch 实战项目中势必会用到中文分词,而中文分词器的选型包含但不限于如下开源分词器:IK 分词器https://github.com/medcl/elasticsearch-analysis-ikAnsj 分词器https://github.com/NLPchina/elasticsearch-analysis-ansjjieba 分词器https://github.com/sing1ee/elasticsearch-jieba-plugin清华大学 thulac 分词器https://github.com/microbun/elastics

还有华为的未开源的:泊松分词器;阿里未开源的:达摩院定制的分词器。


但,不论选择何种分词器,尤其选型开源分词器,到头来都会遇到:已有词库词典数据无法满足定制化项目需求的情况。


那么,实战中如何解决词典扩展问题呢?本文给出实战思路。


1 认知前提

1.1 分词器选型

本文验证使用的 IK 分词器,其他分词器原理相同。


1.2 新扩充词典对历史索引数据无效

由于:分段的不可修改性,新扩展的词典只对扩展后的那一刻之后的写入数据生效。


如果想让历史索引数据生效,需要重新导入数据或者 reindex 将历史索引迁移到新索引。迁移过程中,可以以别名统一对外服务,以确保用户无感知。


2、新词库从哪里来?

2.1 平时积累或算法团队提供的新词库

这个得靠平时项目的积累、互联网搜集、或者公司算法团队自研新词发现算法。


比如:微信文章分词发现的新词库如下:

image.png

自然语言处理 NLP 领域新词发现是个领域和方向,感兴趣的可以搜索查看“新词发现”相关资料。

推荐阅读:https://spaces.ac.cn/archives/4256

2.2 互联网开源词库

仅以搜狗输入法为例,有个“细胞词库”的概念。

image.png

搜狗官方释义如下:


系统词库——输入法自带的词库,为您的输入提供基本的字词。


细胞词库——全部由网友来贡献。搜狗鼓励用户积极上传或编辑细胞词库,为中文输入的演变做出自己的贡献。


https://pinyin.sogou.com/help.php?list=6&q=3


细胞词库样例截图如下,各分类词库均支持下载。

image.png

2.3 爬取特定领域词库

比如:“亚硝酸盐”领域,非专业不知道有哪些关键词,客户也不一定提供。

通过学术搜索,找相关文章的关键词,下载后去重导入词典就是很好的扩展方案。

仅以万方数据库为例:

image.png

3 静态扩展词典

静态指:在 Elasticsearch 集群部署完毕后,安装 ik 分词器的时候,不仅使用 ik 开源自带的分词器,而且加上满足自身项目要求的词典。


这种词典的添加或更新,必须重新启动 Elasticsearch 才能生效。


针对搜狗词库为例的互联网词库的使用步骤如下:


3.1 步骤 1:下载词库

若需全量,爬虫实现即可。

image.png

全量词库的地址:

https://pinyin.sogou.com/dict/cate/index/403

3.2 步骤 2:将.scel 转为 txt 文本格式

可以借助 python 脚本实现,或者借助第三方工具,如:深蓝词库转换工具。

参考如下:

image.png

3.3 步骤 3:将生成的文本文件去重

借助:shell 脚本 sort、uniq 即可实现,比如生成sogou_ext.dic文件。

3.4 步骤 4:将生成待添加词库添加到 IK 配置文件中

image.png如上修改对应的IK 插件配置文件地址:

./config/analysis-ik/IKAnalyzer.cfg.xml

3.5 步骤 5:重新启动 Elasticsearch 节点

对比一下,更新词库前和更新词库后的分词结果如下:

image.png

image.png

显然,更新词库后,“云南省红河哈尼族彝族自治州”作为一个完整的词分词了,说明更新词库已生效。


4 动态扩展词典

以 IK 分词器为例,采用修改 IK 插件源码,动态词库结合更新 Mysql 库表实现。


由于类似方案已经非常成熟,这里只给出实现思路。


4.1 步骤 1:下载 IK 插件源码

4.2 步骤 2:修改 IK 插件源码

加上 Mysql 驱动以及相关更新实现操作。


在elasticsearch安装目录config目录下,需要在jdbc-reload.properties 配置文件中配置更新热词的mysql的地址。

image.png

数据库连接要加上时间格式和ssl的声明,否则会报时间格式的错误和数据库连接缺少ssl证书的错误。


jdbc:mysql://192.168.1.15:3306/sogou_ext?useSSL=false&serverTimezone=GMT

4.3 步骤 3:将修改后源码重新打包

4.4 步骤 4:原有插件包替换为新插件包

将打包后插件更新到 Elasticsearch 插件部署位置


插件位置为:


./plugins/analysis-ik/elasticsearch-analysis-ik-7.13.0.jar

如下配置是最容易忽略和出错的地方,强调一下:


将mysql驱动的jar包复制到系统java目录的jre/lib/ext文件夹中。


修改/jre/lib/security/java.policy文件在grant下添加如下两行代码:


permission java.lang.RuntimePermission createClassLoader;

permission java.lang.RuntimePermission getClassLoader;

4.5 步骤 5:重启 Elasticsearch 节点,以使新插件生效

重启后,动态添加方式可以通过脚本更新 Mysql 数据库表的方式实现。Elasticsearch 会动态捕获 Mysql 的更新,以实现动态添加词库。


再次强调一下:词库只对新索引数据生效,若想对历史索引生效,需要重新导入数据或者借助 reindex 实现。


5 小结

本文以实战环节经常遇到的词库、词典更新问题出发,从新词库的三种来源方式、静态添加词库、动态添加词库三个问题展开探讨,目的是给大家一些实战参考思路。


本文仅是抛砖引玉,相信词库的获取和更新肯定还有更多、更优秀的实现方式。


欢迎大家留言交流下自己的词库更新实现方式。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
7月前
|
自然语言处理 API 索引
ElasticSearch自定义pinyin和ik分词库
ElasticSearch自定义pinyin和ik分词库
79 0
|
2月前
|
自然语言处理 搜索推荐 应用服务中间件
Elasticsearch 外部词库文件更新
Elasticsearch 外部词库文件更新
32 1
|
2月前
|
自然语言处理
Elasticsearch+IK+pinyin自定义分词器
Elasticsearch+IK+pinyin自定义分词器
29 0
|
6月前
|
索引
Elasticsearch集群的索引清理及自定义清理
Elasticsearch集群的索引清理及自定义清理
112 1
|
8月前
|
消息中间件 监控 NoSQL
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash 2
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash
158 0
|
8月前
|
存储 算法 数据可视化
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash 1
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash
54 0
|
10月前
|
存储 运维 监控
大数据数据存储的搜索引擎Elasticsearch的集群运维的集群扩展
Elasticsearch是一个可扩展的搜索引擎,可以在同一个集群中部署多个Elasticsearch节点,以提高性能和可用性。
56 0
|
10月前
|
JSON 数据格式 Python
基于elasticsearch的自定义业务告警的设计思路
基于elasticsearch的自定义业务告警的设计思路
158 0
|
11月前
|
自然语言处理 安全 关系型数据库
白话Elasticsearch30-IK中文分词之热更新IK词库
白话Elasticsearch30-IK中文分词之热更新IK词库
127 0
|
11月前
|
自然语言处理 索引
白话Elasticsearch29-IK中文分词之IK分词器配置文件+自定义词库
白话Elasticsearch29-IK中文分词之IK分词器配置文件+自定义词库
238 0

热门文章

最新文章