Elasticsearch のリファレンスを見ながら動かしていて、API リクエストに refresh をつけている箇所があって気になったので調べてみました。
この記事を書いている時の Elasticsearch のバージョンは 6.2.2 です。
内容としては以下のドキュメントをまとめたものになります。
?refresh
どの処理で使えるのか?
Index
Update
Delete
Bulk API
何のための設定か?
APIリクエストして処理させた結果が検索対象として反映されるタイミングを制御するための設定。
設定可能な値
- 値なし、または true
処理の中で即座にプライマリシャードとレプリカシャードに反映される。
なお、このリフレッシュは他の処理にも影響する。
パフォーマンスに問題がないか十分に検証してから設定すること。 - wait_for
index.refresh_interval の設定値(デフォルトだと1秒)に達するか、index.max_refresh_listeners の設定値以上までこのパラメータが付いたリクエストが溜まるまで待って反映させるが、Refresh API が使われた場合はその時点で反映される(ただし Refresh API は全てのシャードをリフレッシュすることに注意が必要)
この設定がついたリクエストにのみ影響する。 - false(デフォルト)
反映させない。
設定の勘所
refresh=wait_for が必要と判断される場合を除いて、基本的には refresh=false を設定するのが無難。
refresh=true にした場合非効率なシャードが積み上がっていって、最終的に効率的なシャードにマージするコストが上がる。
refresh=wait_for をつけたリクエストは連続して実行せずに Bulk API などでまとめて実行すること。ただし index.refresh_interval が小さい場合は refresh=true にした場合と同じ問題が発生する。
実行サンプル
$ curl -H "Content-type: application/x-ndjson" -X POST http://localhost:9200/shop/goods/_bulk?refresh --data-binary @request_bulk.json
$ curl -H "Content-type: application/x-ndjson" -X POST http://localhost:9200/shop/goods/_bulk?refresh=wait_for --data-binary @request_bulk.json
$ curl -H "Content-type: application/x-ndjson" -X POST http://localhost:9200/shop/goods/_bulk?refresh=false --data-binary @request_bulk.json
index.max_refresh_listeners を設定した場合の挙動(2018.3.9 更新)
以下のように index.refresh_interval を -1 、index.max_refresh_listeners を 5 に設定してインデックスを作成する。
curl -X PUT 'localhost:9200/shop' -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards" : 1,
"number_of_replicas" : 0,
"refresh_interval" : "-1",
"max_refresh_listeners" : 5
}
}
}
'
その後、個別に端末を立ち上げて以下のようにインデクシングする。
curl -X POST 'localhost:9200/shop/goods/?pretty&refresh=wait_for' -H 'Content-Type: application/json' -d'
{
"name" : "test"
}
'
同様に端末を立ち上げてインデクシングしていくと、6回目のリクエストの際に全てのリクエストがリフレッシュされた。