创建 s 是 s 的源。属性控制 的行为,这是用于读取/跟踪 的数据流的基础机制。AttributeFactory
AttributeImpl
Attribute
TokenStream
StandardTokenizer
从4.x到5.x几乎没有变化 - 在这两个版本中,如果你愿意,你可以创建一个,或者如果你不指定一个,那么最终将被使用。AttributeFactory
StandardTokenizer
AttributeFactory
AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY
最大的区别在于,您还可以将输入流作为构造函数的一部分传入。这意味着在 4.x 中,您必须为要处理的每个输入流创建一个新的 StreamTokenizer,这反过来必须重新初始化 .Reader
AttributeFactory
我不是Lucene开发人员,但我的猜测是,这只是一个重组,以鼓励在读取多个流时重用属性。如果您看一下TokenStream的内部结构和默认的属性工厂实现,就会发现创建和设置属性涉及很多反射。如果我不得不猜测,获取读取器的构造函数刚刚被删除,以鼓励重用分词器及其属性,因为这些属性的初始化相对昂贵。StreamTokenizer
编辑
添加一个早就应该举的例子 - 很抱歉没有以这个开头:
// 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...
}