有时为了满足特有的需求,可能需要对现有的分词器进行调整,为了完成对这些特有分词器的配置,需要完成以下步骤。
(基本思路和配置IKAnalyzer一致)
1.开发特有的分词器,并继承solr中的类BaseTokenizerFactory。
例如笔者调整了一个分词器为OBOLowercaseTokenizer
类层次结构如下图:
然后编写BOBSolr类,继承BaseTokenizerFactory。
public class BOBSolr extends BaseTokenizerFactory { @Override public Tokenizer create(Reader input) { return new OBOLowercaseTokenizer(input); } }
2.在schema.xml中配置
<!-- BOB --> <fieldType name="bob" class="solr.TextField"> <analyzer type="index"> <tokenizer class="com.baitengsoft.FTDB.analyzer.solr.BOBSolr" /> </analyzer> <analyzer type="query"> <tokenizer class="com.baitengsoft.FTDB.analyzer.solr.BOBSolr" /> </analyzer> </fieldType>
---------------------------------------------
如果你的分词器有特定的参数需要在schema.xml中配置,可以参考IKAnalyzer,IKTokenizerFactory如下所述:
/** * */ package org.wltea.analyzer.solr; import java.io.Reader; import java.util.Map; import org.apache.lucene.analysis.Tokenizer; import org.apache.solr.analysis.BaseTokenizerFactory; import org.wltea.analyzer.lucene.IKTokenizer; /** * 实现Solr1.4分词器接口 * 基于IKTokenizer的实现 * * @author 林良益、李良杰 * */ public final class IKTokenizerFactory extends BaseTokenizerFactory{ private boolean isMaxWordLength = false; /** * IK分词器Solr TokenizerFactory接口实现类 * 默认最细粒度切分算法 */ public IKTokenizerFactory(){ } /* * (non-Javadoc) * @see org.apache.solr.analysis.BaseTokenizerFactory#init(java.util.Map) */ public void init(Map<String,String> args){ String _arg = args.get("isMaxWordLength"); isMaxWordLength = Boolean.parseBoolean(_arg); } /* * (non-Javadoc) * @see org.apache.solr.analysis.TokenizerFactory#create(java.io.Reader) */ public Tokenizer create(Reader reader) { return new IKTokenizer(reader , isMaxWordLength()); } public void setMaxWordLength(boolean isMaxWordLength) { this.isMaxWordLength = isMaxWordLength; } public boolean isMaxWordLength() { return isMaxWordLength; } }
isMaxWordLength为其特有的参数。