Python更新Elasticsearch數(shù)據(jù)方法大全

大家好,我是村長(zhǎng)
今天總結(jié)一下通過(guò) Python 更新 Elasticsearch 數(shù)據(jù)的幾個(gè)方法
Elasticsearch 是一個(gè)實(shí)時(shí)的分布式搜索分析引擎,它能讓你以前所未有的速度和規(guī)模,去探索你的數(shù)據(jù)。它被用作全文檢索、結(jié)構(gòu)化搜索、分析以及這三個(gè)功能的組合
全局更新
在 Elasticsearch 中,通過(guò)指定文檔的 _id, 使用 Elasticsearch 自帶的 index api 可以實(shí)現(xiàn)插入一條 document , 如果該 _id 已存在,將直接更新該 document
因此,通過(guò) index API 來(lái)對(duì)已有的文檔實(shí)現(xiàn)更新,其實(shí)是進(jìn)行了一次 reindex 的操作 如 ES 中已有數(shù)據(jù)如下

通過(guò)代碼將其更新:
es.index(index="test",?doc_type="doc",?id="dfebcXcBCWwWKoXwQ2Gk",?body={
????????????"name":?"Python編程實(shí)戰(zhàn)",
????????????"num":?5})
修改后結(jié)果

通過(guò)這種方法修改,因?yàn)槭?reindex 過(guò)程,所以當(dāng)數(shù)據(jù)量或者 document 很大的時(shí)候,效率非常的低
局部更新
update
Elasticsearch 中的 update API 支持根據(jù)用戶(hù)提供的腳本去實(shí)現(xiàn)更新
Update 更新操作允許 ES 獲得某個(gè)指定的文檔,可以通過(guò)腳本等操作對(duì)該文檔進(jìn)行更新。
可以把它看成是先刪除再索引的原子操作,只是省略了返回的過(guò)程,這樣即節(jié)省了來(lái)回傳輸?shù)木W(wǎng)絡(luò)流量,也避免了中間時(shí)間造成的文檔修改沖突。
在 Python 中可以直接通過(guò)包裝好的接口來(lái)更新
es.update(index="test",?doc_type="doc",?id="4Z6XcXcBChYTHL1ZdwjL",?body={"doc":?{"name":?"Jerry"}})
注意 body 參數(shù),我們需要添加 doc 或者 script 變量來(lái)指定修改的內(nèi)容
增加字段:
es.update(index="test",?doc_type="doc",?id="4Z6XcXcBChYTHL1ZdwjL",?body={"doc":?{"name":?"Jerry",?"age":?25}})
運(yùn)行完之后,在 kibana 上查看結(jié)果

搜索更新
update_by_query
update_by_query,顧名思義,這種更新方式,即通過(guò)查詢(xún)?cè)俑隆?/p>
該方法的優(yōu)點(diǎn)是可以指定某些數(shù)據(jù),然后達(dá)到更新的目的
在 ES 中,我們通過(guò) update_by_query 中的 query 和 script 來(lái)實(shí)現(xiàn)先查詢(xún)?cè)俑碌臋C(jī)制

在上面的操作中:query 字段,表示我們要查詢(xún)的條件,根據(jù)該條件找到對(duì)應(yīng)的數(shù)據(jù) script 字段包含以下關(guān)鍵字:
source 是將要執(zhí)行的腳本內(nèi)容; lang 表示的是當(dāng)前腳本的語(yǔ)言*; param 則是腳本執(zhí)行的參數(shù);
參考詳情:https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-painless.html
批量更新
在實(shí)際需求中,面對(duì)最多的還是批量更新
當(dāng)然你也可以通過(guò) for 循環(huán)一條一條來(lái)更新,不過(guò)這種方法效率太低了。
尤其是面對(duì)數(shù)據(jù)量很大的時(shí)候,那真的是急死人..
好在 ES 有提供批量操作的接口 bulk
在 Python 中可以直接導(dǎo)入使用
from?elasticsearch.helpers?import?bulk
那么在 bulk 中如何使用 update 呢?請(qǐng)看代碼
??actions?=?[]
??for?item?in?data_list:
?????_id?=?item.get("_id")
?????doc?=?item.get("doc")
?????index_action?=?{
????????????'_op_type':?'update',
????????????'_index':?index_name,
????????????'_type':?"doc",
????????????'_id':?_id,
????????????'doc':?doc
?????}
?????actions.append(index_action)
?if?actions:
?????bulk(es,?actions)
可以看到有個(gè) doc 的參數(shù),和上面介紹的 update 方法類(lèi)似,doc中的值便是我們需要修改的字段內(nèi)容
_op_type 為操作類(lèi)型為update,表明是更新的操作
以該種方式組合的 index_action 組成數(shù)組,通過(guò) bulk 便能實(shí)現(xiàn)批量更新 !
以上便是通過(guò) Python 更新 Elasticsearch 的幾種方法
個(gè)人推薦通過(guò) update 接口或者 bulk 批量來(lái)做更新,你學(xué)廢了嗎?
推薦閱讀

手機(jī)最強(qiáng)Python編程神器,在手機(jī)上運(yùn)行Python

Python高效代碼實(shí)踐:性能、內(nèi)存和可用性
