如何从Lucene TokenStream获取令牌?

我正在尝试使用Apache Lucene进行标记,而我对从TokenStream获取标记的过程感到困惑。

最糟糕的部分是我正在查看解决我的问题的JavaDoc中的注释。

http://lucene.apache.org/java/3_0_1/api/core/org/apache/lucene/analysis/TokenStream.html#incrementToken%28%29

不知何故,一个AttributeSource应该被使用,而不是Token 。 我完全不知所措

任何人都可以解释如何从TokenStream获取类似令牌的信息?

是的,这是一个有点复杂(相比,好的方式),但这应该做到这一点:

 TokenStream tokenStream = analyzer.tokenStream(fieldName, reader); OffsetAttribute offsetAttribute = tokenStream.getAttribute(OffsetAttribute.class); TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class); while (tokenStream.incrementToken()) { int startOffset = offsetAttribute.startOffset(); int endOffset = offsetAttribute.endOffset(); String term = termAttribute.term(); } 

编辑: 新的方式

根据Donotello的说法, TermAttribute已被弃用,以支持CharTermAttribute 。 根据jpountz(和Lucene的文档), addAttributegetAttribute更可取。

 TokenStream tokenStream = analyzer.tokenStream(fieldName, reader); OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); tokenStream.reset(); while (tokenStream.incrementToken()) { int startOffset = offsetAttribute.startOffset(); int endOffset = offsetAttribute.endOffset(); String term = charTermAttribute.toString(); } 

这是应该的(亚当答案的干净版本):

 TokenStream stream = analyzer.tokenStream(null, new StringReader(text)); CharTermAttribute cattr = stream.addAttribute(CharTermAttribute.class); stream.reset(); while (stream.incrementToken()) { System.out.println(cattr.toString()); } stream.end(); stream.close(); 

OP问题有两个变化:

  1. 什么是“从TokenStream获取令牌的过程”?
  2. “任何人都可以解释如何从TokenStream获取类似令牌的信息吗?

最近版本的Token的Lucene文档说(强调增加):

注意:从2.9开始, 不再需要使用令牌,新的TokenStream API可以用作实现所有Attributes的便捷类,这对于轻松地从旧TokenStream API切换到新TokenStream API特别有用。

TokenStream说它的API:

已经从基于Token的模型转移到基于Attribute的模型…存储Token信息的首选方法是使用AttributeImpls。

这个问题的其他答案覆盖了上面的#2:如何使用属性以“新build”的方式从TokenStream获取Token-like信息。 通过阅读文档,Lucene开发人员build议,这种改变的部分原因是为了减less一次创build的单个对象的数量。

但正如有些人在回答中指出的那样,他们并没有直接回答#1:如果你真的想/需要这种types,你怎么得到一个Token

通过使TokenStream成为AttributeSource的相同的API更改, Token现在实现了Attribute并且可以与TokenStream.addAttribute一起使用,就像其他答案显示的CharTermAttributeOffsetAttribute 。 所以他们真的回答了原来问题的这一部分,他们根本没有显示出来。

重要的是,尽pipe这种方法允许您在循环时访问Token ,但不pipestream中有多less个逻辑令牌,仍然只有一个对象。 每次调用incrementToken()都会改变从addAttribute返回的Token的状态; 所以如果你的目标是build立一个不同的Token对象的集合在循环之外使用,那么你将需要做额外的工作来创build一个新的 Token对象作为(深?)副本。