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}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM