7

在 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 的适当替换吗?我们是否应该在查询时枚举所有可能的字段并应用相关的提升?如果是这样,该查询是如何构造的?

4

2 回答 2

1

首先,您仍然有一些时间使用旧式索引时间提升,因为它们只会在Lucene 7.0中被删除:)

继续讨论这个主题,社区很久以前就决定,索引时间提升是一种复杂且难以正确处理的技术。

我认为当前的想法是 - 不是用每个字段 docvalues 字段替换每个字段的索引时间提升,而是用 docvalues 字段中的 1 个累积分数替换文档的所有索引时间提升,然后在搜索期间使用它。

请将 index-time 评分因素索引到 doc value字段中 ,并将它们与查询时的分数结合起来

引用来自javadoc,这只会加强我的这个想法。您可以将多个因素索引到一个字段中。

对我来说,悬而未决的问题是 - 如何将几个因素组合成 1。我希望这是要测试和验证的东西(使用乘法、求和或某种线性组合)

于 2017-09-01T09:25:53.570 回答
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));
于 2018-06-20T14:07:18.293 回答