我有一个如下的查询,当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
2条答案
按热度按时间57hvy0tb1#
这个
date_partition
字段应该有date
类型和format=yyyyMMdd
,这是唯一可以使用的合理类型,而不是long
甚至更糟的float
。查询
20220108
并在结果中返回20220109
文档是不合逻辑的。使用
date
类型还允许您使用适当的基于时间的range
查询,并在数据上创建date_histogram
聚合。您可以使用适当的类型重新创建索引并重新索引数据,也可以向现有索引添加新字段并通过查询更新索引。这两个选项都有效。
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,但我不确定这是否干净)。