最近在做全文检索 在项目中有个需求是要动态的配置Solr的自定义扩展词库,在网上找了很多资料 发现关于这方面的知识比较少 千辛万苦终于找到了解决方案 在这里和大家分享一下
1.自行下载mmseg4j有关的Java包
# 适配SOLR6.2.1
mmseg4j-core-1.10.0.jar
mmseg4j-solr-2.3.0.jar
2.将下载好的Jar包放入webapps/solr/WEB-INF/lib下
3.修改managed-schema配置,添加如下内容
<!-- 中文分词mmseg4j -->
<fieldtype name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="自定义词库路径" />
<!-- 停止词过滤器 -->
<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="自定义词库路径" />
<!-- 停止词过滤器 -->
<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="自定义词库路径" />
<!-- 停止词过滤器 -->
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldtype>
4.修改solrconfig.xml配置,添加如下内容
<requestHandler name="/mmseg4j/reloadwords" class="com.chenlb.mmseg4j.solr.MMseg4jHandler">
<lst name="defaults">
<str name="dicPath">自定义词库路径</str>
<str name="check">true</str>
<str name="reload">true</str>
</lst>
</requestHandler>
5.在自定义词库目录下放入词库
5.1: 在mmseg4j-core-1.10.0.jar中找到chars.dic, units.dic, words,dic放入自定义词库目录下 这三个都是官方词库,你可以更改以便覆盖官方配置, 也可以不更改.
5.2: 自定义词库可识别到文件名为words开头, .dic为文件结尾的UTF-8格式的文件.如在自定义词词库下创建words-my.dic。如果是带BOM的UTF8文件, 第一行为空即可. 每行一个词.
6.重新加载自定义词库
单机版访问http://localhost:8983/solr/CORE名称/mmseg4j/reloadwords 进行动态加载自定义词库
SolrCloud如果涉及到多个节点,则每个节点都要执行以下访问方可使所有节点都生效
http://节点1:8983/solr/CORE名称/mmseg4j/reloadwords
http://节点2:8983/solr/CORE名称/mmseg4j/reloadwords
http://节点3:8983/solr/CORE名称/mmseg4j/reloadwords
7.返回结果如下
<?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:自定义词库路径</str>
<bool name="changed">false</bool>
</lst>
</response>