たとえば、_stats
のreduce関数を使用したビューを定義します。ビューをクエリすると、結果が毎回空になってしまうような例として:
shell> curl -s 'http://localhost:9500/default/_design/dev_test3/_view/view1?full_set=true' {"rows":[ ] }
数分または数時間にわたりこのクエリを何度も繰り返しても、常に空の結果セットが返却されるような場合です。
stale=false
でビューを照会しようとすると、次のようになります:
shell> curl -s 'http://localhost:9500/default/_design/dev_test3/_view/view1?full_set=true&stale=false' {"rows":[ ], "errors":[ {"from":"local","reason":"Builtin _stats function requires map values to be numbers"}, {"from":"http://192.168.1.80:9502/_view_merge/?stale=false","reason":"Builtin _stats function requires map values to be numbers"}, {"from":"http://192.168.1.80:9501/_view_merge/?stale=false","reason":"Builtin _stats function requires map values to be numbers"}, {"from":"http://192.168.1.80:9503/_view_merge/?stale=false","reason":"Builtin _stats function requires map values to be numbers"} ] }
その後、デザインドキュメントを見て、値が数値ではないので動作していないことを確認します。
{ "views": { "view1": { "map": "function(doc, meta) { emit(meta.id, meta.id); }", "reduce": "_stats" } } }
1つの重要な問題は、stale=false
を使用したクエリを実行するときは、エラーを確認できますが、stale=update_after
(デフォルト)またはstale=ok
を使用したクエリを実行するときは、確認できないのはなぜかということです。その答えは簡単です:
stale=false
は、インデックスの更新/構築のトリガーを意味し、更新/構築が完了するまで待ち、その後ビューの結果のストリーミングを開始します。この例では、インデックスのビルド/更新が失敗するので、クライアントはエラーを取得し、なぜ失敗したのかを失敗したすべてのノードから読み取ることができます。
stale=update_after
は、すぐにインデックスの内容のストリーミングを開始し、その後(インデックスがすでに最新のものでない場合)インデックの更新をトリガとすること意味し、クエリ応答には、stale=false
シナリオで発生するようなインデックスエラーを示しません。この特定の例では、エラーは初期インデックスの構築時に発生しているので、ビューのクエリがシステムに到着したときにインデックスが空になっていて、空の結果セットがかえって来ています。
stale=ok
は、インデックスの更新をトリガとしないという点を除き、(2)と非常によく似ています。
最後に、ユーザのMap/Reduce関数に関連するインデックス構築/更新でのエラーは、ノードごとのmapreduce_errors.#
と一致するファイル名の専用のログファイルで確認できます。 たとえば、ノード1の*mapreduce_errors.1
ファイルでは次のエラーを出力しています:
[mapreduce_errors:error,2012-08-20T16:18:36.250,n_0@192.168.1.80:<0.2096.1>] Bucket `default`, main group `_design/dev_test3`, error executing reduce function for view `view1' reason: Builtin _stats function requires map values to be numbers