6

新しくリリースされた 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、 をラップして いることに注意してくださいDirectoryReaderSlowCompositeReaderWrapperコーパス用語の頻度も必要であり、すべてのドキュメントをすべてのリーフで反復処理する方法が正確に明確ではないため、 a を使用してIndexReaderいます (ドキュメント ID はそれら全体で再利用されますか? など)。

SlowCompositeReaderWrapper が原因ですか?

4

2 に答える 2

12

TextField APIによると、それは「用語ベクトルのない、インデックスが付けられ、トークン化されたフィールド」です。TermVectors を保存する場合は、Fieldを使用して、 FieldTypeに TermVectors を保存するように設定する必要があります。

何かのようなもの:

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を使用する代わりに、StoreTermVectorsをtrueに設定するカスタマイズされたFieldTypeを使用してFieldを構築します。

于 2013-03-01T05:10:02.473 に答える