如何从Lucene TokenStream获取令牌?

Eri*_*son 72 java lucene attributes token tokenize

我正在尝试使用Apache Lucene进行标记,我对从一个获取令牌的过程感到困惑TokenStream.

最糟糕的是,我正在查看解决我的问题的JavaDocs中的注释.

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

不知何故,AttributeSource应该使用an 而不是Tokens.我完全不知所措.

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

Ada*_*ter 112

是的,它有点令人费解(与好的方式相比),但这应该做到:

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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:新的方式

据Donotello称,TermAttribute已被弃用赞成CharTermAttribute.根据jpountz(以及Lucene的文档),addAttribute比起来更可取getAttribute.

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 现在TermAttribute被贬低了.正如我所看到的,我们可以使用类似`CharTermAttributeImpl.toString()`的东西 (6认同)
  • 您应该使用addAttribute而不是getAttribute.来自lucene javadocs:"建议总是在TokenStreams的使用者中使用addAttribute(java.lang.Class),因为你不知道特定的TokenStream是否真的使用了特定的属性"http://lucene.apache.org/core /old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/util/AttributeSource.html#getAttribute(java.lang.Class) (6认同)
  • 不得不用Lucene 4.3调用`reset()`所以冒昧地添加它 (2认同)

yeg*_*256 37

这是应该的样子(亚当答案的简洁版本):

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();
Run Code Online (Sandbox Code Playgroud)

  • 在我在while循环之前添加stream.reset()之前,您的代码无法正常运行.我正在使用Lucene 4.0,所以这可能是最近的变化.请参阅本页底部附近的示例:http://lucene.apache.org/core/4_0_0-BETA/core/org/apache/lucene/analysis/package-summary.html (10认同)