Lucene 3.x では、次のようになりました。
new CustomScoreQuery(bigramQuery, new FieldScoreQuery("bigram-count", Type.BYTE)) {
protected CustomScoreProvider getCustomScoreProvider(IndexReader ir) {
return new CustomScoreProvider(ir) {
public double customScore(int docnum, float bigramFreq, float docBigramCount) {
... calculate Dice's coefficient using bigramFreq and docBigramCount...
if (diceCoeff >= threshold) {
String[] stems = ir.document(docnum).getValues("stems");
... calculate document similarity score using stems ...
}
}
};
}
}
float
このアプローチにより、保存されたフィールドからキャッシュされた値を効率的に取得できました。これを使用して、ドキュメントのバイグラム カウントを取得しました。文字列を取得できなかったため、ドキュメントの類似性スコアを計算するために必要なものを取得するために、ドキュメントをロードする必要がありました。保存されたフィールドを圧縮するように Lucene 4.1 が変更されるまでは、問題なく機能していました。
Lucene 4 の拡張機能を活用する適切な方法は、次のDocValues
ように含めることです。
new CustomScoreQuery(bigramQuery) {
protected CustomScoreProvider getCustomScoreProvider(ReaderContext rc) {
final AtomicReader ir = ((AtomicReaderContext)rc).reader();
final ValueSource
bgCountSrc = ir.docValues("bigram-count").getSource(),
stemSrc = ir.docValues("stems").getSource();
return new CustomScoreProvider(rc) {
public float customScore(int docnum, float bgFreq, float... fScores) {
final long bgCount = bgCountSrc.getInt(docnum);
... calculate Dice's coefficient using bgFreq and bgCount ...
if (diceCoeff >= threshold) {
final String stems =
stemSrc.getBytes(docnum, new BytesRef())).utf8ToString();
... calculate document similarity score using stems ...
}
}
};
}
}
これにより、パフォーマンスが 16 ミリ秒 (Lucene 3.x) から 10 ミリ秒 (Lucene 4.x) に向上しました。