Lucene 6.6.0中的索引时间字段级别提升?

时间:2017-08-22 15:46:31

标签: lucene scoring lucene-boosting

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

2 个答案:

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