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

最近有一個需求舷胜,需要修改ES文檔中的金額叁扫,以前是以為單位枕扫,現(xiàn)在要換算成以萬元為單位陪腌,但并不是所有數(shù)據(jù)都需要做處理,有一個Excel存儲著不需要處理的數(shù)據(jù)。我第一時間想到的就是用Python寫一個腳本處理ES文檔诗鸭,噼里啪啦一頓操作之后商叹,基本就實現(xiàn)了該功能。但是處理的結果并不是預期的那樣只泼。下面我簡單的舉一個例子來復現(xiàn)一下我所遇到的問題剖笙。

首先,創(chuàng)建一個索引test,

# 創(chuàng)建test索引
PUT test

給索引設置mapping屬性请唱,

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

給索引添加幾條測試文檔數(shù)據(jù)弥咪,

# 批量插入數(shù)據(jù)
POST _bulk
{"index": {"_index": "test"}}
{"id":"1", "money": 23423123}
{"index": {"_index": "test"}}
{"id":"2","money": 1233656}
{"index": {"_index": "test"}}
{"id":"3", "money":899234}

既然要更新文檔數(shù)據(jù),肯定要用到ES的_update_by_queryAPI十绑。我們現(xiàn)在將每個文檔的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"
        }
      }
    ]
  }
}

很明顯更新后的結果去掉了小數(shù)點后面的數(shù)甚亭,這并不是我想要的贷币。這是怎么回事呢?經過查找很多的資料亏狰,最終在官方文檔里找到這么一句話:

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.

最后一句話的意思很明了役纹,“整數(shù)相除會丟棄結果值的余數(shù)部分”。既然整數(shù)會有這種情況暇唾,那么我將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"
        }
      }
    ]
  }
}

這才是想要的結果瘸味。從整體的實現(xiàn)來看,雖然功能很簡單够挂,但是一些細節(jié)的地方處理不到位旁仿,很可能就耽誤你很多的時間。用這時間來摸魚下硕,它不香嗎丁逝。

注:Elasticsearch版本是7.8.0汁胆,以上操作都是通過kibana執(zhí)行的梭姓。

相關鏈接:https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-operators-numeric.html


獲取最新文章,可關注博客地址:https://jenkinwang.github.io/嫩码,或掃碼關注微信公眾號:一只慵懶的程序猿誉尖。

qrcode_for_gh_7e1da67205e4_258.jpg

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铸题,隨后出現(xiàn)的幾起案子铡恕,更是在濱河造成了極大的恐慌琢感,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件探熔,死亡現(xiàn)場離奇詭異驹针,居然都是意外死亡,警方通過查閱死者的電腦和手機诀艰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門柬甥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人其垄,你說我怎么就攤上這事苛蒲。” “怎么了绿满?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵臂外,是天一觀的道長。 經常有香客問我喇颁,道長漏健,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任橘霎,我火速辦了婚禮漾肮,結果婚禮上,老公的妹妹穿的比我還像新娘茎毁。我一直安慰自己克懊,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布七蜘。 她就那樣靜靜地躺著谭溉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橡卤。 梳的紋絲不亂的頭發(fā)上扮念,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音碧库,去河邊找鬼柜与。 笑死,一個胖子當著我的面吹牛嵌灰,可吹牛的內容都是我干的弄匕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼沽瞭,長吁一口氣:“原來是場噩夢啊……” “哼迁匠!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤城丧,失蹤者是張志新(化名)和其女友劉穎延曙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亡哄,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡枝缔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚊惯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魂仍。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拣挪,靈堂內的尸體忽然破棺而出擦酌,到底是詐尸還是另有隱情,我是刑警寧澤菠劝,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布赊舶,位于F島的核電站,受9級特大地震影響赶诊,放射性物質發(fā)生泄漏笼平。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一舔痪、第九天 我趴在偏房一處隱蔽的房頂上張望寓调。 院中可真熱鬧,春花似錦锄码、人聲如沸夺英。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痛悯。三九已至,卻和暖如春重窟,著一層夾襖步出監(jiān)牢的瞬間载萌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工巡扇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扭仁,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓厅翔,卻偏偏與公主長得像乖坠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子知给,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359