我正在使用带有过滤器的 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),我得到了正确的值。