如何使用TermVector Lucene 4.0

时间:2012-08-14 04:17:45

标签: java search lucene

在索引方法中,我使用以下行:

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

但是,在Lucene 4.0中,不推荐使用此构造函数,而应使用new TextField代替new Field

TextField的问题在于它在构造函数中不接受TermVector

有没有办法在使用新构造函数的Lucene 4.0索引中包含Term Vector?

由于

3 个答案:

答案 0 :(得分:13)

我遇到了同样的问题,所以我只是创建了自己的Field:

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);
}

}

希望这有帮助

答案 1 :(得分:12)

对于需要没有术语向量的索引字段的用户,TextField是一个便利类。如果您需要术语向量,只需使用Field。它需要更多代码行,因为您需要首先创建FieldType的实例,将storeTermVectorstokenizer设置为true,然后在{{{{}}}中使用此FieldType实例1}}构造函数。

答案 2 :(得分:0)

我为此感到困惑了一段时间。这里的其他答案很有帮助,但即使有了它们,情况对我也不明显。因此,在终于为我点亮之后,我决定添加此附加答案,以使下一个人更清楚一些。

支持术语向量的Field签名被贬值的原因是因为它利用了{Lucene 4.0以来已贬值的Field.TermVector enum

在Lucene 4.0中,新的方法签名已添加到Field类中,该方法签名支持传递FieldType。与以前的FieldType方法相比,enum类更加灵活,并且可以设置比以前更多的Field选项。

这里是一个示例,该示例说明了如何在实例化FieldType对象时通过传递Field对象来创建不存储的Text字段,以支持术语向量。

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

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