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 @ 2020-06-29 23:37  阿布_alone  阅读(7860)  评论(0编辑  收藏  举报
TOP