Как использовать Стандарттокенизатор от lucene 5.х.х


Есть много примеров, которые показывают, как использовать StandardTokenizer следующим образом:

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

Но в более новых версиях Lucene этот конструктор недоступен. Новый конструктор выглядит следующим образом:

StandardTokenizer(AttributeFactory factory)

Какова роль этого AttributeFactory и как я могу маркировать строку в более новых версиях Lucene?

1 14

1 ответ:

AttributeFactory создает AttributeImpls, которые являются источниками для Attributes. атрибуты управляют поведением 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...
}