第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

Elasticsearch中Script腳本執(zhí)行除法遇到的問題

標(biāo)簽:
Java Python

最近有一个需求,需要修改ES文档中的金额,以前是以为单位,现在要换算成以万元为单位,但并不是所有数据都需要做处理,有一个Excel存储着不需要处理的数据。我第一时间想到的就是用Python写一个脚本处理ES文档,噼里啪啦一顿操作之后,基本就实现了该功能。但是处理的结果并不是预期的那样。下面我简单的举一个例子来复现一下我所遇到的问题。

首先,创建一个索引test,

# 创建test索引
PUT test

给索引设置mapping属性,

# 设置索引mapping属性
PUT test/_mapping
{
  "properties": {
    "id": {"type": "keyword"},
    "money": {"type": "double"}
  }
}

给索引添加几条测试文档数据,

# 批量插入数据
POST _bulk
{"index": {"_index": "test"}}
{"id":"1", "money": 23423123}
{"index": {"_index": "test"}}
{"id":"2","money": 1233656}
{"index": {"_index": "test"}}
{"id":"3", "money":899234}

既然要更新文档数据,肯定要用到ES的_update_by_queryAPI。我们现在将每个文档的money值除以10000,先自己考虑一下应该会得到一个什么样的结果。

# 更新操作,将每个文档的money除以10000
POST test/_update_by_query
{
  "script": {
    "source": "ctx._source.money=ctx._source.money/10000",
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}

有结果了吗?我们来看看ES给我们处理后的结果是啥样的,

# 查看文档
GET test/_search

# 结果
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "LtrDs3MBvTJiRW6OWDLQ",
        "_score" : 1.0,
        "_source" : {
          "money" : 2342,
          "id" : "1"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "MNrDs3MBvTJiRW6OYTJx",
        "_score" : 1.0,
        "_source" : {
          "money" : 123,
          "id" : "2"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "MtrDs3MBvTJiRW6OaTLM",
        "_score" : 1.0,
        "_source" : {
          "money" : 89,
          "id" : "3"
        }
      }
    ]
  }
}

很明显更新后的结果去掉了小数点后面的数,这并不是我想要的。这是怎么回事呢?经过查找很多的资料,最终在官方文档里找到这么一句话:

Use the division operator '/' to DIVIDE one numeric type value by another. Rules for NaN values and division by zero follow the JVM specification. Division with integer values drops the remainder of the resultant value.

最后一句话的意思很明了,“整数相除会丢弃结果值的余数部分”。既然整数会有这种情况,那么我将10000 换成10000.0再来试试,

# 更新操作,将每个文档的money除以10000.0
POST test/_update_by_query
{
  "script": {
    "source": "ctx._source.money=ctx._source.money/10000.0",
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}

这次的更新结果如下,

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "Ptq5s3MBvTJiRW6OoTEW",
        "_score" : 1.0,
        "_source" : {
          "money" : 2342.3123,
          "id" : "1"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "QNq5s3MBvTJiRW6OpzFr",
        "_score" : 1.0,
        "_source" : {
          "money" : 123.3656,
          "id" : "2"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "Qdq5s3MBvTJiRW6OrjEB",
        "_score" : 1.0,
        "_source" : {
          "money" : 89.9234,
          "id" : "3"
        }
      }
    ]
  }
}

这才是想要的结果。从整体的实现来看,虽然功能很简单,但是一些细节的地方处理不到位,很可能就耽误你很多的时间。用这时间来摸鱼,它不香吗。

注:Elasticsearch版本是7.8.0,以上操作都是通过kibana执行的。


获取最新文章,可关注博客地址:https://jenkinwang.github.io/

點擊查看更多內(nèi)容
2人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消