Solr4.10.2的IK Analyzer分词器配置
1. 准备工作
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包拷贝到之前配置的server\WEB-INF\lib目录下
4. 修改home\collection1\conf目录下的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源文件,解压后用MyEclipse创建新Java 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包拷贝到server\WEB-INF\lib目录下
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. 如果要在索引或查询中使用让solr使用ik分词器的话还需要将schema.xml文件中所有type="text_general"全改为type="text_ik"
12. Solr4.10.2中文分词配置出错补充:尝试过程中遇到的问题基本都是版本问题,solr版本直接对分词的改动还是挺大的,要找到一个合适的分词器和合适版本的solr还真是不容易:
如果使用其他版本solr或者分词器进行配置的时候遇到上面的几个情况基本可以考虑更换solr版本或者分词器版本什么的,或者根据相应版本的规则自己动手写适配接口
参考资料:http://my.oschina.net/u/137332/blog/188215
本文固定连接:http://blog.csdn.net/fyfmfof/article/details/42122435