데이터베이스/Elasticsearch

Elasticsearch에서 refresh 정리

반응형

Elasticsearch에서 document를 업데이트하고 바로 해당 정보를 조회하려고 했다.

하지만 조회가 되지 않았다. 분명이 업데이트가 종료된 것을 확인 했는데 왜 그런지 의문이 들었다.


그래서 찾아봤는데 document가 업데이트가 되고나서 인덱스에서 실제로 조회가 될 수있는 상태가 되기위해서는 일정시간이 필요한 것 같다.

자세히는 모르지만 다시 인덱싱을 걸기 때문에 그러는건 아닌가 생각된다.


그래서 이런경우에 업데이트가 종료 되었다고 알리는 시간을 검색이 가능하게 변경된 시간까지 포함해서 알려주도록 하는 옵션이 존재한다.


그렇게 되면 업데이트가 되고 검색이 가능한줄 알고 프로그램을 작성하다가 버그가 발생하는 비율을 줄일 수 있다.


일반적인 bulkInsert나 update, create같은 명령에는 refresh: wait_for를 사용하고 update by query 등에 명령어에서는 waitForCompletion=true 옵션을 부여하여 검색을 사용한다.


예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
client.bulk({
refresh: wait_for,
  body: [
    // action description
    { index:  { _index: 'myindex', _type: 'mytype', _id: 1 } },
     // the document to index
    { title: 'foo' },
    // action description
    { update: { _index: 'myindex', _type: 'mytype', _id: 2 } },
    // the document to update
    { doc: { title: 'foo' } },
    // action description
    { delete: { _index: 'myindex', _type: 'mytype', _id: 3 } },
    // no document needed for this delete
  ]
}, function (err, resp) {
  // ...
});
cs

api 문서를 보면 조금 더 정확한 내용을 확인할 수 있다.


참고

https://stackoverflow.com/questions/40676324/elasticsearch-updates-are-not-immediate-how-do-you-wait-for-elasticsearch-to-fi

https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html



주의

하지만 이렇게 프로그램을 작성할 경우에는 예상하는 바와 같이 엄청난 시간이 소요된다.

실제로 이번에 프로젝트를 진행할 때 해당 옵션없이 업데이트를 할 때 5분걸렸던 양이 1시간이 되어도 되지 않았다. 이럴 경우에는 하나하나 다 update 명령을 사용하지말고 bulk로 작업하는 것을 추천한다. 훨씬빠르다.



반응형