16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Elasticsearch の API リクエストにつける refresh についてまとめた

Last updated at Posted at 2018-02-22

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回目のリクエストの際に全てのリクエストがリフレッシュされた。

参考になった記事

Where are my documents?Refreshing news...

16
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?