今天總結一下通過 Python 更新 Elasticsearch 數據的幾個方法
Elasticsearch 是一個實時的分布式搜索分析引擎,它能讓你以前所未有的速度和規模,去探索你的數據。它被用作全文檢索、結構化搜索、分析以及這三個功能的組合
全局更新
在 Elasticsearch 中,通過指定文檔的 _id
, 使用 Elasticsearch
自帶的 index api
可以實現插入一條 document
, 如果該 _id
已存在,將直接更新該 document
因此,通過 index API 來對已有的文檔實現更新,其實是進行了一次 reindex 的操作 如 ES 中已有數據如下
通過代碼將其更新:
es.index(index="test", doc_type="doc", id="dfebcXcBCWwWKoXwQ2Gk", body={
"name": "Python編程實戰",
"num": 5})
修改后結果
通過這種方法修改,因為是 reindex 過程,所以當數據量或者 document 很大的時候,效率非常的低
局部更新
update
Elasticsearch 中的 update API 支持根據用戶提供的腳本去實現更新
Update 更新操作允許 ES 獲得某個指定的文檔,可以通過腳本等操作對該文檔進行更新。
可以把它看成是先刪除再索引的原子操作,只是省略了返回的過程,這樣即節省了來回傳輸的網絡流量,也避免了中間時間造成的文檔修改沖突。
在 Python 中可以直接通過包裝好的接口來更新
es.update(index="test", doc_type="doc", id="4Z6XcXcBChYTHL1ZdwjL", body={"doc": {"name": "Jerry"}})
注意 body
參數,我們需要添加 doc
或者 script
變量來指定修改的內容
增加字段:
es.update(index="test", doc_type="doc", id="4Z6XcXcBChYTHL1ZdwjL", body={"doc": {"name": "Jerry", "age": 25}})
運行完之后,在 kibana 上查看結果
搜索更新
update_by_query
update_by_query,顧名思義,這種更新方式,即通過查詢再更新。
該方法的優點是可以指定某些數據,然后達到更新的目的
在 ES 中,我們通過 update_by_query 中的 query 和 script 來實現先查詢再更新的機制
在上面的操作中:query 字段,表示我們要查詢的條件,根據該條件找到對應的數據 script 字段包含以下關鍵字:
- source 是將要執行的腳本內容;
- lang 表示的是當前腳本的語言*;
- param 則是腳本執行的參數;
參考詳情:https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-painless.html
批量更新
在實際需求中,面對最多的還是批量更新
當然你也可以通過 for 循環一條一條來更新,不過這種方法效率太低了。
尤其是面對數據量很大的時候,那真的是急死人..
好在 ES 有提供批量操作的接口 bulk
在 Python 中可以直接導入使用
from elasticsearch.helpers import bulk
那么在 bulk 中如何使用 update 呢?請看代碼
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)
可以看到有個 doc
的參數,和上面介紹的 update
方法類似,doc
中的值便是我們需要修改的字段內容
_op_type
為操作類型為update
,表明是更新的操作
以該種方式組合的 index_action
組成數組,通過 bulk
便能實現批量更新 !
以上便是通過 Python 更新 Elasticsearch 的幾種方法。
-
數據
+關注
關注
8文章
6909瀏覽量
88849 -
代碼
+關注
關注
30文章
4753瀏覽量
68368 -
python
+關注
關注
56文章
4783瀏覽量
84473 -
Elasticsearch
+關注
關注
0文章
27瀏覽量
2823
發布評論請先 登錄
相關推薦
評論