私が試してみて、私も最近、にいくつかの研究を行っているとして、この上でいくつかの情報を与える:
すでにあるオフセットならば、なぜスクロールを使用するには?
スクロールをオフセットと組み合わせて使用できるかどうかはわかりません。しかし、私は主な違いは、オフセットクエリはあなたに "偽の"結果を与えるだろうと考えています。 Falseの場合、クエリは正しく実行されますが、その間のすべての更新を考慮してください。再インデクシングの面では、データが失われる危険性があるため、これは間違いです。 10k結果のオフセットクエリを実行し、それを処理するのに2分かかるとします。 2分以内にオブジェクト(または挿入物)の更新があるかもしれません。つまり、クエリを10kでオフセットすると、間に数行をスキップした結果、またはすでにそこにある結果(間に削除があると想像する)につながる可能性があります。ただし、スクロールでは、検索コンテキストを有効に保ち、更新を考慮しない明確で厳密な方法で結果を返します。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-after.html これは、結果が安定するように(オフセットが正しいことを示すカーソルが変わります)、それでも考慮されるはずですが、 2つのリクエストの間に起こるすべての変更(私は思う)。
新しい索引に正しい文書を挿入し、新しい古い索引を新しい索引に再索引付けするためのスクロールを実行するように、構成(たとえばlogstash)を変更することによって再索引付けが行われると思います。スクロールを使用することで、古いデータで作業することができますが、変更が再インデックス操作に影響することはありません。
ドキュメント:
検索要求は、結果の単一の「ページ」を返しますが、スクロールAPIは、結果(あるいは すべての結果)を大量に取得することができ、単一の検索要求から、 と同じ方法で、従来のデータベースでカーソルを使用します。
アップ次:今後のレコードに関する
何? すべてのデータをスクロールし終わった後、数秒後に新しいデータがインデックスに入ったとしたら、それはどのように が動作しますか?ストリーミングのように新しいレコードを取得するためにスクロールしますか?
スクロールでは、最初のスクロール要求で作成した結果が保持されます。これは、スナップショットを作成し、変更が特定のスクロールに公開されないようにすることによって行われます。ドキュメント:
スクロール要求から返される結果は、時間のスナップショットのように 、最初の検索要求がなされた時点での状態指数の を反映しています。その後の文書変更(インデックス、 更新または削除)は、後の検索要求にのみ影響します。
そして第三に:
と仮定接続があるため、サーバの負荷やインターネットの問題が壊れている
、 それは開始からのデータのスクロールが開始されますか?
これは問題ではありません。スクロールにはアサイメントが付いています。 POST /twitter/tweet/_search?scroll=1m
ここで、割り当て、1m
は、ESを使用して検索コンテキストをどのくらい保持しているかをelasticsearchに示します。つまり、接続が切断された場合は、スクロールIDを取得してこれを使用して新しいリクエストを作成するだけです。 ESはそのIDを既存の検索コンテキストに一致させ、期待される結果を提供します。ドキュメント:スクロールを使用するためには
、最初の検索要求は、それが 検索を維持見る(生きている「検索コンテキスト」を維持する必要がありますどのくらいElasticsearch を伝えるクエリ文字列に スクロールパラメータを指定する必要があります文脈生存)、例えば?scroll = 1m。一般
、すべての情報はここで見つけることができます。このことができます https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
希望、
アルトゥール