轉載請注明出處!
IK分詞器如果配置成
<fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
本人測試切分詞可以,但是同義詞,擴展詞庫用不了,
網上查各種資料說IK分詞器有個BUG,要自己把jar文件改一下,於是找到IK的源碼,里面只有IKAnalyzer的源碼,代碼如下
package org.wltea.analyzer.lucene; import java.io.Reader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Tokenizer; /** * IK分詞器,Lucene Analyzer接口實現 * 兼容Lucene 4.0版本 */ public final class IKAnalyzer extends Analyzer{ private boolean useSmart; public boolean useSmart() { return useSmart; } public void setUseSmart(boolean useSmart) { this.useSmart = useSmart; } /** * IK分詞器Lucene Analyzer接口實現類 * * 默認細粒度切分算法 */ public IKAnalyzer(){ this(false); } /** * IK分詞器Lucene Analyzer接口實現類 * * @param useSmart 當為true時,分詞器進行智能切分 */ public IKAnalyzer(boolean useSmart){ super(); this.useSmart = useSmart; } /** * 重載Analyzer接口,構造分詞組件 */ @Override protected TokenStreamComponents createComponents(String fieldName, final Reader in) { Tokenizer _IKTokenizer = new IKTokenizer(in , this.useSmart()); return new TokenStreamComponents(_IKTokenizer); } }
自己加了一個IKAnalyzerSolrFactory,代碼如下
package org.wltea.analyzer.lucene; import java.io.Reader; import java.util.Map; import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.util.TokenizerFactory; import org.apache.lucene.util.AttributeSource.AttributeFactory; public class IKAnalyzerSolrFactory extends TokenizerFactory{ private boolean useSmart; public boolean useSmart() { return useSmart; } public void setUseSmart(boolean useSmart) { this.useSmart = useSmart; } public IKAnalyzerSolrFactory(Map<String,String> args) { super(args); assureMatchVersion(); this.setUseSmart(args.get("useSmart").toString().equals("true")); } @Override public Tokenizer create(AttributeFactory factory, Reader input) { Tokenizer _IKTokenizer = new IKTokenizer(input , this.useSmart); return _IKTokenizer; } }
這樣一來就能在配置文件中配置成IKAnalyzerSolrFactory 的列子
下面是具體的配置描述:
1。修改IK的jar文件,加入IKAnalyzerSolrFactory (如果不會改的自行下載 http://pan.baidu.com/s/1gfLOIL9)
2.修改solrconfig.xml文件,加入
<lib dir="/contrib/analysis-extras/lib" regex=".*\.jar" />
3.修改schema.xml文件,加入
<!--IK分詞器--> <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" useSmart="true"/> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" useSmart="true"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> </analyzer> </fieldType>
4.在solr的webINFO 下的classes(沒有新建)加入如下圖,IK壓縮文件中的部分文件,如圖所示:
5.在ext.dic配置自定義詞庫,不需要切分詞的詞語配置在此,同義詞寫在synonyms.txt中即可。格式為: 通知,通告
注意每次改變詞庫或者同義詞需要重啟服務。