碼雲:https://git.oschina.net/iicode/IKAnalyzer2017_6_6_0java
Github:https://github.com/ittalks/IKAnalyzer2017_6_6_0git
IKAnalyzer2017_6_6_0.jar下載:https://github.com/ittalks/IKAnalyzer2017_6_6_0/releases/download/v1.0.0/IKAnalyzer2017_6_6_0.jargithub
Solr做爲搜索應用服務器,咱們在使用過程當中,不可避免的要使用中文搜索。 如下介紹solr的第三方分詞器IKAnalyzer。web
注:下面操做在Linux下執行,所添加的配置在windonws下依然有效。apache
運行環境tomcat
如下是設置solr中文分詞器的方法。服務器
注:開始以前,假定你已經成功登陸solr的界面,並建立了core。app
在使用IKAnalyzer
分詞器以前,先說明因爲做者在12年以後沒有更新,致使舊版本的分詞器和新版本的solr6.6.0沒法匹配。 所以在源碼的基礎上作些改動,以兼容新版的solr。webapp
IK中文分詞對於數字和英文的分詞方式是:一個英文單詞爲一個語彙單元,一個數值爲一個語彙單元。 好比:"2017 IK Analyzer是一箇中文分詞開源工具包。"這個句話使用IK中文分詞後的結果爲:工具
因此針對數值和英文單詞的部分搜索支持很差。
若是你搜"345"是搜索不出來結果的,固然你可使用lucene查詢表達式或者WildcardQuery
使用通配符查詢。 可是若是搜索"456 IK Analy",又該如何處理,狀況會變得更加複雜。
因此這裏針對數值和英文單詞作了單字分詞,能更好的處理這些狀況。
人們常常會由於忘了某些單詞或者數字的具體內容,則只輸入部份內容
這裏把Tomcat的路徑爲/usr/local/apache-tomcat-8.5.5
作說明。
1、將 IK Jar包和配置文件上傳到Linux系統中,copy IK Jar包到 /usr/local/apache-tomcat-8.5.5/webapps/solr/WEB-INF/lib
目錄下。 即copy IK Jar包到solr項目的lib目錄下。
cp IKAnalyzer2017_6_6_0.jar /usr/local/apache-tomcat-8.5.5/webapps/solr/WEB-INF/lib/
2、複製配置文件到 solr/WEB-INF/classes
目錄下(沒有classes,則建立)
cp ext.dic IKAnalyzer.cfg.xml stopword.dic /usr/local/apache-tomcat-8.5.5/webapps/solr/WEB-INF/classes/
注意IKAnalyzer.cfg.xml
的配置,以啓用停用詞點和擴展詞典。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment> <!--用戶能夠在這裏配置本身的擴展字典 --> <entry key="ext_dict">ext.dic;</entry> <!--用戶能夠在這裏配置本身的擴展中止詞字典--> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
這裏我特別說明一下,爲了方便,我將這三個配置文件集成到了IK Jar包中,因此這裏第二步能夠省略。
此外,
ext.dic
:IK擴展詞典;stopword.dic
:IK停用詞詞典。這裏,我刪除了停用詞,以支持停用詞的查詢;IKAnalyzer.cfg.xml
:IK配置文件;固然,你也能夠Fork IKAnalyzer2017_6_6_0, 移除
resources
目錄下的這三個文件,從新打包。而後按照步驟二分別配置。
3、進入solrhome
中打開managed-schema
文件,添加IKAnalyzer
配置。
這裏我以修改collection1
做爲示範。
個人路徑配置路徑:/usr/local/solrhome/home/collection1/conf
,請根具我的路徑修改配置文件
<!-- IKAnalyzer Field--> <field name="ik_filename" type="IK_cnAnalyzer" indexed="true" stored="true" multiValued="true"/> <field name="ik_keywords" type="IK_cnAnalyzer" indexed="true" stored="false" multiValued="true"/> <field name="ik_content" type="IK_cnAnalyzer" indexed="true" stored="true" multiValued="true"/> <!-- IKAnalyzer --> <fieldType name="IK_cnAnalyzer" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/> <filter class="org.wltea.analyzer.lucene.IKTokenFilterFactory" useSingle="true" useItself="false" /> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/> <filter class="org.wltea.analyzer.lucene.IKTokenFilterFactory" useSingle="true" useItself="false" /> </analyzer> </fieldType> <copyField source="ik_content" dest="ik_keywords"/> <copyField source="ik_filename" dest="ik_keywords"/>
這裏只是舉個栗子,請根據我的須要修改配置文件。
在Analyzer
(分析器)中設置了index
和query
說明建立索引和查詢的時候都使用分詞, 所以若是有特殊要求,能夠指定索引和查詢時候設置不一樣的分詞器。
IKTokenizerFactory
是IK原生的分詞器
useSmart
:設置是否使用智能分詞。默認爲false,使用細粒度分詞IKTokenFilterFactory
是我作的擴展,以支持數值和英文單詞的單字分詞,
useSingle
:設置是否對英文和數字單字分詞。默認false。useItself
:是否保留英文和數字原語彙單元。默認true。IKAnalyzer.cfg.xml
中咱們配置了擴展詞典,同時ext.dic
詞典中配置了以下擴展詞彙:
誅仙 誅仙2 夢幻誅仙 夢幻誅仙2
solr遇到這些詞彙,不只對其進行分詞,還會把它總體做爲一個語彙單元建立索引。
咱們作下測試: