Elasticsearch“data”:{“type”:“float”}查询返回错误结果

snz8szmq  于 2023-04-05  发布在  ElasticSearch
关注(0)|答案(2)|浏览(98)

我有一个如下的查询,当date_partition字段为“type”=〉“float”时,它返回20220109,20220108,20220107这样的查询。当field“type”=〉“long”时,它只返回20220109查询。这就是我想要的。
下面的每个查询,返回的结果就像发送查询20220119一样。--〉20220109,20220108,20220107

PUT date
{
  "mappings": {
    "properties": {
      "date_partition_float": {
        "type": "float"
      },
      "date_partition_long": {
        "type": "long"
      }
    }
  }
}
POST date/_doc
{
  "date_partition_float": "20220109",
  "date_partition_long": "20220109"
}
#its return the query
GET date/_search
{
  "query": {
    "match": {
      "date_partition_float": "20220108"
    }
  }
}
#nothing return
GET date/_search
{
  "query": {
    "match": {
      "date_partition_long": "20220108"
    }
  }
}

这是一个bug还是float类型的工作原理?2年的数据加载到Elasticsearch(如第1天,第2天)(每天20 gb pri分片大小)(总共15 TB)什么是改变这个字段类型的最佳方法?我在我的Map中有5个float类型,什么是最快的方法来改变所有这些类型。注意:在我的脑海里我有下面的解决方案,但我担心它是缓慢的

  • 通过查询API更新
  • 重新索引API
  • 运行时搜索请求(特别是这个)谢谢!x1c 0d1x
57hvy0tb

57hvy0tb1#

这个date_partition字段应该有date类型和format=yyyyMMdd,这是唯一可以使用的合理类型,而不是long甚至更糟的float

PUT date
{
  "mappings": {
    "properties": {
      "date_partition": {
        "type": "date",
        "format": "yyyyMMdd"
      }
    }
  }
}

查询20220108并在结果中返回20220109文档是不合逻辑的。
使用date类型还允许您使用适当的基于时间的range查询,并在数据上创建date_histogram聚合。
您可以使用适当的类型重新创建索引并重新索引数据,也可以向现有索引添加新字段并通过查询更新索引。这两个选项都有效。

9w11ddsr

9w11ddsr2#

这可能是我的问题的答案=〉https://discuss.elastic.co/t/elasticsearch-data-type-float-returns-incorrect-results/300335
您在这里遇到了一些Java的怪癖(但是按照预期构建)。
Float.valueOf(20220109.0f);由于浮点值的舍入问题,结果将返回2.0220108E7,因为它们没有被精确存储。
您可以使用reindex功能将数据重新索引到一个Map固定的索引中(您也可以向现有索引添加新字段并使用update-by-query,但我不确定这是否干净)。

相关问题