在Solr4.0发布以后,官方取消了BaseTokenizerFactory接口,而直接使用Lucene Analyzer标准接口。因此IK分词器2012 FF版本也取消了org.wltea.analyzer.solr.IKTokenizerFactory类。

所以以前在schema.xml文件中加入的内容:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
       <tokenizer class = "org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false" /> 
         ......
      </analyzer>
      <analyzer type="query">
       <tokenizer class = "org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true" />  
         ......
      </analyzer>
    </fieldType>

而现在在schema.xml文件中加入的内容为:

<fieldType name="text" class="solr.TextField">

      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

    </fieldType>

这也是之前配置会出错的原因,除非自己实现了IKTokenizerFactory类。

以下是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);
    }

}

solr调用analyzer: http://ronxin999.blog.163.com/blog/static/4221792020117854548995/?suggestedreading

 posted on 2013-11-22 16:39  瞌睡的美人鱼  阅读(420)  评论(0)    收藏  举报