Elasticsearch 实战项目中势必会用到中文分词,而中文分词器的选型包含但不限于如下开源分词器:

  • IK 分词器

    https://github.com/medcl/elasticsearch-analysis-ik

  • Ansj 分词器

    https://github.com/NLPchina/elasticsearch-analysis-ansj

  • jieba 分词器

    https://github.com/sing1ee/elasticsearch-jieba-plugin

  • 清华大学 thulac 分词器

    https://github.com/microbun/elasticsearch-thulac-plugin

  • icu 分词器

    https://github.com/elastic/elasticsearch-analysis-icu

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

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

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

1 认知前提

1.1 分词器选型

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

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

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

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

2、新词库从哪里来?

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

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

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

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

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

2.2 互联网开源词库

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

搜狗官方释义如下:

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

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

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

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

2.3 爬取特定领域词库

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

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

仅以万方数据库为例:

3 静态扩展词典

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

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

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

3.1 步骤 1:下载词库

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

全量词库的地址:

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

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

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

参考如下:

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

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

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

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

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

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

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

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

4 动态扩展词典

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

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

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

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

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

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

数据库连接要加上时间格式和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 小结

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

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

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

推荐

1、Elasticsearch 7.X 进阶实战私训课

2、如何系统的学习 Elasticsearch ?

3、全网首发!《 Elasticsearch 最少必要知识教程 V1.0 》低调发布

更短时间更快习得更多干货!

中国50%+Elastic认证工程师出自于此!

比同事抢先一步学习进阶干货!

Elasticsearch 如何自定义扩展词库?相关推荐

  1. 2022还在使用Mysql进行数据检索?ElasticSearch自定义扩展词库完成检索

    文章目录 1.为什么要自定义扩展ES词库呢? 2.如何自定义扩展词库呢? 3.Docker安装Nginx 4.在nginx中保存一个简易词库 5.修改IK分词器的配置文件,让其指向nginx保存的词库 ...

  2. es自建搜索词库_【ES从入门到实战】二十三、全文检索-ElasticSearch-分词-自定义扩展词库...

    接第22节 3).自定义词库 ik 分词器默认的分词并不能满足我们的需求,对于一些新的网络用语,ik 分词器就会无法准确的进行分词识别,比如: POST _analyze { "analyz ...

  3. 【ES从入门到实战】二十三、全文检索-ElasticSearch-分词-自定义扩展词库

    接第22节 3).自定义词库 ik 分词器默认的分词并不能满足我们的需求,对于一些新的网络用语,ik 分词器就会无法准确的进行分词识别,比如: POST _analyze {"analyze ...

  4. ES进阶(6)-自定义扩展词库

    在实际分词中有些分词并不能出现我们预期的分词结果,因此我们可以使用自定义词库 1.安装nginx 在mydata下创建目录 mkdir nginx 启动实例 docker run -p 80:80 - ...

  5. Elasticsearch--分词-自定义扩展词库---全文检索引擎ElasticSearch工作笔记022

    然后我们再看,之前我们给"尚硅谷电商项目" 进行分词的时候 可以看到,我们知道尚硅谷是一个词,但是他没有给我们识别出来,而是,把尚分离了出来. 那怎么让他按照我们想的进行分词呢?, ...

  6. IKAnalyzer 添加扩展词库和自定义词

    原文链接http://blog.csdn.net/whzhaochao/article/details/50130605 IKanalyzer分词器 IK分词器源码位置 http://git.osch ...

  7. Lucene分词器,使用中文分词器,扩展词库,停用词

    2019独角兽企业重金招聘Python工程师标准>>> Lucene分词器,使用中文分词器,扩展词库,停用词 博客分类: 搜索引擎,爬虫 停止词:lucene的停止词是无功能意义的词 ...

  8. 【ES】Elasticsearch实现电商词库提示搜索

    文章目录 Elasticsearch实现电商词库提示搜索 前序 一. 自定义analyzer 二. 自定义mappings 三. 数据的测试 3.1 添加测试数据 3.2 测试 3.3 导入数据 四. ...

  9. 架构师成长记_第八周_11_ES- ik中文分词器与自定义中文词库

    文章目录 ik中文分词器 1. 安装ik中文分词器(7.4.2版本) 2. 使用ik中文分词器 2.1 分词器: ik_max_word 2.1 分词器: ik_smart 自定义中文词库 自定义词库 ...

  10. solr配置同义词,停止词,和扩展词库(IK分词器为例)

    定义 同义词:搜索结果里出现的同义词.如我们输入"还行",得到的结果包括同义词"还可以". 停止词:在搜索时不用出现在结果里的词.比如is .a .are .& ...

最新文章

  1. .NET中SQL Server数据库连接方法
  2. 异常分发(用户异常)
  3. Linux 常用命令笔记 (持续更新)
  4. 《Java程序员面试宝典》读书笔记1
  5. python3异步协程爬虫_Python实现基于协程的异步爬虫
  6. Nginx之gzip压缩配置
  7. 首发骁龙898!小米12系列屏幕方案曝光:双曲面屏+全新封装工艺
  8. 冬季美食不可少烤肉和火锅,最具诱惑的手绘肉食插画素材,让设计师勾引你的味蕾
  9. 。。。剑指Offer之——反转链表。。。
  10. linux mysql多实例启动_Mysql实例Linux下启动多个mysql服务器例子
  11. testbench文件显示波形_如何编写testbench的总结(非常实用的总结)
  12. 太阳能发电与蓄电池研究(Matlab代码实现)
  13. oracle数据库 同义词读写操作,Oracle数据库之同义词(SYNONYM)使用
  14. 【UVM基础】uvm_agent 中的 is_active 变量释义
  15. [IMX6Q][Android4.4] Audio添加控制MIC左右声道接口
  16. 5G课程笔记--华为ICT课堂(初学)(二)
  17. 时间序列分析专题(二)
  18. 超简单的C++去重、排序
  19. 远程计算机需要网络级别身份验证,而您的不支持该验证
  20. Hadoop【部署 02】hadoop-3.1.3 单机版YARN(配置、启动停止shell脚本修改及服务验证)

热门文章

  1. matlabrobert锐化_基于matlab图像锐化处理
  2. c语言 统计数量用count_C语言中count是什么意思?
  3. 新品发布|机智云智能管家:智家2.0发布
  4. Unity 5如何设置物体透明
  5. An exception has been thrown during the rendering of a template
  6. el-upload+额外的参数 , element上传功能组件及其参数的详解
  7. 奥林匹克计算机竞赛保送,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华
  8. 采集PMS7003 颗粒度传感器数据,显示在TFT屏幕上,并通过webapi上传(1/2)
  9. (二十三)八部众(2)
  10. 一切从零开始------软件篇