我想在Lucene 5.2.1中更改我的搜索引擎的评分功能。我只想将函数 f 的输出添加到默认的lucene得分。像这样:
myScore = defaultScore + f(field1, field2)
其中 f 是两个索引文档字段(包含数值)的简单计算。 这个link证明应该可以做这种事情,但根本没有提供代码片段。
最后,您可以直接扩展低级别相似性以实现新的检索模型,或使用特定于您的应用程序的外部评分因子。例如,自定义相似性可以通过NumericDocValues访问每个文档的值,并将它们集成到分数中。
有人知道怎么做吗?非常感谢
答案 0 :(得分:1)
我认为 https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/ContactCards 可能就是您想要的。 CustomScoreQuery的链接是
在Lucene 5.2.1。以下是有关尝试使用 import org.apache.lucene.index.{ Term, IndexReader }
import org.apache.lucene.search.{ TermQuery, Query }
import org.apache.lucene.search.function.{ CustomScoreProvider, CustomScoreQuery }
class CustomizedScoreProvider(reader: IndexReader) extends
CustomScoreProvider(reader) {
protected override def customScore(doc: Int,
subQueryScore: Float, valSrcScores: Array[Float]): Float = {
try {
// subQueryScore is the default score you get from
// the original Query
val currentDocument = reader.document(doc)
// get the value of two field1, field2,
// make sure the two fields are stored since you have to retrieve the value
val field1Value = currentDocument.get("field1")
val field2Value = currentDocument.get("field2")
// write your own logical to compute the extra score, assuming 0 here
val extraScore = 0F
// ignore the valSrcScores here, the original calculation
// is modifiedScore = subQueryScore*valSrcScores[0]*..
subQueryScore + extraScore
} catch {
case _: Exception => subQueryScore
}
}
}
/**
* Create a CustomScoreQuery over input subQuery.
* @param subQuery the sub query whose scored is being customized. Must not be null.
*/
class CustomizedScoreQuery(val subQuery: Query, reader: IndexReader)
extends CustomScoreQuery(subQuery) {
protected override def getCustomScoreProvider(reader: IndexReader) = {
try {
new CustomizedScoreProvider(reader)
} catch {
case _: Exception => super.getCustomScoreProvider(reader)
}
}
}
object CustomizedScoreQueryTest extends App {
val termQuery = new TermQuery(new Term("field", "xxx"))
// get indexSearch, indexReader and wrap the original query
...
val wrappedQuery = new CustomizedScoreQuery(termQuery, indexReader)
val topDocs = indexSearch.search(wrappedQuery, 5)
...
}
中的Lucene 3.6.2完成问题的代码段。
{{1}}
实际上,当我看到你的问题并最终用CustomScoreQuery完成时,我遇到了同样的问题。当您使用CustomScoreQuery更改默认分数时,例如按相关性排序时,文档顺序将根据修改后的分数进行更改。
无论如何,希望它有所帮助。
答案 1 :(得分:0)
在这里,我找到了一个非常详细和准确的解释,说明Lucene评分是如何运作的。此资源也提供了Java代码段。这正是我所寻找的! Doug Turnbull at opensourceconnections