Solr4.10.2的IK Analyzer分词器配置

原文地址:http://blog.csdn.net/fyfmfof/article/details/42122435

1. 准备工作

Solr4.10.2已经在Tomcat中配置好,详见Solr4.10.2的Tomcat配置

2. 下载IK分词器

地址:http://code.google.com/p/ik-analyzer/downloads/list
下载IK Analyzer2012FF_hf1.zip和IK Analyzer2012 FF_SRC.rar两个文件

3. 解压IK Analyzer 2012FF_hf1.zip将jar包拷贝到之前配置的serverWEB-INFlib目录下

4. 修改homecollection1conf目录下的schema.xml文件

找一个合适的地方加入配置语句:

<!--IK-->
<fieldType name="text_ik" class="solr.TextField">
       <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

5. 启动Tomcat服务器访问http://localhost:8080/solr在Analysis中测试分词效果如下:

这里写图片描述

6. IKAnalzer默认采用最细粒度切分,如果要配合索引和搜索一般我们希望索引采用最细粒度切分,而搜索采用智能切分,按照说明配置如下:

<!--IK-->
<fieldType name="text_ik" class="solr.TextField">
              <analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer" useSmart="false"/>
              <analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer" useSmart="true"/>
</fieldType> 

但配置启动后发现分词结果还是一样都采用了最细粒度切分,所以我们要手动解决这个问题,在网上找了一些资料尝试后发现一个有效的方法,这里就用到我们下载的第二个文件,即IK Analyzer 2012 FF_SRC源文件,解压后用Eclipse创建新Maven Project的方式将其打开。

7. 新建一个org.apache.solr.analysis包,然后建一个IKAnalyzerSolrTokenizerFactory类,代码如下:

package org.apache.solr.analysis;

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.AttributeFactory;
import org.wltea.analyzer.lucene.IKTokenizer;

/**

 * 解决IK Analyzer 2012FF_hf1 在solr4.x应用时,配置useSmart失效的问题

 * 

 * @author  lqin

 * @date 2013-12-24

 * @email  qin.liang@sinovatio.com

 * @version  1.0

 * 

 */

public class IKAnalyzerSolrTokenizerFactory extends TokenizerFactory {

    /**

     * 构造函数,从参数里面读取配置

     * @param args

     */

    public IKAnalyzerSolrTokenizerFactory(Map<String, String> args) 
    {
        super(args);
        assureMatchVersion();
        // 设置分词力度,useSmart=true粗力度,useSmart=false细力度
        this.setUseSmart("true".equals(args.get("useSmart")));
    }

    private boolean useSmart;

    public boolean useSmart() 
    {
        return useSmart;
    }

    public void setUseSmart(boolean useSmart) 
    {
        this.useSmart = useSmart;
    }

    public void init(Map<String, String> args) {
        this.useSmart = "true".equals(args.get("useSmart")) ;
    }

    @Override

    public Tokenizer create(AttributeFactory factory, Reader input) 
    {
        Tokenizer _IKTokenizer = new IKTokenizer(input , this.useSmart);
        return _IKTokenizer;
    }
}

8. 利用MyEclipse的导出功能直接打包成jar包拷贝到serverWEB-INFlib目录下

9. 将之前schema.xml里IK的配置改为:

<fieldType name="text_ik" class="solr.TextField">
       <analyzer type="index">
              <tokenizer class="org.apache.solr.analysis.IKAnalyzerSolrTokenizerFactory" useSmart="false"/>
       </analyzer>
       <analyzer type="query">
              <tokenizer class="org.apache.solr.analysis.IKAnalyzerSolrTokenizerFactory" useSmart="true"/>
       </analyzer>
</fieldType>

10. 重新启动Tomcat,测试如下即表示配置完成:

这里写图片描述

11. Solr4.10.2中文分词配置出错补充:

尝试过程中遇到的问题基本都是版本问题,solr版本直接对分词的改动还是挺大的,要找到一个合适的分词器和合适版本的solr还真是不容易。

这里写图片描述
这里写图片描述
如果使用其他版本solr或者分词器进行配置的时候遇到上面的几个情况基本可以考虑更换solr版本或者分词器版本什么的,或者根据相应版本的规则自己动手写适配接口

原文地址:https://www.cnblogs.com/wygdove/p/4542102.html