在 Lucene 6.6.0 及更高版本中,不推荐使用字段级索引时间提升。该文档指出:
不推荐使用索引时间提升,请将索引时间评分因素索引到文档值字段中,并将它们与查询时的分数结合使用,例如。函数评分查询。
以前会在索引时提升字段,如下所示:
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 是如何适当替代字段级提升的,因为一个函数仅给定一个现有的 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 的适当替换吗?我们是否应该在查询时枚举所有可能的字段并应用相关的提升?如果是这样,该查询是如何构造的?