Python连接es笔记三之es更新操作

2023-05-30 20:42:33 来源:博客园 分享到:

本文首发于公众号:Hunter后端原文链接:Python连接es笔记三之es更新操作

这一篇笔记介绍如何使用 Python 对数据进行更新操作。


【资料图】

对于 es 的更新的操作,不用到 Search() 方法,而是直接使用 es 的连接加上相应的函数来操作,本篇笔记目录如下:

获取连接update()update_by_query()批量更新UpdateByQuery()1、获取连接

如果使用的是之前的全局创建连接的方式:

from elasticsearch_dsl import connectionsconnections.configure(    default={"hosts": "localhost:9200"},)

我们可以根据别名获取相应的连接:

conn = connections.connections.get_connection("default")

或者我们直接使用 elasticsearch.Elasticsearch 模块来重新建立一个连接:

from elasticsearch import Elasticsearchconn = Elasticsearch(hosts="localhost:9200")

前面介绍过,我们安装 elasticsearch_dsl 依赖的时候,会自动为我们安装上相应的 elasticsearch 模块,我们这里直接使用即可。

然后通过 conn 连接可以直接对数据进行更新,可用的方法有 update(),update_by_query() 以及一个批量的 bulk() 方法。

2、update()

update() 函数一般只用于指定 id 的更新操作,如果我们知道一条数据的 id,我们可以直接使用 update()。

比如对于 exam 这个 index 下 id=18 的数据,我们想要更新它的 name 字段和 address 字段分别为 王五和湖南省,我们可以如下操作:

conn.update(    index="exam",    id=18,    body={        "doc": {            "name": "王五2",            "address": "湖南省",        }    })

在上面的操作中,index 为指定的索引,id 参数为我们需要更新的 id,body 内 doc 下的字段即为我们要更新的数据。

3、update_by_query()

update_by_query() 函数不局限于 id 的查询更新,我们可以更新任意符合条件的数据,以下是一个简单的示例:

conn.update_by_query(    index="exam",    body={        "query": {            "term": {"name":  "张三丰"}        },        "script": {            "source": "ctx._source.address = params.address",            "params": {                "address": "新地址",            }        }    })

在这里,index 参数还是指向对应的索引,body 内包含了需要更新查询的条件,这里都在 query 参数内,需要更新的数据在 script 下,通过脚本的形式来操作更新。

这里注意下,我这里用到的是 7.6.0 版本,所以 script 下使用的 source,更低一点版本用的字段可能是 inline,这里使用对应版本的参数即可。

在 script.source 中,内容为 ctx._source.address = params.address,意思是将符合条件数据的 address 字段内容更新为 params 的 address 的数据。

如果想要更改其他字段内容,注意前面 ctx._source 为固定写法,只需要更改后面的字段名即可。

在 script.params 中,我们则可以定义各种对应的字段及其内容。

更新多个字段

如果我们想同时更新多个字段,比如说符合条件的数据将 address 改为 新地址,将 age 字段改为 28,我们则需要将多个条件在 script.source 中使用分号 ;连接起来,示例如下:

conn.update_by_query(    index="exam",    body={        "query": {            "term": {"name":  "新张三丰2"}        },        "script": {            "source": "ctx._source.address = params.address; ctx._source.age = params.age",            "params": {                "address": "新地址3",                "age": "28"            }        }    })

虽然这里更新多个字段需要使用分号连接,但是在实际的代码中我们不用这么写死,比如说我们需要更改三个字段,为 ["address", "name", "age"],我们如下操作:

field_list = ["address", "name", "age"]source_list = [f"ctx._source.{key}=params.{key}" for key in field_list]params = {    "address": "新地址3",    "age": "28",    "name": "new name"}conn.update_by_query(    index="exam",    body={        "query": {            "term": {"name":  "新张三丰3"}        },        "script": {            "source": ";".join(source_list),            "params": params        }    })
4、批量更新

如果我们想批量更新一批数据,这批数据各个字段的值都不一致,自定义的程度很大,使用 update_by_query() 函数已经不现实了,怎么办?

好解决,我们可以使用 helpers.bulk() 批量更新方法。

首先引入这个模块:

from elasticsearch import helpers

假设我们系统里现在有 id 为 21,23,24 的几条数据,还是在 exam 这个索引下,我们来构造几条需要更新的数据来操作:

action_1 = {    "_op_type": "update",    "_index": "exam",    "_id": 21,    "doc": {"age": 19, "name": "令狐冲", "address": "华山派"},}action_2 = {    "_op_type": "update",    "_index": "exam",    "_id": 23,    "doc": {"age": 20, "name": "杨过", "address": "终南山"},}action_3 = {    "_op_type": "update",    "_index": "exam",    "_id": 24,    "doc": {"age": 21, "name": "张无忌", "address": "武当"},}action_list = [action_1, action_2, action_3]helpers.bulk(conn, actions=action_list)

对于每一条需要更新的数据,有这几个参数:

_op_type:如果是更新操作,其值则是 update

_index:表示需要更新的数据所在的索引,这里是 exam

_id:表示这条需要更新的数据的 id

doc:是一个 dict 数据,其下包含了需要更新的字段及其对应的值

至此,一条需要更新的数据的结构就构造完毕了。

然后对于 helpers.bulk() 函数,接收的第一个参数为 es 连接,actions 参数是一个列表,其内容就是我们前面构造的数据的集合。

然后执行这个操作就可以发现 es 中对应的值已经更改了。

5、UpdateByQuery()

UpdateByQuery() 函数来源于 elasticsearch_dsl 模块,它的使用和 Search() 方法差不多,都是通过 using 和 index 参数来获取 es 连接和索引:

from elasticsearch_dsl import connectionsfrom elasticsearch_dsl import UpdateByQueryfrom elasticsearch_dsl import Q as ES_Qconnections.configure(    default={"hosts": "localhost:9200"},)ubq = UpdateByQuery(using="default", index="exam")

使用这个方法更新数据的具体语法和 update_by_query 差不多,都是通过 script 的方式来操作,以下是一个简单示例:

ubq = UpdateByQuery(using="default", index="exam")q1 = ES_Q("term", name="郭靖")ubq = ubq.query(q1)ubq = ubq.script(    source="ctx._source.address=params.address",    params={        "address": "襄阳城"    })ubq.execute()

与 Search() 函数一样,都需要通过 execute() 函数来向 es 提交数据。

如果想获取更多后端相关文章,可扫码关注阅读:

标签:

Python连接es笔记三之es更新操作

来源:博客园 2023-05-30 20:42:33

愿你一生可爱,一生被爱。-世界时快讯

来源:厨娘联萌 2023-05-30 20:33:45

微资讯!权威面对面|践行真正的多边主义 让人类未来更具确定性——专访亚投行行长金立群

来源:新华网 2023-05-30 20:34:27

当前资讯!经常洗头发对头发好不好(经常洗头发有什么坏处)

来源: 2023-05-30 20:21:44

焦点信息:威海银行(09677.HK)委任杨云红为独立非执行董事

来源:格隆汇 2023-05-30 20:13:54

创造吧我们的星球枪械零件怎么获得 枪械零件获取方法一览_环球简讯

来源:豌豆荚 2023-05-30 19:53:30

qq迷你秀怎么关掉(qq迷你)

来源:互联网 2023-05-30 19:25:53

环球今日讯!青鸟消防(002960.SZ):截止目前覆盖公司的券商机构已有20余家

来源:格隆汇 2023-05-30 19:19:29

联得装备:公司目前尚未生产相关设备,感谢您对联得装备的支持和持续关注!

来源:证券之星 2023-05-30 19:10:15

注册会计师跟高级会计师的区别_高级会计师和注册会计师的区别 天天快看点

来源:互联网 2023-05-30 18:21:59

iphoneqq邮箱设置imap不支持密码鉴定(iphoneqq)|全球新消息

来源:互联网 2023-05-30 18:19:10

每日时讯!“好友”骗走430万,AI骗局频发须高度警惕

来源:齐鲁晚报 2023-05-30 18:11:21

广东省市场监管局部署开展全省涉企违规收费整治助企行动

来源:中国质量新闻网 2023-05-30 17:37:19

天天动态:颜值爆表+音质在线!惠威AW-75提前开启618:到手仅799元

来源:搜狐数码 2023-05-30 17:32:37

当前视讯!阿森纳球衣图片(阿森纳球衣)

来源:互联网 2023-05-30 17:11:08

心理调适的一般方法有哪些(心理调适)_世界观速讯

来源:互联网 2023-05-30 16:35:25

寻找最美国门名片|守护新藏线 这群90后用青春捍卫边境安宁-新消息

来源:人民网 2023-05-30 16:17:11

初夏,藏在古诗词里的这些吃食正当令_全球即时

来源:中国青年报 作者:辛酉生 2023-05-30 15:49:38

环球快看:云锦东方事件持续发酵 上海二手豪宅套利乱象调查

来源:媒体滚动 2023-05-30 15:34:29

法网:商竣程遭大逆转 吴易昺不敌种子选手 环球即时

来源:新华网 2023-05-30 15:16:40

小米618天猫预售超6亿元

来源:中关村在线 2023-05-30 14:55:50

吕布到底该怎么玩_吕布怎么玩厉害 天天时讯

来源:互联网 2023-05-30 14:36:23

尚太科技:公司暂时尚无硅基负极材料量产_最新快讯

来源:界面新闻 2023-05-30 13:58:09

今日关注:周迅监制《梅的白天和黑夜》曝海报,演绎老年爱情神话

来源:1905电影网 2023-05-30 13:26:10

最高70万!芜湖发布公积金新政 环球观焦点

来源:无为发布 2023-05-30 12:35:25

点火发射!神舟十六号正奔赴苍穹|环球报资讯

来源:中国青年报客户端 2023-05-30 12:01:55

快资讯:新莱应材5月30日盘中跌幅达5%

来源:东方财富Choice数据 2023-05-30 11:09:57

中国商务部长当面与日方严正交涉,坚决反对操弄涉华议题!

来源:互联网 2023-05-30 10:15:37

红塔红土基金遭大股东抛售 华远集团为何从增持到“清仓”

来源:投资者网 2023-05-30 09:34:26

新消息丨盱眙的龙虾哪家最便宜好吃

来源:南方养生网 2023-05-30 09:10:53

Copyright   2015-2022 中公知识产权网 版权所有  备案号:沪ICP备2022005074号-18   联系邮箱:5855973@qq.com