elasticsearch批量局部更新数据

Posted tjp40922

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch批量局部更新数据相关的知识,希望对你有一定的参考价值。

一.方法一

    def update_data_batch(self,actions):
        """
        批量更新数据
        :param actions:
        :return:
        """
        item_list=[]
        for data in actions:
            dic = {
                "_index": self.index,
                "_type": self._type,
                "_op_type": "update",
                "_id": data.get(‘id‘),
                "doc": data
            }
            item_list.append(dic)
            if len(item_list) == 500:
                success, _ = bulk(self.client, item_list)
                item_list.clear()
        if item_list:
            success, _ = bulk(self.client, item_list)
            print(success, _)
        self.client.indices.refresh()

if __name__ == __main__:
    ll=[]
    for i in range(10):
        dic={
            "size":1111,id:i
        }
        ll.append(dic)
    es_tt.update_data_batch(ll)

  其实就是把要更新的字段的值直接作为doc字段的值,另外是一定要指定_id的,也就是要更新到哪一条数据

 

 

方法二.

    ll = []
    for num, data in enumerate(es_tt.scan_all_data()):
        insert_dic = {
            "_index": es_tt.index,
            "_type": es_tt._type,
            "_op_type": "update",   #指定更新方式插入数据
            "_id": data.get(id),
            "script": {
                "source": "ctx._source.price=params.price",  #ctx._source.price指定是原数据要更新的字段为price,
                "params": {   #params为参数,params中的字段名可以随便设置,值为用来替换原数据中字段的值
                    "price": num
                }
            }
        }
        ll.append(insert_dic)
    bulk(es_tt.client, ll)

  #主要是指定script字段,里面有两个字段,source和params,soure指定原数据套替换的字段和替换成什么值,params指定要替换成的值

 

以上是关于elasticsearch批量局部更新数据的主要内容,如果未能解决你的问题,请参考以下文章

使用标准库Ruby将数据标记到Elasticsearch批量中

ElasticSearch实战(十八)-批量写入与更新

Spring Boot Elasticsearch7.6.2实现创建索引删除索引判断索引是否存在获取/添加/删除/更新索引别名单条/批量插入单条/批量更新删除数据递归统计ES聚合的数据

ElasticSearch实战(十八)-DSL批量写入与更新

谷粒商城_06_JSR303校验+Elasticsearch

ElasticSearch批量更新文档