在Lucene 6.6.0及更高版本中,字段级索引时间提升为deprecated。文档说明:
不推荐使用索引时间提升,请索引索引时间评分 因素进入doc值字段并将它们与得分相结合 查询时间使用例如。 FunctionScoreQuery。
以前会在索引时提升一个字段,如下所示:
Field title = new Field(PaperDAO.LUCENE_FIELD_TITLE, titleStr, fieldType);
title.setBoost(3.00f);
document.add(title);
Field authors = new Field(PaperDAO.LUCENE_FIELD_AUTHOR, StringEscapeUtils.unescapeHtml4(this.getAuthorsForLucene()), fieldType);
authors.setBoost(10.00f);
document.add(authors);
我不明白建议的FunctionScoreQuery是否适合替代字段级提升,因为只构建一个FunctionScoreQuery,只给出一个现有的Query和一个DoubleValuesSource,表示只有一个可能很多字段的提升值:
// INDEX TIME
Field title = new Field(PaperDAO.LUCENE_FIELD_TITLE, titleStr, fieldType);
document.add(title);
document.add(new FloatDocValuesField(PaperDAO.LUCENE_FIELD_TITLE + "_boost", 3.00f));
// QUERY TIME
new FunctionScoreQuery(query, DoubleValuesSource.fromFloatField(PaperDAO.LUCENE_FIELD_TITLE + "_boost"))
有人可以在Lucene> = 6.6.0中解释Field#setBoost @ index time的相应替换吗?我们是否应该在查询时枚举所有可能的字段并应用相关的提升?如果是这样,该查询是如何构建的?
答案 0 :(得分:1)
首先,您仍然有时间使用旧式索引时间提升,因为它们只会在 Lucene 7.0中删除:)
在很久以前的社区decided中继续讨论这个主题,指数时间的提升是一项复杂而难以正确的技术。
我认为当前的想法 - 不是用每个字段docvalues字段替换每字段索引时间提升,而是替换docvalues字段中具有1个累积分数的文档的所有索引时间提升,并在以后使用它搜索范围。
请将索引时间评分因素编入doc值字段 并将它们与查询时的分数结合起来
引用来自javadoc,这只会加强我的想法。您可以将多个因子索引到一个字段中。
对我来说,一个悬而未决的问题是 - 如何将几个因素结合起来1.我希望能够测试和验证(使用乘法,求和或某些线性组合)
答案 1 :(得分:0)
如果您想使用FunctionScoreQuery增强其他字段,建议的方法如下(取自CustomeScoreProvider):
要获取更复杂的自定义分数,请使用lucene-expressions库
SimpleBindings bindings = new SimpleBindings(); bindings.add("score", DoubleValuesSource.SCORES); bindings.add("boost1", DoubleValuesSource.fromIntField("myboostfield")); bindings.add("boost2", DoubleValuesSource.fromIntField("myotherboostfield")); Expression expr = JavascriptCompiler.compile("score * (boost1 + ln(boost2))"); FunctionScoreQuery q = new FunctionScoreQuery(inputQuery, expr.getDoubleValuesSource(bindings));