`
bit6211
  • 浏览: 73238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

solr整合paoding分词注意的一些细节

阅读更多
今天花了一个下午一个晚上,参考了网上许多资料,终于把paoding分词整合到solr中了,为了避免以后忘记,特此记录。
1.首先写一个类,这个类在网上都有,记录如下:
package com.test.slor.tokenizer;  
 
import java.io.Reader;  
import java.util.Map;  
 
import net.paoding.analysis.analyzer.PaodingTokenizer;  
import net.paoding.analysis.analyzer.TokenCollector;  
import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;  
import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;  
import net.paoding.analysis.knife.PaodingMaker;  
 
import org.apache.lucene.analysis.TokenStream;  
import org.apache.solr.analysis.BaseTokenizerFactory;  
 
public class ChineseTokenizerFactory extends BaseTokenizerFactory {  
      
    /** 
     * 最多切分 默认模式 
     */ 
    public static final String MOST_WORDS_MODE = "most-words";  
 
    /** 
     * 按最大切分 
     */ 
    public static final String MAX_WORD_LENGTH_MODE = "max-word-length";  
 
    private String mode = null;  
 
    public void setMode(String mode) {  
        if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode) || "default".equalsIgnoreCase(mode)) {  
            this.mode = MOST_WORDS_MODE;  
        } else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {  
            this.mode = MAX_WORD_LENGTH_MODE;  
        } else {  
            throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode);  
        }  
    }  
 
    @Override 
    public void init(Map<String,String> args) {  
        super.init(args);  
        setMode(args.get("mode").toString());  
    }  
 
    public TokenStream create(Reader input) {  
        return new PaodingTokenizer(input, PaodingMaker.make(), createTokenCollector());  
    }  
 
    private TokenCollector createTokenCollector() {  
        if (MOST_WORDS_MODE.equals(mode))  
            return new MostWordsTokenCollector();  
        if (MAX_WORD_LENGTH_MODE.equals(mode))  
            return new MaxWordLengthTokenCollector();  
        throw new Error("never happened");  
    }  
      

然后把这个类编译成.class文件,如果想打包,也可以直接打包成.jar文件。
2.修改solr的schema.xml文件,也记录如下:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
      <analyzer type="index"> 
        <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>--> 
        <tokenizer class="com.test.slor.tokenizer.ChineseTokenizerFactory" mode="most-words"/> 
      ...
      </analyzer> 
      <analyzer type="query"> 
         <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>--> 
         <tokenizer     class="com.test.slor.tokenizer.ChineseTokenizerFactory" mode="most-words"/>   
        ...
      </analyzer> 
</fieldType> 
3.把第1步编译好的.class文件或者.jar和paoding-analysis.jar 放到容器下,比如tomcat,那即是放到tomcat\webapps\solr\WEB-INF\lib\下 ,注意,是solr的WEB-INF\lib\,而不是你手头的某个工程的WEB-INF\lib\下,由于我粗心大意,直接在myeclipse中把两个.jar包粘贴到手头工程的WEB-INF\lib\下,结果报异常:
org.apache.solr.common.SolrException: Unknown fieldtype 'text' specified on field title......
然后一个下午过去了...

当我发现这个问题,并把两个.jar放到正确的位置(如果是.class文件,则放在solr\WEB-INF\classes,其中要自己建classes文件夹),启动tomcat,却报如下异常:
严重: org.apache.solr.common.SolrException: Error loading class 'com.test.solr.tokenizer.ChineseTokenizerFactory'...
严重: org.apache.solr.common.SolrException: analyzer without class or tokenizer & filter list...
我使用的paoding是paoding-analysis-2.0.4-beta.zip,其中lib文件夹包含的lucene是lucene-core-2.2.0.jar,而我用的solr是apache-solr-1.3.0,其中tomcat\webapps\solr\WEB-INF\lib\包含的lucene是lucene-core-2.4-dev.jar。而在第一步,import org.apache.lucene.analysis.TokenStream;  时,我用的是lucene-core-2.2.0.jar,结果编译出来的.class(或.jar)文件,运行时就报异常了。当我改用lucene-core-2.4-dev.jar时,则成功在solr中加入paoding分词了。
嗯,晚上就是这样过去的...
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics