mmseg4j 1.8 中有词库变化检测功能,新加载词库后,很有可能此时的分词(搜索时)与索引不对应了。所以要有个机制让重新做索引。
这里使用最简单的方式,就是被动式的加载词库。由外围的程序去决定什么时候更新词库,然后也由外围的程序决定重做索引与否。比如可以写个 shell 脚本放到 crontab 里。
按 solr 的理念——用 url 方式去通知 mmseg4j 加载词库。这个任务交出 MMseg4jHandler 去做。
参数:
dicPath 是指定词库的目录,特性与MMSegTokenizerFactory中的dicPath一样(相对目录是,是相对 solr.home)。
check 是指是否检测词库,其值是true 或 on。
reload 是否尝试加载词库,其值是 true 或 on。此值为 true,会忽视 check 参数。
solrconfig.xml文件增加:
<requestHandler name="/mmseg4j" class="com.chenlb.mmseg4j.solr.MMseg4jHandler" > <lst name="defaults"> <str name="dicPath">dic</str> </lst> </requestHandler>
然后可以用 http://localhost:8080/solr/mmseg4j/?reload=true,去尝试加载(注意:内存空间要有2倍词库大小的可能空间。一个词库可可能 50M)。
返回结果如下:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"><int name="status">0</int><int name="QTime">1</int></lst><lst name="result"><str name="dicPath">java.net.URI:file:/data/deployment_new/lelifeextra/solr/solrhome/dic/</str><bool name="changed">false</bool></lst> </response>
注意:dicPath 参数是 MMSegTokenizerFactory 里指定的 dicPath 才有意义。
附注:
mmseg4j-core-1.10.0.jar 中的 chars.dic, units.dic, words,dic , 这三个都是官方词库,你可以更改以便覆盖官方配置, 也可以不更改。
放入以文件名为words开头, .dic为文件结尾的UTF-8格式的文件, 如果是带BOM的UTF8文件, 第一行为空即可. 每行一个词。
@卢松松博客:难道是卢松松本人来了?
我来了,既然来了我就得说几句!只说几句而已!如果我不说几句!就对不起人了,既然我要说几句!那么肯定是要说话的~
赞一个,程序员就是牛逼
@律所软件:多谢光临,虽然我不喜欢你这样的
@看看回复功能:不管你信不信,反正我是信了,他没弹123
@harries:竟然是@gmail.com,我看好你
谢谢分享
小强不错,加油
放入以文件名为words开头, .dic为文件结尾的UTF-8格式的文件, 如果是带BOM的UTF8文件, 第一行为空即可. 每行一个词。
如果你修改文件后发现调用地址怎么也不显示改变,那么也许你创建的文件不是words开头的,别问我是怎么知道的。
正如上面所说,dic为文件结尾的UTF-8格式的文件,请自行检查服务器文件是否为UTF8格式。
一般,我们都是在数据库定义一张表来存词库数据,然后导到服务器,然后通知solr更新词库。
脚本参考:
#!/bin/bash
echo '开始加载词库'
rm -rf from-db.dic
echo '删除历史词库'
mysql -h1.1.1.1 -ujavacui -pjavacui -P3306 search -e "select word_str from word_table" > /data/solr/solrhome/dic/from-db.dic
echo '加载词库结束'
直接通过脚连接数据库导出到服务器指定目录。