zoukankan      html  css  js  c++  java
  • 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}
  • 相关阅读:
    js阻止事件冒泡和标签默认行为
    Sql server不同数据类型间拼接(+)
    win7 激活相关
    查找算法
    算法基础
    requests库使用
    python urllib和urllib3包使用
    爬虫工具fiddle在firefox浏览器中的使用
    爬虫抓包工具Fiddle设置
    爬虫抓包工具Charles设置
  • 原文地址:https://www.cnblogs.com/tjp40922/p/13211150.html
Copyright © 2011-2022 走看看