Как использовать Стандарттокенизатор от lucene 5.х.х
Есть много примеров, которые показывают, как использовать StandardTokenizer следующим образом:
TokenStream tokenStream = new StandardTokenizer(
Version.LUCENE_36, new StringReader(input));
Но в более новых версиях Lucene этот конструктор недоступен. Новый конструктор выглядит следующим образом:
StandardTokenizer(AttributeFactory factory)
Какова роль этого AttributeFactory и как я могу маркировать строку в более новых версиях Lucene?
1 ответ:
AttributeFactory
создаетAttributeImpl
s, которые являются источниками дляAttribute
s. атрибуты управляют поведениемTokenStream
, который является базовым механизмом, используемым для чтения/отслеживания потока данных дляStandardTokenizer
.Мало что изменилось с 4-го.от x до 5.x относительно
AttributeFactory
- в обеих версиях вы можете создатьStandardTokenizer
сAttributeFactory
, Если хотите, или если вы не укажете один, тоAttributeFactory.DEFAULT_ATTRIBUTE_FACTORY
в конечном итоге будет использоваться.Большая разница заключалась в том, что вы также могли пройти в
Reader
для входной поток как часть конструктора. Это означает, что в 4.x, вы должны были бы создать новый StreamTokenizer для каждого входного потока, который вы хотите обработать, что в свою очередь должно было бы повторно инициализировать атрибуты изAttributeFactory
.Я не Lucene dev, но я предполагаю, что это просто реструктуризация, чтобы стимулировать повторное использование атрибутов при чтении нескольких потоков. Если вы посмотрите на внутренние части TokenStream и значение по умолчанию AttributesFactory реализация, есть много размышлений, связанных с созданием и установкой атрибутов. Если я должен был догадаться, конструктор
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... }