11

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

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

但是,在 Lucene 4.0 中,此构造函数已被弃用,new TextField应使用new Field.

但问题TextField在于它不接受TermVector其构造函数。

有没有办法使用新的构造函数在我的 Lucene 4.0 索引中包含术语向量?

谢谢

4

3 回答 3

14

我遇到了同样的问题,所以我只是简单地创建了自己的字段:

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

}

希望这可以帮助

于 2012-08-15T03:41:40.163 回答
13

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

于 2012-08-14T14:01:53.047 回答
0

我被这件事难住了一段时间。这里的其他答案很有帮助,但即使有他们,情况对我来说并不明显。因此,在我终于亮起灯后,我决定添加这个额外的答案,以便让下一个人更清楚。

Field支持术语向量的签名被贬值的原因是因为它使用了Field.TermVector enum从 Lucene 4.0 开始贬值的签名。

Field在 Lucene 4.0 中,向支持传递 a 的类添加了一个新的方法签名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 ));
于 2019-07-02T21:39:21.163 回答