新しくリリースされた Lucene 4 を使用していますが、ドキュメント ターム ベクターに関する API が大幅に変更されていることがわかります。移行に関するドキュメントと、関連するさまざまな雑多なブログ メーリング リストの投稿を読み、API を正しく使用していると確信しています。ただし、私は常に IndexReader.getTermVector() から null の用語参照を取得します。これが私がやっていることです:
// 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");
}
}
もちろん、すべてのドキュメントに null 用語ベクトルがあることが出力されます。つまり、 Reader.getTermVector(i, "body") は常に null を返します。
Luke のインデックスを見ると、body フィールドが格納されているドキュメントがあります。ただし、[ドキュメント] タブの [TV] ボタンをクリックすると、本文フィールドが強調表示され、Luke から「Term Vector が利用できません」と表示されます。インデックス作成時にこの情報を記録するには、他の種類のオプションを追加する必要がありますか?
何か案は?ありがとう!
ジョン
更新IndexReader
問題の は のインスタンスでありSlowCompositeReaderWrapper
、 をラップして
いることに注意してくださいDirectoryReader
。SlowCompositeReaderWrapper
コーパス用語の頻度も必要であり、すべてのドキュメントをすべてのリーフで反復処理する方法が正確に明確ではないため、 a を使用してIndexReader
います (ドキュメント ID はそれら全体で再利用されますか? など)。
SlowCompositeReaderWrapper が原因ですか?