(实际上是在适配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;