3

我正在使用带有过滤器的 Elasticsearch 5.5 API FunctionScoreQueries。这里的目标是模仿 LinearDecayFunction,但是因为我想要使用的值包含在文档中,并且在我的 java 应用程序中不可用,所以我正在创建自己的脚本函数。

在我的用例中,我正在处理日期,如果文档包含在某个日期和该日期减去 36 个月之间,那么我想从 0 到 1 对我的文档进行评分。

这是java代码:

FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions = {
    new FunctionScoreQueryBuilder.FilterFunctionBuilder(mydateFilter, 
    ScoreFunctionBuilders.scriptFunction(
        "...
        [Some painless logic;] 
        ..." +
        "return monthBetween/36.0;"))
};

QueryBuilder fqb = QueryBuilders.functionScoreQuery(functions);
qb.must(fqb);

最后我得到了两个日期之间的月数(这个数字是从 0 到 36),并希望得到这个数字除以 36。

第一个问题

如果我的脚本的返回值低于 1,我就不能让它工作,这正常吗?

输出 :

"value": 1,                               
"description": "No function matched",
"details": []

ES juste 将值固定为 1,忽略我的脚本函数。

第二个问题:

(作为第一个问题的解决方法,我返回 1 + monthBetween/36.0 在我的示例中,那么我的全局分数中的偏移量为 1)

如果我返回变量 monthBetween,我得到 35,这是正确的,因为我的日期之间的偏移量实际上是 35 个月。

当我返回1+monthBetween/36.0时结果是正确的(1,972222222),但逻辑很糟糕,因为日期与预期的日期相差甚远,因此我希望分数离 1 更近。然后我2-monthBetween/36.0为了测试而返回。Elasticsearch 返回 1.9444444 作为结果。这在数学上是不正确的,我不明白为什么。

编辑:我必须补充一点,如果我将我的 return 语句设置为2-35.0/36.0(删除我的变量 monthBetween),我得到了正确的值。

4

0 回答 0