需求背景:系统热点词不断变化,需要solr动态加载词库里的分词,具体场景是cms系统维护热点词,solr去pull变化的分词,然后通过技术手段将分词reload到solr且不重启solr服务器。主要要点
1 通过cms系统维护热点词的维护
2 cms和solr不在同一台服务器上,需要通过shell脚本调用增量变化的分词接口,并将变化结果直接pull到自定义词库字典
3 通过mmseg4j中文分词器reload字典表重建solr字段索引
步骤一二涉及到业务,笔者就在此不做赘述,直接步骤三
① 下载适配mmseg4j分词器jar包
mmseg4j-core-1.10.0.jar
mmseg4j-solr-2.3.0.jar
maven pom依赖
<dependency>
<groupId>com.chenlb.mmseg4j</groupId>
<artifactId>mmseg4j-solr</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.chenlb.mmseg4j</groupId>
<artifactId>mmseg4j-core</artifactId>
<version>1.10.0</version>
</dependency>
可以根据solr版本具体版本进行调整,笔者用的是solr5.3.0,
将下载好的Jar包放入Tomcat下的/WEB-INF/lib下
② 修改managed-schema配置,添加如下内容,dicPath可以根据自己的路径进行更改
<!-- 中文分词mmseg4j -->
<fieldtype name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="E:\solr\WEB-INF\classes" />
<!-- 停止词过滤器 -->
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldtype>
<fieldtype name="text_mmseg4j_complex" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="E:\solr\WEB-INF\classes" />
<!-- 停止词过滤器 -->
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldtype>
<fieldtype name="text_mmseg4j_maxWord" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="E:\solr\WEB-INF\classes" />
<!-- 停止词过滤器 -->
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldtype>
③修改solrconfig.xml配置,添加如下内容
<requestHandler name="/mmseg4j/reloadwords" class="com.chenlb.mmseg4j.solr.MMseg4jHandler">
<lst name="defaults">
<str name="dicPath">E:\solr\WEB-INF\classes</str>
<str name="check">true</str>
<str name="reload">true</str>
</lst>
</requestHandler>
④创建自定义词库文件,放入词库目录E:\solr\WEB-INF\classes
mmseg4j分词默认读取words开头的文件名,笔者建的是words_hot.dic文件
⑤调用步骤二的接口,保证词库的结果更新到了自定义词库words_hot.dic文件里,然后重新加载自定义词库
笔者调用接口:http://127.0.0.1:8085/solr_war_exploded/my_solr/mmseg4j/reloadwords
返回结果:
<?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:E:\solr\WEB-INF\classes</str>
<bool name="changed">true</bool>
<bool name="reload">true</bool>
</lst>
</response>
当为true时,说明词库已经自动reload了,不需要重启solr服务器即已经进行了索引重建。
<field name="hotSearch" type="text_mmseg4j_complex" indexed="true" stored="true"/>
然后使用自定义的分词器text_mmseg4j_simple后,发现目标实现,done!!圆满完成
大致等15分钟左右solr会自动重建索引,然后调solr接口即可将增量的热点词语显示出来