如何使用lucene 5.xx的StandardTokenizer

sam*_*amy 13 java lucene tokenize

有很多示例显示如何使用StandardTokenizer,如下所示:

TokenStream tokenStream = new StandardTokenizer(
            Version.LUCENE_36, new StringReader(input));
Run Code Online (Sandbox Code Playgroud)

但在较新的Lucene版本中,此构造函数不可用.新构造函数如下所示:

StandardTokenizer(AttributeFactory factory)
Run Code Online (Sandbox Code Playgroud)

这个AttributeFactory的作用是什么?如何在较新版本的Lucene中对String进行标记?

rus*_*der 18

AttributeFactory创建AttributeImplS的是源Attribute秒.属性控制着行为TokenStream,这是用于读取/跟踪数据流的基础机制StandardTokenizer.

小已从4.x的改变关于到5.x AttributeFactory-两个版本中,您可以创建一个StandardTokenizer带有AttributeFactory如果你愿意,或者如果你不指定一个,然后AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY将最终落得被使用.

最大的区别是你也可以传入一个Reader输入流作为构造函数的一部分.这意味着在4.x中,您必须为要处理的每个输入流创建一个新的StreamTokenizer,这反过来又必须从中重新初始化属性AttributeFactory.

我不是Lucene dev,但我的猜测是,这只是一个重组,鼓励在多个流的读取中重用属性.如果您看一下TokenStream的内部结构和默认的AttributesFactory实现,那么创建和设置属性会涉及很多反射.如果我不得不猜测,StreamTokenizer只需删除带有阅读器的构造函数,以鼓励重用tokenizer及其属性,因为这些属性的初始化相对昂贵.

编辑

添加一个姗姗来迟的例子 - 抱歉不带领这个:

// Define your attribute factory (or use the default) - same between 4.x and 5.x
AttributeFactory factory = AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY;

// Create the tokenizer and prepare it for reading
//  Lucene 4.x
StandardTokenizer tokenizer = 
        new StandardTokenizer(factory, new StringReader("Tokenize me!"));
tokenizer.reset();
//  Lucene 5.x
StandardTokenizer tokenizer = new StandardTokenizer(factory);
tokenizer.setReader(new StringReader("Tokenizer me!"));
tokenizer.reset();

// Then process tokens - same between 4.x and 5.x
// NOTE: Here I'm adding a single expected attribute to handle string tokens,
//  but you would probably want to do something more meaningful/elegant
CharTermAttribute attr = tokenizer.addAttribute(CharTermAttribute.class);
while(tokenizer.incrementToken()) {
    // Grab the term
    String term = attr.toString();

    // Do something crazy...
}
Run Code Online (Sandbox Code Playgroud)