Elasticsearch 每日一课:存储一个 float 值到 long 字段会怎么样?

本文探讨了在Elasticsearch中将float值存储到long字段的效果,解释了默认Numeric类型、coerce数据处理机制以及为何_search源数据不受影响。通过示例展示了coerce如何转换数据,并在聚合操作中验证了字段的实际类型。强调了Mapping与索引的区别,以及coerce可能的未来变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我们要讨论的主题会让很多新手感到困惑,因为本身这个问题就挺难理解的。但如果你对 ES 比较熟悉,今天的内容也可以测试一下你对 ES 数据类型方面的知识是否牢靠。

一、默认的 Numeric 类型

首先,我们创建一个索引:

PUT orders/_doc/1
{
  "order_id": 1
}

如上示例,利用 Dynamic Mapping,系统会为自动为 orders 索引创建一个 Mapping,那么默认的情况下,order_id 这个字段会被推断为啥类型呢?

下面是这个 orders 索引的 Mapping:

# 获取 Mapping
GET orders/_mapping

# 结果:
{
  "orders" : {
    "mappings" : {
      "properties" : {
        "order_id" : { "type" : "long" }
      }
    }
  }
}

如上示例,很明显 Dynamic Mapping 推断的 order_id 为 long 类型。

那如果我们对这个 order_id 字段写入一些非整型数字会发生啥情况呢?在 Kibana 中执行以下命令来插入文档:

PUT orders/_doc/2
{
  "order_id": 2
}

PUT orders/_doc/3
{
  "order_id": "3"
}

PUT orders/_doc/4
{
  "order_id": 4.5
}

PUT orders/_doc
Elasticsearch中,如果你想将某个字段的数据类型从`long`改为`float`并进行求和聚合(sum),你需要按照以下步骤操作: 1. 首先,在更新索引之前,确保你的数据可以转换成`float`类型,因为不是所有`long`都能直接转换为`float`。如果存在无法转换的情况,需要处理异常或者在代码层面进行过滤。 2. 使用`update-by-query` API 或者 `Index APIs` 的 `upsert` 功能,更新文档,将`long`类型的字段转换为`float`。示例代码(Python): ```python from elasticsearch import Elasticsearch es = Elasticsearch() index_name = 'your_index' type_name = 'your_type' query_body = { "script": { "source": """ ctx._source.your_long_field = ctx.value.your_long_field.float_value """, "lang": "painless" } } update_query = {"query": {"term": {"_id": "your_id"}}} response = es.update_by_query(index=index_name, doc_type=type_name, body=query_body, upsert=query_body) # 如果你想次性批量更新,可以用bulk API bulk_requests = [ { "_index": index_name, "_type": type_name, "_id": doc["_id"], "doc": {f"your_long_field": doc["your_long_field"].astype(float)} } for doc in your_data_list ] bulk_response = es.bulk(body=bulk_requests) ``` 3. 更新完成之后,你可以创建一个新的聚合查询来计算`float`类型的字段之和。例如: ```json { "size": 0, "aggregations": { "sum_float_field": { "sum": { "field": "your_float_field" } } } } ``` 将`your_float_field`替换为你实际修改后的字段名。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值