【apache solr系列】jcseg与pinyinTokenFilter实现中文缩写查找

转载请注明:http://blog.csdn.net/weijonathan/article/details/40504029

今天要写的是关于分词查询的。

我们先来看下下面这张图


应该说很多做搜索的系统都会涉及到的一个话题;中文缩写搜索,当你输入相应的中文缩写的时候,会给你提示相应的中文词组

而现在网上各式各样的文章都没有多少能真正介绍如何实现的。经过前阵子的研究,我这边整理一个我自己研究的效果,

先来看下相关插件以及下载地址:

jcseg下载地址及官网

下载地址:http://git.oschina.net/lionsoul/jcseg

官网地址:https://code.google.com/p/jcseg/

pinyinTokenFilter插件地址:

https://github.com/Jonathan-Wei/pinyinTokenFilter

jsceg是一个中文分词器,而pinyinTokenFilter是一个pinyin过滤器。

1、下载jcseg后解压,将jcseg\output目录中的jar包拷贝到solr的安装目录下

2、将jcseg的lexicon分词库放到apache-tomcat-7.0.53\webapps\solr\WEB-INF\classes目录下并配置lexicon.path路径

1)、jcseg默认的lexicon.path也就是分词词库的位置是在solr发布项目的lib目录;所以可以选择将压缩包中的lexicon目录拷贝到lib包底下

2)、配置lexicon.path配置到你指定的词库目录

疑问:

这里可能大家会问我为什么不用ik,原因是在Solr4.0发布以后,官方取消了BaseTokenizerFactory接口,而直接使用Lucene Analyzer标准接口。因此IK分词器2012 FF版本也取消了org.wltea.analyzer.solr.IKTokenizerFactory类。所以IK无法配置fliter节点;配置了之后启动tomcat直接就报错了;具体错误内容大家可以自己试验下,我这里就不具体展开了!

3、下载pinyinTokenFilter,(这个插件我做了一点修改,作者当前的项目存在bug,修改的内容不多,大家可以看我github上的提交修改内容)配置schame.xml添加以下配置

<fieldType name="text_pinyin" class="solr.TextField">
      <analyzer type="index">
          <tokenizer class="org.lionsoul.jcseg.solr.JcsegTokenizerFactory" mode="complex"/>
          <filter class="me.dowen.solr.analyzers.PinyinTransformTokenFilterFactory"
              isOutChinese="true" firstChar="true" minTermLength="1"/>
         <!--<filter class="me.dowen.solr.analyzers.PinyinTransformTokenFilterFactory"
              isOutChinese="true" firstChar="false" minTermLength="1"/>-->
          <filter class="solr.StopFilterFactory" ignoreCase="true"
              words="stopwords.txt" />
          <filter class="solr.LowerCaseFilterFactory" />
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
          <analyzer type="query">
          <tokenizer class="org.lionsoul.jcseg.solr.JcsegTokenizerFactory" mode="complex"/>
          <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"
              ignoreCase="true" expand="true" />
          <filter class="solr.StopFilterFactory" ignoreCase="true"
              words="stopwords.txt" />
          <filter class="solr.LowerCaseFilterFactory" />
      </analyzer>
  </fieldType>
这里注意下,这个插件支持拼音全拼以及缩写,但是当配置缩写和全频一起使用的时候,貌似不大好使。所以我这里也只配置了一个缩写,让大伙看看效果;

看下参数的一些说明:

isOutChinese:是否保留原输入中文词元。可选值:true(默认)/false

firstChar:输出完整拼音格式还是输出简拼。简拼输出是由原中文词元的各单字的拼音结果的首字母组成的。可选值:true(默认)/false

minTermLength:仅输出字数大于或等于minTermLenght的中文词元的拼音结果。默认值为2。

接下来看下solr中的分析结果:


这里大伙可以看到,“猩球崛起“缩写被分为x,xq,xqj,xqjq,当你输入这4个缩写的时候它就会给你提示包含"猩球崛起"的内容;

接下来看下我们查询结果:

可以看到,我输入xqj进行查询,是可以查到猩球崛起这个内容的。这里猩球崛起是一个词语,jcseg是支持自定义词库的,所以这里我配置了自己的一个简单的词库;

pinyinTokenFilter这个插件,如果不配合其他分词器使用的话,用插件README里面的方法进行测试,你是会看到你输入的单词会被分为一个个单字的词。README中使用的是

<tokenizer class="solr.StandardTokenizerFactory" />
pinyinTokenFilter这个插件还有不完全的地方,所以大伙使用过程中有什么问题可以提下,我也跟踪一下。谢谢。




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。