script_score使用lang groovy在弹性1.3中返回0

时间:2015-01-05 12:58:15

标签: groovy

我是弹性新手。我正在使用function_score来自定义分数。这是我的代码:

body = {
        "from" : product_per_page*page,
        "size" : product_per_page,
        "query": {
            "function_score": {
                "query": {
                    "bool":{
                        "must": [
                            {
                                "range": {
                                    "price": {
                                        "gte": from_price,
                                        "lte": to_price
                                        }
                                    }
                            }, {
                                "match":{
                                    "text": {
                                        "query": query,
                                        }
                                    },
                                }
                            ]
                        },
                    },
                "script_score": {
                    "script": "floor(_score)*doc['boost'].value",
                    "lang":"groovy"
                    },
                "boost_mode": "replace",
                },
            }
        }

问题是得分总是返回0.0。  当我将脚本设置为:

"script": "_score"

它将返回正确的分数,如0.98977035(介于0.0和1.0之间的数字)。也可以设置为:

"script": "_score + 0.0001"

再次返回正确。但是当我使用它时:

"script": "_score + 1"

它返回1.0或:

"script": "_score *10"

返回0.0(我使用的任何函数"script": "floor(_score)"都返回0.0)。也:

"script": "doc['boost'].value"

返回0.0(doc ['boost']。值介于10,100之间)

我也尝试过:

"script": "32"

它返回32(正如我所料)。所以我猜这个问题很常见。也许当数字很大时,它们会变为0.0。我该怎么办? 感谢

1 个答案:

答案 0 :(得分:2)

我找到了解决方案但不是问题! 如果我使用floor( _score*10.0 ),它将返回正确的答案!(我不知道为什么) 和"script": "doc['boost'].value"它将float转换为Integer(我还没解决浮动的问题)。