ik分词器适配solr详解

(实际上是在适配lucene)

一.入口 iktokenizerfactory  extentends tokenizerfactory implements resourceloaderaware 

1) solr会实例化该工厂类并调用create(AttributeFactory factory) 方法,其中factory参数由solr传入 , 实例化方法IKTokenizerFactory(Map<String, String> args)中的参数由solr传入,

其中args的来源是解析schemal中的配置文件得到的

2) 实现回调接口中提供的inform()方法, 作用是将自定的词典和停词词典加载到chararrayset实例中, 并通过iktokenizer构造方法将词典加载到分词器中

inform(ResourceLoader resourceLoader)方法中回调的使用:ResourceLoader接口用于本地资源加载, 具体的加载实现可以由调用该方法的用户自行实现(实现ResourceLoader接口), 这里调用者是solr, 该接口也是由solr实现的, 而该接口是由lucence提供的

3) 工厂的实例化, inform()方法, create()方法的执行均由solr控制

4) 使用了简单工厂模式:把对象的使用者和创建者之间解耦,从而提高了系统的扩展性


二. IkTokenizer extentends Tokenizer 

1)  tokneizer是一个抽象类, 继承自TokenStream抽象类, 将TokenStream 作为最主要的结构进行分析

2) Tokenstream extends AttributeSource implements Closeable. TokenStream相当于一个迭代器, 通过increamentToken()迭代获取token, token的来源是ik分词器实现的, TokenStream只是负责将获取的token赋予属性而已,在每次对token属性赋值前需要调用Attribute提供的clearAttributes()方法来清空上次遗留的属性信息

3) AttributeSource类被TokenizerStreamn继承, 这个类是用来管理token属性的, 在TokenStream的increamentToken()的方法中对token赋予属性前, 要先将各种属性填充到AttributeSource中, 填充属性的由AttributeSource提供的addAttribute(Class<T> attClass)方法实现, 而填充属性到AttributeSource的时机是在TokenStream的子类实例化时完成, 即IKTokenizer实例化将属性填充

4) TokenStream 实现了Closeable接口, 就必然要实现close()方法, 该方法用来释放TokenStream占用的流数据(在ikTokenizer里应该就是原始ik分词器占用的流), 当对一个句子分词结束时调用, 释放该句子的流数据占用

5) 此外, TokenStream 还必须实现reset()方法, 在每次对一个新的句子分词前调用, 用来初始化分词器, 清空上次分词时的遗留信息; 还必须实现在一个句子分词结束后调用end()方法, 用来对最后一个分词结果做处理


TokenStream的工作流程:
1、实例化Tokenizer或TokenFilter,,添加属性到AttributeSource,或从AttributeSource中获取属性。
2、调用reset()方法
3、从流中和存储本地引用检索想要访问所有属性
4、调用increamStoken()方法,直到返回false
5、调用end()方法执行任何end-of-stream操作
6、调用close()方法在结束使用TokerStream释放一些资源
end()、reset()、close()的覆盖通常要调用super.end()、super.reset()、super.close()

示例

IKTokenizer ik = getIK();
		try {
			ik.setReader(new StringReader(content));
			ik.reset();

			// 迭代获取分词结果
			while (ik.incrementToken()) {
				words.add(ik.getTermAtt().toString());
			}
			// 关闭TokenStream(关闭StringReader)
			ik.end();
			ik.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		return words;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值