我们在对英文句子分词的时候,一般采用采用的分词器是WhiteSpaceTokenizerFactory,有一次因业务要求,需要根据某一个特殊字符(以逗号分词,以竖线分词)分词。感觉这种需求可能与WhiteSpaceTokenizerFactory相像,于是自己根据Solr源码自定义了分词策略。
有一次,我拿到的数据都是以竖线“|”分隔,分词的时候,需要以竖线为分词单元,比如下面的这一堆数据:
在Solr的schema.xml文件中,有这样的配置
& lt; fieldType name=" text_ws " class=" solr。文本框”positionIncrementGap=" 100 "比; & lt; analyzer> & lt;记号赋予器类=" solr.WhitespaceTokenizerFactory "/比; & lt;/analyzer> & lt;/fieldType>
对于字段类型text_ws,指定了一个分词器工厂WhitespaceTokenizerFactory,根据这个类,可以实现通过空格来分词,那么我通过竖线分词的代码应该与之类似。
在Java工程中引入如下jar包:
& lt; dependency> & lt; groupId> org.apache.solr & lt; artifactId> solr-core & lt; version> 6.0.0 & lt;/dependency>
参照WhitespaceTokenizerFactory的源码,写一个自己的MyVerticalLineTokenizerFactory,内容基本不变:
包com.trainning.project.custom; 进口java.util.Arrays; 进口java.util.Collection; 进口java.util.Map; 进口org.apache.lucene.analysis.Tokenizer; 进口org.apache.lucene.analysis.core.UnicodeWhitespaceTokenizer; 进口org.apache.lucene.analysis.util.TokenizerFactory; 进口org.apache.lucene.util.AttributeFactory;/* * * @author JiangChao * @date 2017年4月2日下午3:41:13 */公开课MyVerticalLineTokenizerFactory延伸TokenizerFactory { 公共静态最终字符串RULE_JAVA=癹ava”; 公共静态最终字符串RULE_UNICODE=皍nicode”; 私有静态最终CollectionRULE_NAMES=数组。asList (RULE_JAVA RULE_UNICODE); 私人最终字符串的规则;/* *创建一个新的MyVerticalLineTokenizerFactory */公共MyVerticalLineTokenizerFactory (Map<字符串,String>args) { 超级(args); 规则=得到(args,“规则”,RULE_NAMES RULE_JAVA); 如果(! args.isEmpty ()) { 把新IllegalArgumentException(“未知参数:”+ args); } } @Override 公共记号赋予器创建(AttributeFactory工厂){ 开关(规则){ 案例RULE_JAVA: 返回新MyVerticalLineTokenizer(工厂); 案例RULE_UNICODE: 返回新UnicodeWhitespaceTokenizer(工厂); 默认值: 把新AssertionError (); } } }
具体做分词的MyVerticalLineTokenizer代码如下
包com.trainning.project.custom; 进口org.apache.lucene.analysis.util.CharTokenizer; 进口org.apache.lucene.util.AttributeFactory;/* * * @author JiangChao * @date 2017年4月2日下午9:46:18 */公开课MyVerticalLineTokenizer延伸CharTokenizer { 公共MyVerticalLineTokenizer () { } 公共MyVerticalLineTokenizer (AttributeFactory工厂){ 超级(工厂); }/* *收集>/* *收集> & lt; fieldType name=皏ertical_text”class=皊olr.TextField”比; & lt; analyzer> & lt;记号赋予器类=" com.trainning.project.custom.MyVerticalLineTokenizerFactory "/比; & lt;/analyzer> & lt;/fieldType> & lt;字段名="自定义" type=" vertical_text "索引=" true "=癴alse”/存储在
注意这里的类是刚才自己写的分词器的完整类名。
打开Solr主页,在分析页面测试一下,是否实现了预期?
<>强源码下载:强>
GitHub:下载地址
本地下载:链接地址
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。