十一、Elasticsearch的mget/bulk相关命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十一、Elasticsearch的mget/bulk相关命令相关的知识,希望对你有一定的参考价值。

参考技术A 1、mget的语法

可以说mget是很重要的,一般来说,在进行查询的时候,如果一次性要查询多条数据的话,那么一定要用batch批量操作的api

尽可能减少网络开销次数,可能可以将性能提升数倍,甚至数十倍,非常非常之重要

(1)、如果不同的index和不同的type

GET /_mget/



  "docs":[

    

    "_index":"test_index",

    "_type":"test_type",

    "_id":7

    ,

    

        "_index":"ecommerce",

    "_type":"product",

    "_id":1

    

    ]



(2)如果有相同的,在命令行路径加个index和type即可

GET /test_index/test_type/_mget



  "ids":[7,11]



2、bulk语法(如果有相同的index和type可以加下 POST /index/type/_bulk)

(1)、语法

POST /_bulk 

"action": "metadata"

"data"

(2)、有哪些类型的操作可以执行呢?

(2.1)delete:删除一个文档,只要1个json串就可以了

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

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

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

例:

POST /_bulk 

"delete": "_index": "test_index", "_type": "test_type", "_id": "11"

"create": "_index": "test_index", "_type": "test_type", "_id": "12"

"test_field":    "test12"

"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 test1"

注意:

bulk api对json的语法,有严格的要求,每个json串不能换行,只能放一行,同时一个json串和一个json串之间,必须有一个换行

bulk操作中,任意一个操作失败,是不会影响其他的操作的,但是在返回结果里,会告诉你异常日志

3、bulk size最佳大小

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

4、为什么json格式不能有控格只能以用换行

如果换成数组采用比较良好的json数组格式,然后里面随便操作的弊端

允许任意的换行,整个可读性非常棒,读起来很爽,es拿到那种标准格式的json串以后,要按照下述流程去进行处理

(1)将json数组解析为JSONArray对象,这个时候,整个数据,就会在内存中出现一份一模一样的拷贝,一份数据是json文本,一份数据是JSONArray对象

(2)解析json数组里的每个json,对每个请求中的document进行路由

(3)为路由到同一个shard上的多个请求,创建一个请求数组

(4)将这个请求数组序列化

(5)将序列化后的请求数组发送到对应的节点上去

弊端:

我们之前提到过bulk size最佳大小的那个问题,一般建议说在几千条那样,然后大小在10MB左右,所以说,可怕的事情来了。假设说现在100个bulk请求发送到了一个节点上去,然后每个请求是10MB,100个请求,就是1000MB = 1GB,然后每个请求的json都copy一份为jsonarray对象,此时内存中的占用就会翻倍,就会占用2GB的内存,甚至还不止。因为弄成jsonarray之后,还可能会多搞一些其他的数据结构,2GB+的内存占用。

占用更多的内存可能就会积压其他请求的内存使用量,比如说最重要的搜索请求,分析请求,等等,此时就可能会导致其他请求的性能急速下降

另外的话,占用内存更多,就会导致java虚拟机的垃圾回收次数更多,跟频繁,每次要回收的垃圾对象更多,耗费的时间更多,导致es的java虚拟机停止工作线程的时间更多。

奇特格式 的好处:

(1)不用将其转换为json对象,不会出现内存中的相同数据的拷贝,直接按照换行符切割json

(2)对每两个一组的json,读取meta,进行document路由

(3)直接将对应的json发送到node上去

最大的优势在于,不需要将json数组解析为一个JSONArray对象,形成一份大数据的拷贝,浪费内存空间,尽可能地保证性能

Elasticsearch学习笔记批量查询mget批量增删改bulk

一、批量查询  mget


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

}
如果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]
}

二、批量增删改 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之间。

以上是关于十一、Elasticsearch的mget/bulk相关命令的主要内容,如果未能解决你的问题,请参考以下文章

四十二 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mget和bulk批量操作

Elasticsearch学习笔记批量查询mget批量增删改bulk

ElasticSearch partial update+mget+bulk

(19)ElasticSearch java项目中的批量操作mget和bulk

ElasticSearch_04_批量处理命令mget和bulk的使用

ElasticSearch_03_批量处理命令mget和bulk的使用