ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 엘라스틱서치 bluk api
    공부하기/엘라스틱서치 2024. 2. 27. 17:59
    • 여러 색인, 업데이트, 삭제 작업을 한 번의 요청에 담아서 보내는 API
    • 대량의 데이터를 색인할 때 많이 사용된다.
    • 요청 본문이 JSON이 아니라 NDJSON 형태
      • NDJSON : 여러 줄의 JSON을 줄바꿈 문자로 구분하여 요청을 보내는 형태
      • 헤더 Content-Type 의 값을 application/json이 아닌 application/x-ndjson으로 요청을 보내야한다.
      • 줄바꿈 문자 \n으로 끝나야한다.
      • 첫 줄은 요청의 종류와 인덱스, _id, 라우팅 등을 지정한다
      • 추가적인 요청 본문을 필요로 하는 경우 다음 줄에 이어서 기재한다
      • 따라서 요청 하나의 크기는 1줄~2줄이 된다.
    • 단건 문서를 여러번 요청하는것보다 bulk API로 한번에 요청하는것이 성능상 대부분 좋다.
    • http 요청을 청크(chunked)로 보내는 것은 성능상 좋지 않아 피해야한다.

    기본 문법

    POST _bulk
    ...
    
    
    POST 인덱스이름/_bulk -> 기본 인덱스를 지정하여 요청

     

     

    bulk 기본 예제 실습

     

    request

    POST _bulk
    { "index" : { "_index" : "test", "_id" : "1" } }
    { "field1" : "value1" }
    { "delete" : { "_index" : "test", "_id" : "2" } }
    { "create" : { "_index" : "test", "_id" : "3" } }
    { "field1" : "value3" }
    { "update" : {"_id" : "1", "_index" : "test"} }
    { "doc" : {"field2" : "value2"} }
    { "index":{"_index": "test", "_id": "4", "routing": "lsm" }}
    { "filed1": "value4" }
    • index, create는 색인 요청
    • 다음 줄은 색인할 문서의 _source
    • 다음줄에 doc 또는 script를 기술하여 업데이트할 수 있음

     

    response

    {
      "took": 1877,
      "errors": false,
      "items": [
        {
          "index": {
            "_index": "test",
            "_id": "1",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "_seq_no": 0,
            "_primary_term": 1,
            "status": 201
          }
        },
        {
          "delete": {
            "_index": "test",
            "_id": "2",
            "_version": 1,
            "result": "not_found",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "_seq_no": 1,
            "_primary_term": 1,
            "status": 404
          }
        },
        {
          "create": {
            "_index": "test",
            "_id": "3",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "_seq_no": 2,
            "_primary_term": 1,
            "status": 201
          }
        },
        {
          "update": {
            "_index": "test",
            "_id": "1",
            "_version": 2,
            "result": "updated",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "_seq_no": 3,
            "_primary_term": 1,
            "status": 200
          }
        },
        {
          "index": {
            "_index": "test",
            "_id": "4",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "_seq_no": 4,
            "_primary_term": 1,
            "status": 201
          }
        }
      ]
    }
    • 응답을 확인해보면 요청의 순서대로 items 배열에 응답이 있는걸 확인할 수 있다.
      • 동일한 인덱스, _id, 라우팅 조합을 가진 요청은 반드시 동일한 주 샤드로 넘어가기 때문에 순서보장
      • 동일하지 않은 인덱스에 요청할 시 순서가 보장되지 않음
    • items 배열의 각 응답은 status 상태코드를 갖는다.
Designed by Tistory.