如何使用lucene 5.x.x中的StandardTokenizer

时间:2015-05-29 07:27:12

标签: java lucene tokenize

有很多例子展示了如何使用StandardTokenizer:

TokenStream tokenStream = new StandardTokenizer(
            Version.LUCENE_36, new StringReader(input));

但是在较新的Lucene版本中,这个构造函数不可用。新构造函数如下所示:

StandardTokenizer(AttributeFactory factory)

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

1 个答案:

答案 0 :(得分:19)

AttributeFactory创建AttributeImpl s,它们是Attribute的来源。属性控制TokenStream的行为,StandardTokenizer是用于读取/跟踪AttributeFactory数据流的基础机制。

相对于StandardTokenizer而言,从4.x变为5.x几乎没有变化 - 在这两个版本中,如果您愿意,可以使用AttributeFactory创建AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY,或者如果您没有指定,Reader最终将被最终使用。

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

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

修改

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

pip install ephem