Elasticsearch 5.5无痛脚本查询的返回值问题返回值

时间:2017-10-24 14:24:09

标签: java elasticsearch elasticsearch-painless

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

0 个答案:

没有答案