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,           #指定要更新的那条数据的id 
            'new_field':1      #新增字段
        }
        ll.append(dic)
    es_tt.update_data_batch(ll)
复制代码

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

 

 

方法二.

复制代码
    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.size=params.size;ctx._source.price=params.times",   # ctx._source.price指定是原数据要更新的字段为price,
                "params": {  # params为参数,params中的字段名可以随便设置,值为用来替换原数据中字段的值
                    "size": num + 5,
                    "times": num + 100
                }
            }
        }
        ll.append(insert_dic)
    bulk(es_tt.client, ll)
复制代码

 

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

 

 

方法三.对于可迭代对象的增加元素呢(字符串、列表等)

  1.对字符串修改

复制代码
if __name__ == '__main__':
    a = ['', '', '', '']
    b = [1000, 2000, 3000, 4000]
    ll=[]
    for num, data in enumerate(es_tt.scan_all_data()):
            # 对字符串的追加更新
            dic={
                "_op_type": "update",
                "_index": es_tt.index,
                "_type": es_tt._type,
                "_id": data.get('id'),
                "script":
                    {
                        "source": "ctx._source.name+=params.tag",
                        "params": {"tag": random.choice(a)}
                    }
            }
            ll.append(dic)
        # 批量更新
    bulk(es_tt.client, ll)
复制代码

  元素据:

复制代码
{'name': '鞋子', 'size': ['S', 'M', 'L'], 'price': [300, 800, 200, 2000, 2000], 'id': 0}
{'name': '裤子', 'size': ['XL', 'S'], 'price': [100, 300, 2000, 1000], 'id': 1}
{'name': '裤子', 'size': ['XL', 'S', 'M'], 'price': [300, 200, 100, 4000, 3000], 'id': 2}
{'name': '裤子', 'size': ['L', 'M', 'S', 'XL'], 'price': [800, 100, 300, 600, 2000, 2000], 'id': 3}
{'name': '裤子', 'size': ['L', 'M'], 'price': [800, 600, 2000, 1000], 'id': 4}
{'name': '帽子', 'size': ['M', 'S'], 'price': [200, 100, 3000, 1000], 'id': 5}
{'name': '衬衣', 'size': ['S', 'M', 'XL'], 'price': [200, 300, 800, 1000, 3000], 'id': 6}
{'name': '衬衣', 'size': ['XL', 'L'], 'price': [600, 200, 2000, 2000], 'id': 7}
{'name': '裤子', 'size': ['L', 'S'], 'price': [800, 100, 3000, 4000], 'id': 8}
{'name': '衬衣', 'size': ['M', 'L', 'XL', 'S'], 'price': [100, 200, 800, 600, 1000, 4000], 'id': 9}
复制代码

  修改后

复制代码
{'name': '鞋子钱', 'size': ['S', 'M', 'L'], 'price': [300, 800, 200, 2000, 2000], 'id': 0}
{'name': '裤子李', 'size': ['XL', 'S'], 'price': [100, 300, 2000, 1000], 'id': 1}
{'name': '裤子赵', 'size': ['XL', 'S', 'M'], 'price': [300, 200, 100, 4000, 3000], 'id': 2}
{'name': '裤子赵', 'size': ['L', 'M', 'S', 'XL'], 'price': [800, 100, 300, 600, 2000, 2000], 'id': 3}
{'name': '裤子赵', 'size': ['L', 'M'], 'price': [800, 600, 2000, 1000], 'id': 4}
{'name': '帽子赵', 'size': ['M', 'S'], 'price': [200, 100, 3000, 1000], 'id': 5}
{'name': '衬衣赵', 'size': ['S', 'M', 'XL'], 'price': [200, 300, 800, 1000, 3000], 'id': 6}
{'name': '衬衣赵', 'size': ['XL', 'L'], 'price': [600, 200, 2000, 2000], 'id': 7}
{'name': '裤子钱', 'size': ['L', 'S'], 'price': [800, 100, 3000, 4000], 'id': 8}
{'name': '衬衣李', 'size': ['M', 'L', 'XL', 'S'], 'price': [100, 200, 800, 600, 1000, 4000], 'id': 9}
复制代码

 

 

  2.对于列表更新

复制代码
if __name__ == '__main__':
    a = ['', '', '', '']
    b = [1000, 2000, 3000, 4000]
    ll = []
    for num, data in enumerate(es_tt.scan_all_data()):
        # 对字符串的追加更新
        dic = {  # 对列表的追加更新
            "_op_type": "update",
            "_index": es_tt.index,
            "_type": es_tt._type,
            "_id": data.get('id'),
            "script": {
                "source": "ctx._source.price.add(params.tag)",
                "params": {"tag": random.choice(b)}
                           }
        }
        ll.append(dic)
    # 批量更新
    bulk(es_tt.client, ll)
复制代码

 

  元素据:

复制代码
{'name': '鞋子', 'size': ['S', 'M', 'L'], 'price': [300, 800, 200], 'id': 0}
{'name': '裤子', 'size': ['XL', 'S'], 'price': [100, 300], 'id': 1}
{'name': '裤子', 'size': ['XL', 'S', 'M'], 'price': [300, 200, 100], 'id': 2}
{'name': '裤子', 'size': ['L', 'M', 'S', 'XL'], 'price': [800, 100, 300, 600], 'id': 3}
{'name': '裤子', 'size': ['L', 'M'], 'price': [800, 600], 'id': 4}
{'name': '帽子', 'size': ['M', 'S'], 'price': [200, 100], 'id': 5}
{'name': '衬衣', 'size': ['S', 'M', 'XL'], 'price': [200, 300, 800], 'id': 6}
{'name': '衬衣', 'size': ['XL', 'L'], 'price': [600, 200], 'id': 7}
{'name': '裤子', 'size': ['L', 'S'], 'price': [800, 100], 'id': 8}
{'name': '衬衣', 'size': ['M', 'L', 'XL', 'S'], 'price': [100, 200, 800, 600], 'id': 9}
复制代码

  修改后:

复制代码
{'name': '鞋子', 'size': ['S', 'M', 'L'], 'price': [300, 800, 200, 2000], 'id': 0}
{'name': '裤子', 'size': ['XL', 'S'], 'price': [100, 300, 2000], 'id': 1}
{'name': '裤子', 'size': ['XL', 'S', 'M'], 'price': [300, 200, 100, 4000], 'id': 2}
{'name': '裤子', 'size': ['L', 'M', 'S', 'XL'], 'price': [800, 100, 300, 600, 2000], 'id': 3}
{'name': '裤子', 'size': ['L', 'M'], 'price': [800, 600, 2000], 'id': 4}
{'name': '帽子', 'size': ['M', 'S'], 'price': [200, 100, 3000], 'id': 5}
{'name': '衬衣', 'size': ['S', 'M', 'XL'], 'price': [200, 300, 800, 1000], 'id': 6}
{'name': '衬衣', 'size': ['XL', 'L'], 'price': [600, 200, 2000], 'id': 7}
{'name': '裤子', 'size': ['L', 'S'], 'price': [800, 100, 3000], 'id': 8}
{'name': '衬衣', 'size': ['M', 'L', 'XL', 'S'], 'price': [100, 200, 800, 600, 1000], 'id': 9}
复制代码

 

posted @   阿布_alone  阅读(7963)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
TOP
点击右上角即可分享
微信分享提示