Подтвердить что ты не робот

Как использовать StandardTokenizer от lucene 5.x.x

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

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

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

StandardTokenizer(AttributeFactory factory)

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

4b9b3361

Ответ 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...
}