hankcs / hanlp-lucene-plugin

HanLP中文分词Lucene插件,支持包括Solr在内的基于Lucene的系统
http://www.hankcs.com/nlp/segment/full-text-retrieval-solr-integrated-hanlp-chinese-word-segmentation.html
Apache License 2.0
296 stars 99 forks source link

Solr中修改自定义词典如何立即生效 #40

Open yooopan opened 6 years ago

yooopan commented 6 years ago

注意事项

请确认下列注意事项:

版本号

当前最新版本号是:1.6.8 我使用的版本是:1.6.8

我的问题

业务中对自定义词典的依赖比较强,比如一些行业的特殊词汇,已经解决了hanlp自定义词典在solr中的使用问题,现在遇到关于自定义词典如何立即生效的问题。问题描述如下: 首先,修改一个自定义词典,比如user_define.txt,这时候user_define.txt的修改时间大于CustomDictionary.txt.bin的修改时间,想把user_define.txt生效,需要以下步骤: 1.删除CustomDictionary.txt.bin,这时solr中缓存的有词典,调用hanlp的分词接口修改的词典文件也不会立即生效,只能手动删除CustomDictionary.txt.bin文件,然后reload core,重新调研hanlp的分词接口。

2.生成CustomDictionary.txt.bin文件的时间比较长(截图中生成一个29M的bin文件需要1分多钟),这样会影响当前core的使用。先缓存启动,当全部词典加载成功后,调用reload方法重新构建词典的方法也考虑过,但是bin的生成时间依然是一个瓶颈。

期望输出

  1. 修改自定义词典以后,如何缩短CustomDictionary.txt.bin文件的生成时间。

  2. 立即生效(重启solr或者reload core的时候让自定义词典生效)

  3. solr集群中有多个节点,尽量避免手工操作。

hankcs commented 6 years ago

感谢反馈,目前的自定义词典机制并不适合频繁地修改更新。具体到solr等应用场景,也没有考虑同步的问题。此处提供一些可行的解决方案:

  1. 缓存的目的是为了频繁地启动debug,而不是reload。所以你需要禁止HanLP生成缓存,此时大概花费数秒钟加载所有的txt。这可以通过修改com.hankcs.hanlp.dictionary.CustomDictionary#loadMainDictionary实现。新版本可能会加一个禁用缓存的开关。
  2. 我并没有时间去研究solr的机制,也许在reload core的时候会有一个通知?你需要在接受该通知的时候reload HanLP的词典。如果你对时效非常敏感,可能需要同时创建新的Segment对象,以免多线程不同步。
  3. 你可以将词典放到唯一的一台服务器,编写自己的IOAdapter,提供远程访问功能。

总之,由于人力有限,HanLP项目只能提供解决思路,而无法代替用户开发所有的功能,请见谅。