Elastic Search - 문서!

문서 CRUD

문서 조회

문서조회는 아래와 같이 id 를 기반으로 단건조회할 수 있다.

GET /movie/_doc/1

// result
{
  "_index": "movie",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "movieCd": "1",
    "movieNm": "살아남은 아이",
    "movieNmEn": "Last Child",
    "prdtYear": "2017"
  }
}

질의문을 통한 검색은 아래 검색쿼리 항목에서 자세히 설명

문서 추가

문서 추가는 PUT 메서드로 수행된다.
id 값은 지정하지 않을경우 UUID 를 통해 무작위로 생성된다.

PUT /movie/_doc/1
{
  "movieCd": "1",
  "movieNm": "살아남은 아이",
  "movieNmEn": "Last Child",
  "prdtYear": "2017"
}

// id 없이 추가
POST /movie/_doc
{
  "movieCd": "2",
  "movieNm": "아이언맨",
  "movieNmEn": "Ironman",
  "prdtYear": "2017"
}

// result
{
    "_id": "QSx_A4gBfkTcbt6LsCrE",
    ...
}

타 서비스의 DB 와 동기화 해야할 때 지정하지 않은 ID 가 오류를 야기할 수 있음으로
데이터 삽입시 id 를 지정하는 것을 권장한다.

op_type 파라미터를 통해 데이터가 존재하면 수정하고 없을경우 에러를 반환하도록 설정 가능하다.

생성하길 원한다면 op_typecreate 를 설정
수정하길 원한다면 op_typeindex 를 설정

아래의 경우 이미 문서에 version 값이 존재한다고 error 를 반환하였다.

PUT movie_dynamic/_doc/1?op_type=create
{
  "movieCd": "20173732",
  "movieNm": "살아남은 아이",
  "movieNmEn": "Last Child",
  "typeNm": "단편"
}
// result
{
  "error": {
    "type": "version_conflict_engine_exception",
    "reason": "[_doc][1]: version conflict, document already exists (current version [8])",
    ...
  },
  "status": 409
}

version 값은 1 부터 시작하여 수정될때 마다 1씩 증가한다.

timeout 파라미터를 통해 문서 색인 타임아웃 설정이 가능하다.
default=1m 인데 이를 timeout 파라미터를 통해 조절할 수 있다.

PUT movie_dynamic/_doc/1?timeout=5m
{
  "movieCd": "20173732",
  "movieNm": "살아남은 아이",
  "movieNmEn": "Last Child",
  "typeNm": "단편"
}

문서 수정

추가와 수정은 모두 PUT 메서드를 사용한다.
수정할 때에도 추가할 때 썼던 url 을 그대로 사용해서 수정 할 수 있다.
또한 _source 필드가 활성화 돼있어야 한다.

PUT movie_dynamic/_doc/1
{
  "movieCd": "20173732",
  "movieNm": "살아남은 아이",
  "movieNmEn": "Last Child",
  "typeNm": "단편"
}

만약 수정되기만을 바란다면 위에서 알아보았던 op_type=index 적용

Elastic Search 에서 수정은 재색인(reindex) 과정까지 발생하기 때문에 생성과정과 비용이 비슷하다.

_update uri 를 사용하면 특정 필드만 수정할 수 있다.

아래와 같이 문서를 먼저 생성하고

PUT movie_dynamic/_doc/1
{
  "counter": 1000,
  "movieNmEn": "Last Child"
}

_update url 을 사용해서특정 필드만 수정시킨다.

POST movie_dynamic/_doc/1/_update
{
  "script": {
    "source": "ctx._source.counter += params.count",
    "lang": "painless",
    "params": {
      "count": 1
    }
  }
}

다시 조회하면 아래와 같이 counter 필드가 1 증가되어있다.

GET movie_dynamic/_doc/1
//result
{
  "_id": "1",
  ...
  "_source": {
    "counter": 1001,
    "movieNmEn": "Last Child"
  }
}

문서 삭제

문서 삭제는 DELETE 메서드와 id 를 url 에 설정한다.

DELETE /movie/_doc/1

_delete_by_query uri 를 사용하면 query 를 사용해 삭제할 목록을 한번에 지정 가능하다.

query 에 대해서는 아래 검색쿼리 항목에서 자세히 설명

POST movie_dynamic/_delete_by_query
{
  "query": {
    "term": {
      "movieCd": "20173732"
    }
  }
}

각 문서를 실시간으로 삭제하는 것이 아니라 인덱스의 스냅숏을 불러와 해당 버전의 문서들을 기반으로 삭제를 수행한다.
만일 대량의 수정 작업이 수행 중일 때 삭제를 수행하면 두 작업의 버전이 충돌하게 되고 version_conflicts 항목을 통해 삭제에 실패한 문서의 건수를 출력한다.

기타 API

_bulk

한 번의 API 호출로 다수의 문서를 색인하거나 삭제할 수 있다.
속도에서 차이가 많기에 대량 색인이 필요한 경우에는 _ bulk 를 사용하는 것이 좋다.
하지만 여러 건의 데이터가 한 번에 처리되기 때문에 도중에 실패가 발생하 더라도 이미 갱신되거나 수정된 결과는 롤백되지 않는다는 점이다. 그러므로 항상 처리 결과를 확인해야 한다.

POST _bulk
{"update":{"_index":"movie_dynamic","_type":"_doc","_id":"1"}}
{"doc":{"movieNmEn":"Last Child"}}
{"delete":{"_index":"movie_dynamic","_type":"_doc","_id":"2"}}
{"index":{"_index":"movie_dynamic","_type":"_doc","_id":"3"}}
{"title":"어벤저스"}

_reindex

인덱스에서 다른 인덱스로 문서를 복사할 때 주로 사용한다.

POST /_reindex
{
  "source": {
    "index": "movie_dynamic"
  },
  "dest": {
    "index": "movie_dynamic_new"
  }
}
POST /_reindex
{
  "source": {
    "index": "movie_dynamic",
    "type": "_doc",
    "query": {
      "term": {
        "title.keyword": "프렌즈: 몬스터섬의비밀"
      }
    }
  },
  "dest": {
    "index": "movie_dynamic_new"
  }
}

Multi index

여러개의 index 를 한번에 검색할 수 있다.

아래처럼 컴마를 사용해 Multi index 를 지정하거나

POST movie_search,movie_auto/_search
{
  "query": {
    "term": {
      "repGenreNm": "다큐멘터리"
    }
  }
}

아래와 같이 와일드카드 문자를 기반으로 Multi index 를 지정할 수 있다.

POST /log-2019-*/_search