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}