ElasticSearch在无痛脚本中舍入浮点值

时间:2018-01-30 15:41:16

标签: elasticsearch elasticsearch-5 elasticsearch-painless

我在使用ElasticSearch的脚本功能时注意到了舍入问题。 我有以下映射:

{
  "my-index": {
    "mappings": {
      "my-document": {
        "properties": {
          "id": {
            "type": "long"
          },
          "foo": {
            "type": "float"
          }
        }
      }
    }
  }
}

和一堆索引的文件。一个文档的159944154.8644字段的值为foo。当我发送以下查询时:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "id": 42 } }
      ]
    }
  },
  "_source": {
    "includes": ["id","foo"]
  },
  "script_fields": {
    "foo_scripted": {
      "script": {
        "lang": "painless",
        "inline": "doc['foo'].value"
      }
    }
  }
}

我得到以下舍入值作为回应:

{
  "_index": "my-index",
  "_type": "my-document",
  "_id": "42",
  "_score": 1,
  "_source": {
    "foo": 1.599441548644E8, //= 159944154.8644 -> correct!
    "id": 42
  },
  "fields": {
    "foo_scripted": [
      1.5994416E8 //= 159944160.0 -> rounded :(
    ]
  }
}

知道如何解决这个问题吗?提前谢谢。

ES版本:5.3.0

1 个答案:

答案 0 :(得分:1)

映射将字段类型设置为"float",这是一个单精度的32位IEEE 754浮点数。此浮点表示最多可以存储9 significant decimal digits。尝试将字段类型更改为"double",这是一个双精度64位IEEE 754浮点数。