改变Lucene的分数5.2.1

时间:2015-08-26 09:56:30

标签: java search lucene

我想在Lucene 5.2.1中更改我的搜索引擎的评分功能。我只想将函数 f 的输出添加到默认的lucene得分。像这样:

myScore = defaultScore + f(field1, field2)

其中 f 是两个索引文档字段(包含数值)的简单计算。 这个link证明应该可以做这种事情,但根本没有提供代码片段。

  

最后,您可以直接扩展低级别相似性​​以实现新的检索模型,或使用特定于您的应用程序的外部评分因子。例如,自定义相似性可以通过NumericDocValues访问每个文档的值,并将它们集成到分数中。

有人知道怎么做吗?非常感谢

2 个答案:

答案 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