轉載請註明: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這個插件還有不完全的地方,所以大夥使用過程中有什麼問題可以提下,我也跟蹤一下。謝謝。