lucene TokenStream 文档

11月 19, 2015 |

翻译自lucene 4.3.0
TokenStream遍历token(就是一个个的分词)序列,这些token可能来自于Document的Field或者查询字符串

这是一个抽象类,具体的子类有
Tokenizer,它的输入为一个Reader对象
TokenFilter,输入是另一个TokenStream

在2.9版本引入了一个新的API,原来基于token,现在基于属性(Attribute)。虽然Token类在2.9中作为一个方便类仍然存在。推荐存储token信息的方式是使用AttributeImpls(新的基于属性api的一个类)。
现在TokenStream继承于AttributeSource,后者提供了访问token属性的方法。每一种类型的AttributeImpl只创建一个实例,每个token重用这些实例来减少创建对象和支持本地缓存AttributeImpl对象。可以查看incrementToken()方法获取更多的信息

新的TokenStream API的流程如下:

1)在初始化TokenStream时添加对应的属性,比如KeywordTokenizer文件中如下代码
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
2)客户端调用TokenStream.reset()
3)客户端获取需要访问的属性的本地引用
4)客户端调用incrementToken()直到返回false,每次调用就可以获取对应的token的属性
5)客户端调用end()方法让TokenStream执行扫尾操作
6)客户端使用完TokenStream后调用close()释放资源
为了让过滤器和消费者知道哪些属性是可用的,属性要在初始化的时候加入TokenStream中,客户端和过滤器不需要在调用incrementToken()方法后检查属性是否可用
你可以在analysis包级的javadoc中发现一些示例
有时需要捕获当前TokenStream对象的状态,比如,为了缓存(参考CachingTokenFilter, TeeSinkTokenFilter)。可以使用AttributeSource.captureState 和 AttributeSource.restoreState方法来做这个事。
TokenStream 新的API基于装饰模式(decorator pattern),因为所有非抽象的子类必须为final或者至少incrementToken是final的,当java的断言启用是会检查的

实例,查看Analyzer的分词结果

 

Posted in: Lucene

Comments are closed.