0. 序言

       经常遇到不少人询问如何在solr4.x中集成各种分词器,其实也算是咱曾经的工作之一:按照solr的接口把一些分词器对接起来。所幸之前一直都接触这方面的内容因而没走什么弯路,值此团队开博之时,正好把一些代码重新整理共享一下。

 

1. 设计

       Java系的中文分词挺多了,ik,paoding,mmseg4j,ictclas4j,ansj等等,目前选取实现的是ik和ansj。将分词器扩展到solr易用模式我们考虑了2点:1. 大部分分词器的扩展自定义词库的功能都是读取本地文件,solr在单机环境读取的资源路径是磁盘但在solrcloud模式下读取的资源路径是zookeeper, 因此需要把分词器读取扩展自定义的词库改成以solr资源路径为准的。2. 在solrcloud模式下分词器触发扩展词库操作必须是每个replica都自己去做一遍,自己写solr的requesthandler是不能进行同索引分发的(比如mmseg4j写的触发操作handler), 因此要保证每个replica能同时能进行更新到同样的词库。

对于这两点,我们采用的方式是1:为分词器添加inputstream的读扩展词接口; 2:定时线程检查配置文件是否需要更新词库(会存在微小的时间范围内的不同replica词库不一致,最终会一致,但为了简单一点,没有采用zookeeper监听的方式,也不可能禁止重载词库的时候禁止solr读写)

 

2. 代码

代码托管在github:https://github.com/mlcsdev/mlcsseg   支持版本 4.3 ~ 4.7的solr

4个子项目:

   mlcsseg-common: 公用功能,所有分词器都要依赖这个

   mlcsseg-filter       :   可动态变更的停用词、同义词 过滤器

   mlcsseg-ik           :    ik分词器

   mlcsseg-ansj       :    ansj分词器

其中除了mlcsseg-ansj,都是直接mvn package就出的包就可以使用的。

mlcsseg-ansj需要用mvn assembly:assembly 方式打包带上两个它自己的jar包,你也可以直接手动从lib中拷出来用。(mlcsseg-ansj 本身至少要3个包,加上common 一共4个)

 

3. 使用

以mlcsseg-ik和mlcsseg-filter为例, 把三个对应jar拷贝到一个目录,并在solrconfig中设置好;

在schema.xml中增加如下内容

 

Xml代码  

  1. <fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">  

  2.    <analyzer type="index">  

  3.      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>  

  4.      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />  

  5.