提问者:小点点

在Lucene 4中,IndexReader. getTermVector(docID,field Name)为每个文档返回null


我正在使用新发布的Lucene 4,我知道与文档术语向量相关的API发生了很大变化。我已经阅读了迁移文档和相关的各种博客邮件列表帖子,我相信我正确地使用了API。然而,我总是从IndexReader. getTermVector()中得到一个空术语引用。这是我正在做的:

// Indexing, given "bodyString" as a String containing document text
Document doc = new Document();
doc.add(new TextField("body", bodyString, Field.Store.YES));
MyIndexWriter.addDocument(doc);


// much later, enumerating document term vectors for "body" field for every doc
for (int i = 0; i < Reader.maxDoc(); ++i) {
  final Terms terms = Reader.getTermVector(i, "body");
  if (terms != null) {
    int numTerms = 0;
    // record term occurrences for corpus terms above threshold
    term = terms.iterator(term);
    while (term.next() != null) {
      ++numTerms;
    }
    System.out.println("Document " + i + " had " + numTerms + " terms");
  }
  else {
    System.err.println("Document " + i + " had a null terms vector for body");
  }
}

当然,它打印出我对每个文档都有空的术语向量,即Reader. getTermVector(i,"body")总是返回null。

当我在卢克中查看索引时,我有存储了正文字段的文档。然而,当我点击“电视”按钮(在文档选项卡中)同时突出显示正文字段时,卢克告诉我“术语向量不可用”索引时,我需要添加其他类型的选项来记录此信息吗?

有什么想法吗?谢谢!

乔恩

更新我应该注意到有问题的IndexReaderSlowCompositeReaderWrapper的一个实例,它包装了一个DirectoryReader。我使用SlowCompositeReaderWrapper是因为我也想要语料库术语频率,并且不清楚如何在所有IndexReader叶子上迭代所有文档(文档ID在它们之间重复使用吗?等等)。

SlowCompositeReaderWrapper是罪魁祸首吗?


共2个答案

匿名用户

根据TextFieldAPI它是“一个被索引和标记化的字段,没有术语向量。”如果你想存储术语向量,你应该只使用一个字段,并将其设置为在字段类型中存储术语向量。

像这样的东西:

Document doc = new Document();
FieldType type = new FieldType();
type.setIndexed(true);
type.setStored(true);
type.setStoreTermVectors(true);
Field field = new Field("body", bodyString, type);
doc.add(field);
MyIndexWriter.addDocument(doc);

匿名用户

您正在使用TextField,这是一个索引和标记化的字段,没有术语向量。这就是为什么您会在getTermVector()上得到null。与其使用TextField,不如使用自定义的FieldType构造Field,该FieldType将StoreTermVector设置为true。