Solr动态加载分词器的自定义词库扩展词库解决方案

    xiaoxiao2021-03-25  75

    最近在做全文检索 在项目中有个需求是要动态的配置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>
    转载请注明原文地址: https://ju.6miu.com/read-12631.html

    最新回复(0)