ドキュメントのコレクションから、lucene を使用してインデックスを作成しました。私のドキュメントには 2 つのフィールドがあり、次のようにインデックスに追加されました。
Document doc = new Document();
doc.add(new TextField("Title", "I am a title", Field.Store.NO));
doc.add(new TextField("Text", "random text content", Field.Store.NO));
indexWriter.addDocument(doc);
インデックスを読み取り、すべての (term, doc) ペアの用語-頻度を取得したいと考えています。
フィールドが 1 つしかない場合、「テキスト」としましょう。次のコードを使用します。
IndexReader indexReader = ...;
Terms terms = MultiFields.getTerms(indexReader, "Text"); // get all terms of this field
TermsEnum termsIterator = terms.iterator();
BytesRef term;
// For every term in the "Text" Field:
while ((term = termsIterator.next()) != null) {
String termString = term.utf8ToString(); // The term
PostingsEnum postingsEnum = MultiFields.getTermDocsEnum(indexReader,
"Text", term, PostingsEnum.FREQS);
int i;
// For every doc which contains the current term in the "Text" field:
while ((i = postingsEnum.nextDoc()) != PostingsEnum.NO_MORE_DOCS) {
Document doc = indexReader.document(i); // The document
int freq = postingsEnum.freq(); // Frequency of term in doc
}
}
ただし、2 つのフィールド (「タイトル」と「テキスト」) があるため、(用語、ドキュメント) ペアの用語と頻度の合計を取得するには、まずget every (term, doc) pair frequency for the "Title" field
それらをメモリに保存してからget every (term, doc) pair frequency for the "Text" field
手動で結合する必要があります。返された一意の (用語、ドキュメント) ペアごとに。
同じ (term, doc) ペアが「タイトル」フィールドと「テキスト」フィールドの両方に存在する可能性があるため (ドキュメントに同じ用語がある場合)、このメソッドは (term, doc) ペアを複数回反復する可能性が非常に高い彼の「タイトル」と「テキスト」で)。
Lucene API を使用して、代わりにすべてのフィールドを組み合わせて反復処理する方法はありますか? (同じペアを複数回繰り返すのを避けるため)