Как использовать TermVector Lucene 4.0

В методе индексирования я использую следующую строку:

Field contentsField = new Field("contents", new FileReader(f), Field.TermVector.YES);

Однако в Lucene 4.0 этот конструктор устарел и new TextField следует использовать вместо new Field.

Но проблема с TextField заключается в том, что она не принимает TermVector в своих конструкторах.

Есть ли способ включить Vector Vector в мою индексацию в Lucene 4.0 с новыми конструкторами?

Спасибо

Ответы

Ответ 1

TextField - это класс удобства для пользователей, которым нужны индексированные поля без векторов. Если вам нужны векторы условий, просто используйте Field. Требуется еще несколько строк кода, так как сначала нужно создать экземпляр FieldType, установить storeTermVectors и tokenizer в true а затем используйте этот экземпляр FieldType в конструкторе Field.

Ответ 2

У меня была та же проблема, поэтому я просто создал собственное поле:

public class VecTextField extends Field {

/* Indexed, tokenized, not stored. */
public static final FieldType TYPE_NOT_STORED = new FieldType();

/* Indexed, tokenized, stored. */
public static final FieldType TYPE_STORED = new FieldType();

static {
    TYPE_NOT_STORED.setIndexed(true);
    TYPE_NOT_STORED.setTokenized(true);
    TYPE_NOT_STORED.setStoreTermVectors(true);
    TYPE_NOT_STORED.setStoreTermVectorPositions(true);
    TYPE_NOT_STORED.freeze();

    TYPE_STORED.setIndexed(true);
    TYPE_STORED.setTokenized(true);
    TYPE_STORED.setStored(true);
    TYPE_STORED.setStoreTermVectors(true);
    TYPE_STORED.setStoreTermVectorPositions(true);
    TYPE_STORED.freeze();
}

// TODO: add sugar for term vectors...?

/** Creates a new TextField with Reader value. */
public VecTextField(String name, Reader reader, Store store) {
    super(name, reader, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED);
}

/** Creates a new TextField with String value. */
public VecTextField(String name, String value, Store store) {
    super(name, value, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED);
}

/** Creates a new un-stored TextField with TokenStream value. */
public VecTextField(String name, TokenStream stream) {
    super(name, stream, TYPE_NOT_STORED);
}

}

Надеюсь, что это поможет

Ответ 3

Я был поставлен в тупик на некоторое время. Другие ответы здесь полезны, но даже с ними ситуация не была очевидна для меня. Поэтому после того, как свет наконец-то зажегся для меня, я решил добавить этот дополнительный ответ, чтобы кое-что прояснить для следующего человека.

Причина, по которой подпись Field которая поддерживает векторы терминов, является Field.TermVector enum заключается в том, что она использует Field.TermVector enum которое Field.TermVector enum с Field.TermVector enum Lucene 4.0.

В Lucene 4.0 в класс Field была добавлена новая сигнатура метода, FieldType вместо этого поддерживает передачу FieldType. Класс FieldType является более гибким, чем старый подход enum и предоставляет возможность установить еще больше параметров поля, чем было ранее доступно.

Вот пример того, как создать текстовое поле, не сохраненное, которое поддерживает векторы терминов, передавая объект FieldType при создании экземпляра объекта Field.

     FieldType specialTextFieldType = new FieldType(TextField.TYPE_NOT_STORED);
     specialTextFieldType.StoreTermVectors = true;

     Document exampleDoc = new Document();
     exampleDoc.Add(new Field("SomeField", someData, specialTextFieldType ));