翻译自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的分词结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public static void main(String[] args) throws Exception { Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43); TokenStream stream = null; String str = "中华人民"; stream = analyzer.tokenStream("content", new StringReader(str)); CharTermAttribute attr = stream.addAttribute(CharTermAttribute.class); //1,3 PositionIncrementAttribute posIncr = stream .addAttribute(PositionIncrementAttribute.class); //1,3 OffsetAttribute offset = stream.addAttribute(OffsetAttribute.class); //1,3 TypeAttribute type = stream.addAttribute(TypeAttribute.class); //1,3 stream.reset(); //2 int position = 0; while (stream.incrementToken()) { //4 int increment = posIncr.getPositionIncrement(); if (increment > 0) { position = position + increment; System.out.print(position + ": "); } System.out.println(attr.toString() + "," + offset.startOffset() + "->" + offset.endOffset() + "," + type.type()); } stream.end(); //5 stream.close(); //6 analyzer.close(); } |
Posted in: Lucene
Comments are closed.