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

本文介绍如何将Paoding分词器整合到Solr中,包括创建自定义分词器类、修改schema.xml文件及解决常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天花了一个下午一个晚上,参考了网上许多资料,终于把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\下 ,注意,是[color=red]solr[/color]的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分词了。
嗯,晚上就是这样过去的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值