Elasticsearch笔记第十三篇

171 阅读3分钟

Elasticsearch核心知识篇(26)

上机动手实战演练mget批量查询api

批量查询的好处

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

mget的语法

  • 一条一条的查询
GET /test_index/test_type/1
GET /test_index/test_type/2
  • mget批量查询
GET /_mget
{
  "docs":[
    {
      "_index":"waws_index",
      "_type":"waws_type",
      "_id":1
    },{
      "_index":"waws_index",
      "_type":"waws_type",
      "_id":2
    }
    ]
}

{
  "docs": [
    {
      "_index": "waws_index",
      "_type": "waws_type",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "name": "waws1"
      }
    },
    {
      "_index": "waws_index",
      "_type": "waws_type",
      "_id": "2",
      "_version": 1,
      "found": true,
      "_source": {
        "name": "waws2"
      }
    }
  ]
}
  • 如果查询的document是一个index下的不同type种的话
GET /waws_index/_mget
{
  "docs":[
    {
      "_type":"waws_type",
      "_id":1
    },{
      "_type":"waws_type",
      "_id":2
    }
    ]
}
  • 如果查询的数据都在同一个index下的同一个type下,最简单了
GET /waws_index/waws_type/_mget
{
  "ids":[1,2]
}

mget的重要性

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

Elasticsearch核心知识篇(27)

分布式文档系统_上机动手实战演练bulk批量增删改

bulk语法

 POST /_bulk
 { "delete": { "_index": "waws_index", "_type": "waws_type", "_id": "1" }} 
 { "create": { "_index": "waws_index", "_type": "waws_type", "_id": "3" }}
 { "waws_name":"waws3" }
 { "index":  { "_index": "waws_index", "_type": "waws_type", "_id": "4" }}
 { "waws_name":    "waws4" }
 { "update": { "_index": "waws_index", "_type": "waws_type", "_id": "3", "_retry_on_conflict" : 3} }
 { "doc" : {"waws_name" : "update_waws_name"} }

一个操作两个json串,语法如下:

 {"action": {"metadata"}}
 {"data"}

举例,比如你现在要创建一个文档,放bulk里面,看起来会是这样子的:

 {"index": {"_index": "waws_index", "_type", "waws_type", "_id": "1"}}
 {"waws_field1": "waws1", "waws_field2": "waws2"}

有哪些类型的操作可以执行呢?

  • delete:删除一个文档,只要1个json串就可以了
  • create:PUT /index/type/id/_create,强制创建
  • index:普通的put操作,可以是创建文档,也可以是全量替换文档
  • update:执行的partial update操作

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

 #语法错误
 {
   "error": {
     "root_cause": [
       {
         "type": "json_e_o_f_exception",
         "reason": "Unexpected end-of-input: expected close marker for Object (start marker at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@5a5932cd; line: 1, column: 1])\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@5a5932cd; line: 1, column: 3]"
       }
     ],
     "type": "json_e_o_f_exception",
     "reason": "Unexpected end-of-input: expected close marker for Object (start marker at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@5a5932cd; line: 1, column: 1])\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@5a5932cd; line: 1, column: 3]"
   },
   "status": 500
 }

执行结果

 {
   "took": 262,
   "errors": false,
   "items": [
     {
       "delete": {
         "found": true,
         "_index": "waws_index",
         "_type": "waws_type",
         "_id": "1",
         "_version": 2,
         "result": "deleted",
         "_shards": {
           "total": 2,
           "successful": 1,
           "failed": 0
         },
         "status": 200
       }
     },
     {
       "create": {
         "_index": "waws_index",
         "_type": "waws_type",
         "_id": "3",
         "_version": 1,
         "result": "created",
         "_shards": {
           "total": 2,
           "successful": 1,
           "failed": 0
         },
         "created": true,
         "status": 201
       }
     },
     {
       "index": {
         "_index": "waws_index",
         "_type": "waws_type",
         "_id": "4",
         "_version": 1,
         "result": "created",
         "_shards": {
           "total": 2,
           "successful": 1,
           "failed": 0
         },
         "created": true,
         "status": 201
       }
     },
     {
       "update": {
         "_index": "waws_index",
         "_type": "waws_type",
         "_id": "3",
         "_version": 2,
         "result": "updated",
         "_shards": {
           "total": 2,
           "successful": 1,
           "failed": 0
         },
         "status": 200
       }
     }
   ]
 }

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

  • 同一个index下的操作
 POST /waws_index/_bulk
 { "delete": { "_type": "waws_type", "_id": "3" }} 
 { "create": { "_type": "waws_type", "_id": "12" }}
 { "waws_name":    "waws12" }
 { "index":  { "_type": "waws_type" }}
 { "waws_name":    "auto-generate id test" }
 { "index":  { "_type": "waws_type", "_id": "2" }}
 { "waws_name":    "replaced test2" }
 { "update": { "_type": "waws_type", "_id": "1", "_retry_on_conflict" : 3} }
 { "doc" : {"waws_name" : "waws_new_name"} }
 POST /waws_index/waws_type/_bulk
 { "delete": { "_id": "3" }} 
 { "create": { "_id": "12" }}
 { "waws_name":    "waws12" }
 { "index":  { }}
 { "waws_name":    "auto-generate id test" }
 { "index":  { "_id": "2" }}
 { "waws_name":    "replaced test2" }
 { "update": { "_id": "1", "_retry_on_conflict" : 3} }
 { "doc" : {"waws_field" : "waws_new_name"} }

bulk size最佳大小

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