【问题标题】:function_score scores are roundedfunction_score 分数四舍五入
【发布时间】: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_tsunixtimestamp 的日期相同)

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


【解决方案1】:

_score 值在内部被硬编码为浮点数,它只能准确表示不超过 134217728 的整数。因此,如果您想在评分函数中使用存储为大于的数字的字段那,它将溢出缓冲区并被截断。见this github issue

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2023-01-12
    • 2012-08-04
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多