【发布时间】:2015-01-18 09:58:19
【问题描述】:
elasticsearch 似乎是对来自 function_score 的分数进行四舍五入。 我有一个复杂的查询,它使用 function_score 和 has_child 根据孩子的 creation_date 日期对父母进行排序(因此我不能使用排序)。即使在非常简单的情况下,返回分数也会四舍五入:
{
"query": {
"function_score": {
"boost_mode": "replace",
"functions": [
{
"script_score": {
"script": "doc[\"creation_date\"].value"
}
}
]
}
},
"script_fields": {
"date": {
"script": "doc['creation_date'].date"
},
"value": {
"script": "doc['creation_date'].value"
}
}
}
我尝试了不同的 script_score :
doc["creation_date"].date.getMillis()
或(creation_date_ts 与 unixtimestamp 的日期相同)
doc["creation_date_ts"].value
甚至是文字 int:
1416398851930
但无论我使用什么,我都会得到四舍五入的分数。
这是一个结果示例:
{
"_id": "nyrhhh5z",
"_index": "xxx-1416487038",
"_score": 1416398900000,
"_type": "xxx",
"fields": {
"date": [
"2014-11-19T12:07:31.930Z"
],
"value": [
1416398851930
]
}
}
_score 应为 1416398851930(值)四舍五入为 1416398900000。
这是一种正常行为,是否记录在某处(我已经搜索过)?并且它有一种方法可以强制弹性搜索不四舍五入。
elasticsearch 的版本是 1.3.2 (ubuntu 14.04)。
【问题讨论】:
-
嗯。这可能是因为可以作为分数保存的值是一种精度相当有限的类型。 1416398851930 是一个非常大的数字。我建议用较小的数字进行一些测试,我敢打赌,从数字上你会得到准确的精度。
-
我将尝试使用 2010-01-01 的偏移量,例如,谢谢。
-
如果我使用 2013 年它可以工作,但不是 2010 年。那么它会在几年后停止工作。使用 2010 作为纪元偏移 154098451.93(昨天)四舍五入到 154098448,我以为这不是一个大数字。
-
四舍五入甚至不一致 59399774.875 -> 59399776, 59399788.5339999 -> 59399788
-
@gwik 该字段是如何映射的?是否映射为
long?
标签: elasticsearch scoring