您好,登录后才能下订单哦!
# 在Solr4.x上使用IK分词设置useSmart没有效果的解决方法
## 前言
在Solr4.x版本中使用IK Analyzer进行中文分词时,很多开发者会遇到`useSmart`参数设置无效的问题。本文将详细分析问题原因,并提供多种经过验证的解决方案,帮助开发者实现预期的智能分词效果。
## 问题现象
当在schema.xml中配置IK分词器时,即使明确设置了`useSmart=true`,实际分词结果仍然与`useSmart=false`(默认细粒度模式)相同:
```xml
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>
测试短语”中华人民共和国”预期输出应为[“中华人民共和国”](智能模式),但实际得到[“中华”,“中华人民”,“中华人民共和国”,“华人”,“人民”,“人民共和国”,“共和”,“共和国”](细粒度模式)。
Solr4.x默认集成的IK Analyzer版本较旧(通常为2012版),该版本存在以下问题:
- 工厂类IKTokenizerFactory
未正确处理Lucene/Solr的参数传递
- useSmart
参数未通过init()
方法正确初始化
在Solr4.x中,Tokenzier工厂参数的加载方式与新版存在差异,参数可能未被有效传递到分词器实例。
获取新版IK Analyzer 下载IK Analyzer 2012FF_hf1或更高版本:
wget https://repo1.maven.org/maven2/org/wltea/analyzer/ik-analyzer/2012FF_hf1/ik-analyzer-2012FF_hf1.jar
替换Solr库文件
cp ik-analyzer-2012FF_hf1.jar ${SOLR_HOME}/example/solr-webapp/webapp/WEB-INF/lib/
更新schema.xml配置
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"
useSmart="true"
conf="ik.conf"/>
创建自定义工厂类
public class SmartIKTokenizerFactory extends TokenizerFactory {
private boolean useSmart;
public SmartIKTokenizerFactory(Map<String,String> args) {
super(args);
this.useSmart = getBoolean(args, "useSmart", false);
}
@Override
public Tokenizer create(AttributeFactory factory, Reader input) {
return new IKTokenizer(input, this.useSmart);
}
}
编译打包后部署
javac -cp "lucene-core-4.x.jar:solr-core-4.x.jar" SmartIKTokenizerFactory.java
jar cvf ik-smart.jar *.class
配置使用自定义类
<tokenizer class="com.your.package.SmartIKTokenizerFactory" useSmart="true"/>
创建ik配置文件
在Solr的conf目录下创建IKAnalyzer.cfg.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<entry key="use_smart">true</entry>
</properties>
修改schema.xml
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"
conf="IKAnalyzer.cfg.xml"/>
访问Solr Admin控制台的Analysis界面(通常为http://localhost:8983/solr/#/core/analysis
),输入测试文本观察实际分词效果。
执行查询并检查调试信息:
curl "http://localhost:8983/solr/core/select?q=text_ik:中华人民共和国&debugQuery=true"
预期输出应包含:
"debug": {
"rawquerystring": "text_ik:中华人民共和国",
"parsedquery": "text_ik:中华人民共和国",
"parsedquery_toString": "text_ik:中华人民共和国"
}
热加载问题 修改配置后需要reload核心或重启Solr:
curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=core_name"
词典更新
智能模式依赖主词典,建议定期更新main.dic
文件:
${SOLR_HOME}/conf/ik/dic/main.dic
性能影响 智能模式会减少token数量,可能影响召回率,建议:
通过以上方案,开发者可以成功在Solr4.x中启用IK的智能分词模式。方案一(升级IK版本)是最彻底的解决方案,方案二和方案三适用于不能升级的特殊环境。实际部署时建议进行全面的回归测试,确保分词改变不会影响现有查询功能。
Q:修改后仍然无效怎么办?
A:检查步骤:
1. 确认jar文件已正确部署
2. 查看Solr日志是否有加载错误
3. 使用-Dik.conf=path
参数指定配置文件绝对路径
Q:如何实现不同字段不同模式? A:创建多个fieldType:
<fieldType name="text_ik_smart" class="solr.TextField">
<analyzer>
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>
<fieldType name="text_ik_max" class="solr.TextField">
<analyzer>
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
</analyzer>
</fieldType>
”`
注:本文假设读者已具备Solr基本配置知识,所有代码示例基于Solr 4.10.4和IK Analyzer 2012FF_hf1版本测试通过。实际部署时请根据具体环境调整路径和版本号。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。