你们好,我是村长html
今天总结一下经过 Python 更新 Elasticsearch 数据的几个方法编程
Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你之前所未有的速度和规模,去探索你的数据。它被用做全文检索、结构化搜索、分析以及这三个功能的组合api
全局更新
在 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})
修改后结果app
经过这种方法修改,由于是 reindex 过程,因此当数据量或者 document 很大的时候,效率很是的低less
局部更新
update
Elasticsearch 中的 update API 支持根据用户提供的脚本去实现更新elasticsearch
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 的几种方法
我的推荐经过 update
接口或者 bulk
批量来作更新,你学废了吗?
推荐阅读
本文分享自微信公众号 - Python编程与实战(GoPy1024)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。