4

google app engine search APIを使用しているときに、大きな結果セット(> 1000)を返すクエリがあり、カーソルを使用して結果セット全体を収集する必要がある場合、返されたドキュメントの結果が不確定になります。 number_found_accuracyは、結果のサイズよりも小さくなっています。

つまり、同じクエリが2回実行され、カーソルを介してすべてのドキュメントが収集されても、同じドキュメントは返されません。ただし、number_found_accuracyが結果のサイズよりも大きい場合を除きます(たとえば、最大10000を使用)。そうして初めて、常に同じドキュメントを取得できます。

number_found_accuracyがどのように機能するかについての私たちの理解は、それがnumber_foundの推定にのみ影響するということです。カーソルを使用してすべての結果を取得すると、1つの大きなクエリを実行した場合と同じ結果を取得できると想定しました。

number_found_accuracyまたはカーソルの使用を誤解していますか、それともバグを見つけましたか?

4

1 に答える 1

1

number_found_accuracy の理解は正しいです。あなたが観察している動作は、レプリケートされたクエリのフェールオーバーと、number_found_accuracy を指定するクエリが継続トークンを使用する将来のクエリに与える影響との間の驚くべき相互作用だと思います。

Search API を使用してドキュメントのインデックスを作成すると、高レプリケーション データストア (つまりMegastore ) と同じメカニズムを使用して、複数の異なるレプリカにドキュメントが保存されます。これらのドキュメントが各レプリカでライブになるまでの時間は、多くの要因によって異なります。通常は即時ですが、単一の (インデックス、名前空間) ペアにバッチ書き込みを行う場合、遅延はさらに長くなる可能性があります。

検索は、これらのレプリカのいずれかで実行できます。元の検索とは異なるレプリカで継続トークンを使用する検索を実行する可能性さえあります。元のレプリカや継続レプリカがインデックス作成作業に追いついている場合、ライブ ドキュメントのセットが異なる可能性があります。「最終的には」一貫性が保たれますが、常に即時であるとは限りません。

クエリで number_found_accuracy を指定すると、number_found_accuracy の結果を返すかのように、ほとんどのクエリを実行する必要があります。特に、一致するドキュメントを見つけてカウントするには、投稿リストのさらに下を読む必要があります。投稿リストを読み取ると、関連するファイル ブロックがさまざまなキャッシュに挿入されます。

次に、カーソルを使用して検索を行うと、元の検索に使用したのと同じレプリカで、実際のドキュメントをはるかに迅速に読み取ることができます。したがって、同じドキュメント セットのインデックス作成が完了していない別のレプリカに継続検索がフェールオーバーする可能性は低くなります。あなたが観察した一貫性のない結果は、この種の継続クエリのフェイルオーバーの結果だと思います。

要約すると、 number_found_accuracy を大きな値に設定すると、そのレプリカのキャッシュが効果的にプレウォーミングされます。したがって、継続検索の最速のレプリカになることはほぼ確実です。インデックス作成に追いつこうとしているレプリカに直面すると、number_found_accuracy が結果の一貫性に直接影響するように見えますが、実際には単なる副作用です。

于 2014-04-10T19:27:19.427 に答える