ok,直接開門見山,不繞彎子啦!基于上篇部落格,我們知道了在solr中配置分詞器有兩種方式,一種是直接配置分詞器類,比如:

<fieldtype name="text_ik" class="solr.textfield">
<analyzer class="org.wltea.analyzer.lucene.ikanalyzer" />
</fieldtype>
一種是配置tokenizerfactory類,由于solr api中并沒有内置類似ik,ansj這樣的中文分詞器的tokenizerfactory類,是以我們需要自己擴充,不過你們不用擔心,我已經擴充好了。配置樣例如下:

<fieldtype name="text_ik" class="solr.textfield">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.iktokenizerfactory" usesmart="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.iktokenizerfactory" usesmart="false"/>
我擴充的ansjtokenizerfactory源碼如下:

public class ansjtokenizerfactory extends tokenizerfactory {
/**是否查詢分詞*/
private boolean query;
/**是否分析詞幹.進行單複數,時态的轉換(隻針對英文單詞)*/
private boolean pstemming;
/**自定義停用詞詞典檔案路徑*/
private string stopwordsdir;
public ansjtokenizerfactory(map<string, string> args) {
super(args);
query = getboolean(args, "query", false);
pstemming = getboolean(args, "pstemming", false);
stopwordsdir = get(args, "stopwordsdir", "");
}
@override
public tokenizer create(attributefactory factory) {
if(query) {
return new ansjtokenizer(factory,new toanalysis(new forest[0]),stopwordsdir,pstemming);
}
return new ansjtokenizer(factory,new indexanalysis(new forest[0]),stopwordsdir,pstemming);
}
下面介紹如何在solr中使用ansj分詞器,首先你需要在solr_home的core\lib目錄下添加依賴的jar:
solr-analyzer-ansj-5.1.0.jar(這個jar包體積較小,請在底下的附件裡下載下傳)
nlp-lang-0.2.jar(這是ansj-seg-2.0.8.jar依賴的jar包)
如圖:
然後在schema.xml中添加如下配置:
至于query,pstemming,stopwordsdir這3個配置參數的含義,請看我在源碼中作的注釋,如圖:
query參數:分詞的兩個階段:建立索引階段和查詢階段,即表示是否為查詢階段分詞,針對不同的分詞階段采用的分詞政策是不一樣的。具體看源碼,如圖:
pstemming:表示是否對英文單詞進行單複數轉換以及時态轉換,比如apples還原成apple,loved還原成love,broken還原成break,注意pstemming參數僅僅是針對英文,因為隻有英文才有單複數和時态形式。
stopwordsdir參數就很好了解了,就是你的自定義停用詞詞典的存放路徑,
上面3個參數是可選的,不是必須配置的。
tokenizerfactory配置好了,然後你就在你的field中應用此分詞器了,如圖:
然後你需要把ansj的library.properties配置檔案copy到e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes路徑,如圖:
library.properties配置如下:

#redress dic file path
ambiguitylibrary=e:/apache-tomcat-7.0.55/webapps/solr/web-inf/classes/library/ambiguity.dic
#path of userlibrary this is default library
userlibrary=e:/apache-tomcat-7.0.55/webapps/solr/web-inf/classes/library
#set real name
isrealname=true
比較惡心的是,anasj分詞器的字典檔案加載路徑這裡隻能寫死成絕對路徑,因為它源碼裡加載字典檔案是直接通過new file(dicpath)這種方式來實作的。當你在eclipse中運作,你的dicpath相對路徑是你的項目根目錄,而如果你的項目部署到tomcat,那dicpath的相對路徑就是tomcat根目錄下的bin,這确實比較啃爹,是以我這裡幹脆直接寫成絕對路徑,當然你可以把字典檔案放到任意目錄下,比如c:\library,不是非要放到tomcat下,這個我必須要澄清下。下圖是ansj分詞器在加載字典檔案時比較惡心的實作方式:
如果改成這樣方式加載字典檔案會比較好點,我個人覺得:
this.getclass().getclassloader().getresourceasstream(dicpath);
這樣你的字典檔案路徑dicpath的相對路徑才是目前classpath。不過ansj裡你把字典檔案配置成絕對路徑也可以,不一定非要相對路徑,這點仁者見仁智者見智吧!騷年,你怎麼看?
接着你需要在e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes目錄下建立一個library目錄,然後把ansj自帶的兩個字典檔案ambiguity.dic和default.dic複制進去,然後建立一個ext.dic檔案。相關的字典檔案和配置檔案我待會兒會上傳到附件裡供你們參考。其中ext.dic是使用者自定義擴充字典檔案,如圖:
對于類似這種網絡新詞,ansj分詞器預設是分不出來的,這時就需要定義自定義擴充字典。
你應該已經發現了,我們在配置ansjtokenizerfactory的時候配置了stopwordsdir="stopwords/stopwords.dic"自定義停用詞加載路徑,這裡的stopwordsdir是相對于目前classpath的即e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes,是以我們需要在e:\apache-tomcat-7.0.55\webapps\solr\web-inf\classes下建立stopwords檔案夾,然後在stopwords檔案夾下建立一個stopwords.dic字典檔案,stopwords.dic内容如下:
這裡我隻加兩個詞語作為示範,你們可以根據你自己的需求随意添加你自己的停用詞。需要解釋下的是,之是以stopwordsdir參數是相對于目前classpath,是因為我在實作ansjtokenizerfactory時是采用這樣的方式來加載詞典檔案的,如圖:
這一切準備好了,你就開始進行分詞測試了,請如圖進行測試:
上圖是對自定義新詞進行分詞測試,麼麼哒和啪啪啪之是以能被分出來,是因為我們在library\ext.dic自定義詞典檔案中添加了那兩個詞語。
上圖是用來測試pstemming參數即英文單詞的單複數轉換以及時态轉換,loved是過去式,自動被轉換成原型love
上圖是用來測試自定義停用詞的,如果你看到如圖效果,說明你配置成功了!
至于anseg分詞器我維護的最新源碼我有空會上傳到我的github上,請關注我的github
益達q-q: 7-3-6-0-3-1-3-0-5
益達的q-q群: 1-0-5-0-9-8-8-0-6
轉載:http://iamyida.iteye.com/blog/2220833