在lucene 4中,IndexReader.getTermVector(docID,fieldName)为每个文档返回null

在lucene 4中,IndexReader.getTermVector(docID,fieldName)为每个文档返回null,lucene,Lucene,我正在使用最新发布的Lucene 4,我知道与文档术语向量相关的API已经发生了很大的变化。我已经阅读了迁移文档和相关的各种博客邮件列表帖子,我相信我正确地使用了API。但是,我总是从IndexReader.getTermVector()返回一个空术语引用。以下是我正在做的: // Indexing, given "bodyString" as a String containing document text Document doc = new Document(); doc.add(new

我正在使用最新发布的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");
  }
}
//索引,给定“bodyString”作为包含文档文本的字符串
单据单据=新单据();
doc.add(新的TextField(“body”,bodyString,Field.Store.YES));
MyIndexWriter.addDocument(doc);
//很久以后,为每个文档的“body”字段枚举文档术语向量
对于(int i=0;i
当然,它打印出每个文档都有null项向量,即Reader.getTermVector(I,“body”)总是返回null

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

有什么想法吗?谢谢

乔恩

更新 我应该注意到,所讨论的
IndexReader
SlowCompositeReaderWrapper
的一个实例,它正在包装一个
DirectoryReader
。我使用的是一个
SlowCompositeReaderWrapper
,因为我还需要语料库术语频率,而且还不清楚如何在所有
IndexReader
页面上迭代所有文档(文档ID在它们之间重用吗?),等等

SlowCompositeReaderWrapper是罪魁祸首吗?

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

比如:

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构建字段,该字段将StoreTermVectors设置为true

是的,在发布后尝试过。Luke现在报告术语向量,但是上面使用的IndexReader.getTermVector()仍然返回null。我将尝试检索文档,然后获取body字段,然后迭代这些术语,看看是否有效。
getTermVector()
为每个文档返回null(即,不会捕获以前测试遗留的文档或删除的文档)?是的。我完全删除了索引文件夹并重新编制了索引。仍然为空。我现在将其用于FieldType选项:
FieldType BodyOptions=new FieldType();BodyOptions.setIndexed(true);BodyOptions.setIndexOptions(IndexOptions.DOCS_和_freques_和_POSITIONS_和_offset);BodyOptions.设置存储(真);BodyOptions.setStoreTermVectors(真);BodyOptions.setTokenized(true);/。。。添加文档(新字段(“正文”、正文字符串、正文选项);