我想使用Lucene和以下評分邏輯: 當我索引我的文檔時,我想爲每個字段設置分數/權重。 當我查詢我的索引時,我想爲每個查詢項設置一個分數/權重。自定義lucene評分 - 字段提升和查詢提升之間的點積
我永遠不會索引或查詢具有相同字段的許多實例 - 在每個查詢(文檔)中將有0-1實例具有相同的字段名稱。 我的字段/查詢字詞未被分析 - 它們已經由一個標記構成。
我希望得分只是查詢字段與文檔字段之間的點積,如果它們具有相同的值。
例如:
格式是(字段名稱)(字段值)(場得分)
查詢:
1 AA 0.1
7 BB 0.2
8 CC 0.3
文獻1:
1 AA 0.2
2 DD 0.8
7 CC 0.999
10 FFF 0.1
文獻2:
7 BB 0.3
8 CC 0.5
分數應爲:
分數(Q,D1)= FIELD_1_SCORE_Q * FILED_1_SCORE_D1 = 0.1 * 0.2 = 0.02
分數(Q ,d2)= FIELD_7_SCORE_Q * FILED_7_SCORE_D2 + FIELD_8_SCORE_Q * FILED_8_SCORE_D2 =(0.2 * 0.3)+(0.3 * 0.5)
實現它的最佳方式是什麼?在準確性和性能方面(我不需要TF和IDF計算)。
我目前通過設置字段和查詢條件的提升來實現它。 後來我改寫了DefaultSimilarity類和索引/查詢之前將其設置爲默認:
public class MySimilarity extends DefaultSimilarity {
@Override
public float computeNorm(String field, FieldInvertState state) {
return state.getBoost();
}
@Override
public float queryNorm(float sumOfSquaredWeights) {
return 1;
}
@Override
public float tf(float freq) {
return 1;
}
@Override
public float idf(int docFreq, int numDocs) {
return 1;
}
@Override
public float coord(int overlap, int maxOverlap) {
return 1;
}
}
而基於http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/scoring.html這應該工作。
問題:
- 演出:我計算所有的TF/IDF的東西和規範 什麼...
- 比分我從TopScoreDocCollector得到的是不 一樣我從解釋得到。
這裏是我的代碼部分:
indexSearcher = new IndexSearcher(IndexReader.open(directory, true));
TopScoreDocCollector collector = TopScoreDocCollector.create(iTopN, true);
indexSearcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
for (int i = 0; i < hits.length; ++i) {
int docId = hits[i].doc;
Document d = indexSearcher.doc(docId);
double score = hits[i].score;
String id = d.get(FIELD_ID);
Explanation explanation = indexSearcher.explain(query, docId);
}
謝謝!