我想使用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);
}
谢谢!