我使用带有过滤器的Elasticsearch 5.5 API FunctionScoreQueries。这里的目标是模仿LinearDecayFunction,但因为我想要使用的值包含在文档中并且在我的java应用程序中不可用,所以我创建了自己的脚本函数。
在我的使用案例中,我操纵日期,并希望对我的文档进行评分,如果他们在特定日期和此日期之间被包含,则说0到1 36个月。
这是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),我得到了正确的值。