Elasticsearch系列---使用中文分词器 (2)

2)自己建立停用词库,如了,的,哈,啥,这几个字不想去建立索引
在配置文件IKAnalyzer.cfg.xml下ext_stopwords标签添加:extra_stopword.dic,并加几个词,修改后同样要重启es。

例:加一个"啥"字在ext_stopword中
修改前:

GET /forum/_analyze { "text": "啥都好", "analyzer": "ik_max_word" } 响应结果: { "tokens": [ { "token": "啥", "start_offset": 0, "end_offset": 1, "type": "CN_WORD", "position": 0 }, { "token": "都好", "start_offset": 1, "end_offset": 3, "type": "CN_WORD", "position": 1 } ] }

添加停用词后

{ "tokens": [ { "token": "都好", "start_offset": 1, "end_offset": 3, "type": "CN_WORD", "position": 0 } ] }

那个啥字直接没有了,结果符合预期。

热更新方案

上面自定义词库有一个致命问题:必须要重启ES,新增的词库才能生效。

研发、测试环境自己玩玩无所谓,多半是自己使用,节点又少,重启就重启,关系不大。但想想生产环境能随便让你重启吗?动辄几百个ES实例,重启的事就别想了,另外找办法。

由此引出现在的热更新需求,让ES不停机能立即加载新增的词库。

热更新的方案

基于id分词器原生支持的更新方案,部署一个web服务器,提供一个http接口,通过modified和try两个http响应头,来提供词语的热更新操作。

修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库。

推荐方案二,方案一虽是官方提供的,但操作起来比较麻烦,还需要部署http服务器。

方案步骤
1)下载源码
git clone https://github.com/medcl/elasticsearch-analysis-ik
git checkout tags/v6.3.1
该工程是Maven项目工程,将代码导入IDEA或Eclipse。
2)修改点

org.wltea.analyzer.dic.Dictionary

主要思路是在这个类的initial()方法内增加一个入口,反复去调用reLoadMainDict()方法,此方法如下:

public void reLoadMainDict() { logger.info("重新加载词典..."); // 新开一个实例加载词典,减少加载过程对当前词典使用的影响 Dictionary tmpDict = new Dictionary(configuration); tmpDict.configuration = getSingleton().configuration; tmpDict.loadMainDict(); tmpDict.loadStopWordDict(); _MainDict = tmpDict._MainDict; _StopWords = tmpDict._StopWords; logger.info("重新加载词典完毕..."); }

这个方法就是重新加载词库的,然后修改loadMainDict()和loadStopWordDict()方法,在这两个方法最后加上读取数据库获取最新的数据记录的逻辑即可。数据库的表结构自己定义两张表,满足数据库表设计规范即可。

3)IDE上mvn package打包
可以直接用target/releases/目录下的elasticsearch-analysis-ik-6.3.1.zip
4)解压zip包,加上jdbc的配置,该修改的修改,重启ES,看日志
5)在数据库里加几个字段,在线尝试是否生效。

方案延伸

该方案使用数据库轮询的方法,简单有效,但比较浪费资源,毕竟生产上修改词库的动作是按需求发生的,可以考虑由定时轮询改成MQ消息通知,这样就可以做到按需更新,而不用浪费太多的资源做词典更新。

小结

本篇对中文分词器IK作了简单的讲解,市面上流行的中文分词器很多,如果我们遇到有中文分词的需求,货比三家是永远不过时的道理,调研可能要花费一些时间,但能挑到适合自己项目的分词器,还是划算的。

专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区
可以扫左边二维码添加好友,邀请你加入Java架构社区微信群共同探讨技术

Java架构社区

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzjds.html