• es之8:批量查询mget、批量增删改bulk,document的全量替换


    1、批量查询的好处

    就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的。如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的性能开销缩减100倍

    2、批量查询  mget

    可以说mget是很重要的,一般来说,在进行查询的时候,如果一次性要查询多条数据的话,那么一定要用batch批量操作的api,尽可能减少网络开销次数,可能可以将性能提升数倍,甚至数十倍,非常非常之重要。

    先放点数据:

    put /ecommerce/product/1
    {
      "a":"1",
      "b":"2"
    }
    put /ecommerce/product/2
    {
      "a":"3",
      "b":"4"
    }

    批量查询:

    GET /_mget
    {
    "docs":[
     {
      "_index":"ecommerce",
      "_type":"product",
      "_id":1
     },
     {
      "_index":"ecommerce",
      "_type":"product",
      "_id":2
     }
    ]
    }

    结果:

    {
      "docs" : [
        {
          "_index" : "ecommerce",
          "_type" : "product",
          "_id" : "1",
          "_version" : 1,
          "_seq_no" : 0,
          "_primary_term" : 1,
          "found" : true,
          "_source" : {
            "a" : "1",
            "b" : "2"
          }
        },
        {
          "_index" : "ecommerce",
          "_type" : "product",
          "_id" : "2",
          "_version" : 1,
          "_seq_no" : 0,
          "_primary_term" : 1,
          "found" : true,
          "_source" : {
            "a" : "3",
            "b" : "4"
          }
        }
      ]
    }
    如果docs内的document都是同一个index则可以简略为:
    get ecommerce/_mget
    {
      "docs":[
          {
            "_type":"product",
            "_id":1
          },
          {
            "_type":"product",
            "_id":2
          }
        ]
    
    }
    结果同上
     
    如果docs内的document都是同一个index同一个type则可以进一步简略为:
    GET /ecommerce/product/_mget
    {
          "ids":[1,2,3,4]
    
    }

    3、批量增删改 bulk

           1、bulk语法
                    POST /_bulk
                    {"action":{"_index":"","_type":"","_id":""}}
                    {"data"}
            action的值有:
                     (1)delete:删除一个文档,只要1个json串就可以了

       (2)create:PUT /index/type/id/_create,强制创建

       (3)index:普通的put操作,可以是创建文档,也可以是全量替换文档

       (4)update:执行的partial update操作       

            注意:

                            (1)action所在json和data所在的json要换行,当action为delete时没有data

                            (2)action所在的json内不能有空格换行,否则出错
                            (3)每个json串不能换行,只能放一行,同时一个json串和一个json串之间,必须有一个换行
                            (4)bulk操作中,任意一个操作失败,是不会影响其他的操作的,但是在返回结果里,会告诉你异常日志
                    示例:
    POST /_bulk
    {"delete":{"_index":"test_index","_type":"test_type","_id":"3"}}
    {"create":{"_index":"test_index","_type":"test_type","_id":"13"}}
    {"test_field":"replaced test13"}
    {"index":{"_index":"test_index","_type":"test_type","_id":"2"}}
    {"test_field":"replaced test2"}
    {"update":{"_index":"test_index","_type":"test_type","_id":"1","_retry_on_conflict":3}}
    {"doc":{"test_field2":"bulk test 1"}}
                2、bulk size最佳大小

                bulk request会加载到内存里,如果太大的话,性能反而会下降,因此需要反复尝试一个最佳的bulk size。一般从1000~5000条数据开始,尝试逐渐增加。另外,如果看大小的话,最好是在5~15MB之间。

    1、document的全量替换

        (1)语法与创建文档是一样的,如果document id不存在,那么就是创建;如果document id已经存在,那么就是全量替换操作,替换document的json串内容
        (2)document是不可变的,如果要修改document的内容,第一种方式就是全量替换,直接对document重新建立索引,替换里面所有的内容
        (3)es会将老的document标记为deleted,然后新增我们给定的一个document,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除标记为deleted的document

    2、document的强制创建

        (1)创建文档与全量替换的语法是一样的,有时我们只是想新建文档,不想替换文档,如果强制进行创建呢?
        (2)PUT /index/type/id?op_type=create 或者 PUT /index/type/id/_create

    3、document的删除

        (1)DELETE /index/type/id
        (2)不会理解物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除

  • 相关阅读:
    淘淘商城之商城简介
    TCP输出和UDP输出
    缓冲区大小及限制
    mysql创建数据库指定编码格式
    20191128 Spring Boot官方文档学习(10)
    20191128 Spring Boot官方文档学习(9.11-9.17)
    20191128 Spring Boot官方文档学习(9.10)
    20191128 Spring Boot官方文档学习(9.9)
    20191128 Spring Boot官方文档学习(9.4-9.8)
    20191127 Spring Boot官方文档学习(9.1-9.3)
  • 原文地址:https://www.cnblogs.com/duanxz/p/15914140.html
Copyright © 2020-2023  润新知