1. 程式人生 > >solr 4.2近義詞配置,使用的是IKAnalyzer2012FF_u1版本時無法實現近義詞處理

solr 4.2近義詞配置,使用的是IKAnalyzer2012FF_u1版本時無法實現近義詞處理

最近要弄商品搜尋近義詞功能, 比如輸入商汞 要搜到混泥土,我用的是solr4.2版本,網上轉了一圈都沒有我要的方案,也沒有現成的類,

於是找到 lucene TokenFilterFactory類

但我用的是IKAnalyzer2012FF_u1版本 其中分詞只有

IKAnalyzer.class這個類,而近義詞已工廠方式去處理,故在org.wltea.analyzer.lucene 包下加了個 IKTokenizerFactory主要是已工廠方式去處理

 程式碼如下

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;


public class IKTokenizerFactory extends TokenizerFactory {


private boolean isMaxWordLength = false;


public void init(Map<String, String> args) {
String _arg = (String) args.get("isMaxWordLength");
this.isMaxWordLength = Boolean.parseBoolean(_arg);
}


public Tokenizer create(Reader reader) {
return new IKTokenizer(reader, isMaxWordLength());
}


public void setMaxWordLength(boolean isMaxWordLength) {
this.isMaxWordLength = isMaxWordLength;
}


public boolean isMaxWordLength() {
return this.isMaxWordLength;
}
}

編譯後放到org.wltea.analyzer.lucene 包下

以前我只能這樣定義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>

加入IKTokenizerFactory類後 改造成(可以在solr 核 下的conf  下 synonyms.txt 檔案配置自己的近義詞庫)

<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
    <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
   </analyzer>
   <analyzer type="query">
    <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false" />
     <filter class="solr.LowerCaseFilterFactory"/>
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
   </analyzer>
  </fieldType>