Ответ 1
AttributeFactory
создает AttributeImpl
, которые являются источниками для Attribute
s. Атрибуты определяют поведение TokenStream
, которое является основным механизмом, используемым для чтения/отслеживания потока данных для StandardTokenizer
.
Мало изменилось с 4.x на 5.x по отношению к AttributeFactory
- в обеих версиях, вы можете создать StandardTokenizer
с AttributeFactory
, если хотите, или если вы этого не сделаете укажите один, затем AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY
в конечном итоге будет использоваться.
Большая разница заключалась в том, что вы могли бы также передать Reader
для входного потока как часть конструктора. Это означает, что в 4.x вам нужно будет создать новый StreamTokenizer для каждого потока ввода, который вы хотите обработать, что, в свою очередь, должно было бы повторно инициализировать атрибуты из AttributeFactory
.
Я не Lucene dev, но я предполагаю, что это всего лишь реструктуризация, чтобы поощрять повторное использование атрибутов при чтении нескольких потоков. Если вы посмотрите на внутренности TokenStream и по умолчанию AttributesFactory, LOT отражения, связанные с созданием и установкой атрибутов. Если бы я должен был догадаться, конструктор 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...
}