6

我正在使用新发布的 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") 总是返回空值。

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

有任何想法吗?谢谢!

乔恩

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

SlowCompositeReaderWrapper 是罪魁祸首吗?

4

2 回答 2

12

根据TextField API,它是“一个被索引和标记的字段,没有术语向量。” 如果您希望存储 TermVectors,您应该只使用一个Field并将其设置为将 TermVectors 存储在FieldType中。

就像是:

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);
于 2013-01-16T20:24:22.943 回答
2

您正在使用 TextField,这是一个被索引和标记的字段,没有术语向量。这就是为什么你会在 getTermVector() 上得到 null。不使用 TextField,而是使用自定义的 FieldType 构造 Field,其中 setStoreTermVectors 为 true。

于 2013-03-01T05:10:02.473 回答