(57)【特許請求の範囲】
【請求項１】
１以上のコンピューティングデバイスによって実行される方法であって、前記方法は、
１以上のトークンを含むインデックス変更情報を生成することであって、前記インデックス変更情報は、ドキュメントの新たなバージョンと、前記ドキュメントの以前のバージョンとの間の１以上の特定した差分の少なくとも一部に基づくことと、
前記インデックス変更情報と関連する時間ベースの値とを格納することと、
前記インデックス変更情報に関連付けられた前記時間ベースの値と、前記ドキュメントのインデックスと関連付けられた時間ベースの値とを比較することと、
前記比較の少なくとも一部に基づいて、前記インデックス変更情報の前記１以上のトークンを、複数のインデックスサーバのうちの任意のインデックスサーバへ提供することと
を含み、
前記ドキュメントは、前記インデックスサーバに割り当てられたドキュメントネームスペースに属し、
前記インデックス変更情報は、前記ドキュメントネームスペースの識別子を含み、
前記インデックス変更情報の前記１以上のトークンを前記インデックスサーバへ提供することは、前記インデックス変更情報の前記ドキュメントネームスペースの前記識別子の少なくとも一部に基づく、方法。
【請求項２】
請求項１に記載の方法であって、前記１以上のトークンの少なくとも１つは、前記ドキュメントの前記以前のバージョンではなく、前記ドキュメントの前記新たなバージョンで識別される、方法。
【請求項３】
請求項１に記載の方法であって、前記１以上のトークンの少なくとも１つは、前記ドキュメントの前記新たなバージョンではなく、前記ドキュメントの前記以前のバージョンで識別される、方法。
【請求項４】
請求項１に記載の方法であって、さらに、追加専用のログにおいて、前記インデックス変更情報と、前記関連する時間ベースの値とを格納することを含む、方法。
【請求項５】
請求項１に記載の方法であって、前記インデックス変更情報の前記１以上のトークンを提供することは、前記インデックスサーバに、前記１以上のトークンの少なくとも一部に基づいて前記ドキュメントの前記インデックスを更新させる、方法。
【請求項６】
請求項１に記載の方法であって、前記インデックス変更情報に関連付けられる前記時間ベースの値とは、タイムスタンプである、方法。
【請求項７】
請求項１に記載の方法であって、さらに、前記インデックスサーバから前記ドキュメントの前記インデックスに関連付けられる前記時間ベースの値を受信することを含む、方法。
【請求項８】
請求項１に記載の方法であって、前記インデックス変更情報の前記１以上のトークンを前記インデックスサーバへ提供することは、前記インデックスサーバへ割り当てられたドキュメントネームスペースに対応する前記インデックス変更情報の少なくとも一部に基づく、方法。
【請求項９】
請求項１に記載の方法であって、
前記比較の結果は、前記インデックスサーバが前記インデックス変更情報に関して最新のものとなっているかどうかを示し、
前記インデックス変更情報の前記１以上のトークンを前記インデックスサーバへ提供することは、前記比較の前記結果の少なくとも一部に基づく、方法。
【請求項１０】
請求項１に記載の方法であって、他のインデックス変更情報は、前記ドキュメントとは異なる他のドキュメントについての情報を表すトークンを含む、方法。
【請求項１１】
請求項１に記載の方法であって、さらに、
メッセージキューからの前記ドキュメントについての情報に基づき、前記ドキュメントの前記新たなバージョンを特定することを含み、
前記メッセージキューは、コンテンツ管理システムによって管理される１以上のドキュメントへの変更についての情報を格納し、
前記インデックス変更情報を生成することは、前記ドキュメントの前記新たなバージョンを特定することに応じる、方法。
【請求項１２】
請求項１に記載の方法であって、前記インデックス変更情報は第１のインデックス変更情報であり、前記ドキュメントは第１のドキュメントであり、前記方法は、さらに、
前記第１のインデックス変更情報でない第２のインデックス変更情報を生成することであって、前記第２のインデックス変更情報は少なくとも１つのトークンを含み、前記第２のインデックス変更情報は、前記第１のドキュメントでない第２のドキュメントの新たなバージョンと、前記第２のドキュメントの以前のバージョンとの間の少なくとも１つの特定した差分における少なくとも一部に基づく、ことと、
前記第２のインデックス変更情報と関連するバイパスフラグ値とを格納することと、
前記バイパスフラグ値の少なくとも一部に基づいて、前記第２のインデックス変更情報の前記少なくとも１つのトークンをインデックスサーバへ提供しないように決定することと
を含む、方法。
【請求項１３】
１つ以上のコンピューティングデバイスによって実行されると、請求項１乃至１２のいずれか１項に記載の方法の動作を行わせる命令を含むプログラム。
【請求項１４】
システムであって、
ストレージメディアと、
１以上のプロセッサと、
前記ストレージメディアに格納した命令であって、前記１以上のプロセッサによって実行されるように構成される命令とを含み、前記命令は、
１以上のトークンを含むインデックス変更情報を生成することであって、前記１以上のトークンは、ドキュメントの新たなバージョンと、前記ドキュメントの以前のバージョンとの間の特定した差分の少なくとも一部に基づくことと、
前記インデックス変更情報とバージョン指標とを関連付けれることと、
前記インデックス変更情報に関連付けられた前記バージョン指標を、前記ドキュメントのインデックスと関連付けられた値と比較することと、
前記比較の少なくとも一部に基づいて、前記インデックス変更情報の前記１以上のトークンを、複数のインデックスサーバのうちの任意のインデックスサーバへ提供することと
を含み、
前記ドキュメントは、前記インデックスサーバに割り当てられたドキュメントネームスペースに属し、
前記インデックス変更情報は、前記ドキュメントネームスペースの識別子を含み、
前記インデックス変更情報の前記１以上のトークンを前記インデックスサーバへ提供することは、前記インデックス変更情報の前記ドキュメントネームスペースの前記識別子の少なくとも一部に基づく、システム。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本開示の技術は、一般的に情報検索コンピュータシステムに関し、より詳細には、インスタントインデックスのための手法を有するマルチユーザの検索システムに関する。
【背景技術】
【０００２】
[0002]コンピュータは膨大な量の情報の中で関連情報を検索するための非常に強力なツールである。インデックスは、コンピュータを使用して、大規模なコーパスの情報の中から注目の情報を効率的に識別するためのありふれた仕組みである。通常のインデックスは、当該キーワードが抽出又は導出されるドキュメント情報への、体系化したキーワードのマッピングである。一例として、世界の公開されたアクセス可能なウェブページのインデックスとしては、当該ウェブページの単語を、当該単語を含むウェブページのサブトークンのセットへマッピングしてもよい。
【０００３】
[0003]実際の物理的なインデックスそのもの（例えば、１以上のコンピュータに格納されるインデックスデータ）とシステムのユーザとの間で、検索システムが、ソフトウェアクッション又はレイヤとして通常提供される。本質的には、検索システムは、基本的なインデックスの詳細についてユーザが知る又は気にかけなくてよいようにする。通常、インデックスの情報に対するユーザからの全ての要求は検索システムによって処理される。基本的なインデックスの実装の知識を全てのユーザが有していなくても、例えば、情報に対するユーザの要求に関連するドキュメントが検索システムによってインデックスを用いて識別されうる。この方法では、検索システムは、情報がどのようにインデックスが付与されるか又はアクセスされるかに関係なく関連情報へのアクセスをユーザへ提供する。世界の公開されているアクセス可能なウェブページの中から、関連情報を識別するための１つの良く知られた検索システムは、カリフォルニアのマウンテンデューにあるGoogle（登録商標） Incによって提供されるGOOGLE（登録商標）インターネット検索エンジンである。
【０００４】
[0004]検索システムの１つの機能は、検索クエリ（ここでは単に短縮して“クエリ（問い合わせ）”）に応答することである。クエリは、１以上の検索タームのトークンのセットを含む論理的な表現で定義されてもよく、インデックスが付与されたドキュメントのサブセットの識別子となる。例えば、インターネット検索エンジンからの情報に対する要求の扱いを考慮しなければならない。動作中に、本要求は、通常、サーバコンピュータ上でインデックスからの特定の検索結果（例えば、単語”大学（college）”及び”バスケットボール（basketball）”を含む全てのインターネットウェブページのリスト）を取り出すための１以上のハイパーテキスト転送プロトコル、即ち“ＨＴＴＰ”要求としてクライアントシステムによって発行される。当該要求に応じて、検索システムは、通常、検索ターム“college”及び“basketball”に最も関連するものと考えられるそれらのインターネットウェブページへのハイパーリンクを含むウェブページを返す。
【０００５】
[0005]インターネット検索エンジンは、インターネット上で公的に利用可能な世界の全ての情報を検索するのに非常に適している。しかしながら、最近では、複数のユーザが、インターネット上で公的にアクセス可能でない、又は、インターネット検索エンジンによってインデックスが付与されていない、かなりの量の個人のデジタル情報を蓄積し始めている。そのような情報は、他の個人のデジタル情報及びプライベートなデジタル情報の中で、例えば、個人のデジタル写真や、学校及び仕事のドキュメントを含むことができる。いくつかの例で、ユーザの個人的なデジタル情報は、定義されたグループユーザの間で共有される。例えば、従業員は、仕事のドキュメントを他の同僚と共有してもよいし、或いは、ユーザはデジタル写真を友達や家族と共有してもよい。
【０００６】
[0006]複数のユーザが彼ら全ての個人のデジタル情報を格納し管理し始めている１つの方法は、クラウドデータストレージサービスを用いることである。そのようなサービスは、ユーザが彼らの個人デジタル情報を、彼らの種々のエンドユーザコンピューティングデバイスからインターネット又は他のネットワーク上でアクセス可能なサーバコンピュータにアップロードして格納することを許容する。いくつかの例で、当該サービスは、ユーザがエンドユーザコンピューティングデバイスでローカルに情報にアクセスすることを容易にするために、エンドユーザコンピューティングデバイスとサービスサーバコンピュータとの間で情報を同期してもよい。１つの良く知られたクラウドデータストレージサービスは、カルフォルニアのサンフランシスコにあるDropbox社によって提供されるDROPBOXコンテンツ管理サービスである。
【０００７】
[0007]クラウドデータストレージサービスのユーザは、そのようなサービスによって提供される彼らの個人デジタル情報の検索方法や配置方法を評価するであろう。そのような個人的なデジタル情報は、通常、インターネット上で公的にアクセス可能ではない。本理由及び他の理由において、インターネット検索エンジンは、一般的には、それらのユーザの検索ニーズに合致するような適切なものではない。
【０００８】
[0008]ここで説明した上記アプローチは、さらに追及しうるアプローチであって、既に着想され、追及されたアプローチではない。したがって、特に示唆しない限り、ここで説明した任意のアプローチが、ここに組み込まれることにより単に先行技術として認識されることが想定されるべきではない。
【図面の簡単な説明】
【０００９】
【図１】[0009]図１は、本発明のいくつかの実施形態に係る、基本的なコンピューティングデバイスのブロック図である。
【図２】[0010]図２は、本発明のいくつかの実施形態に係る、コンピューティングデバイスの動作を制御するための基本的なソフトウェアシステムのブロック図である。
【図３】[0011]図３は、本発明のいくつかの実施形態に係る、マルチユーザ検索システムを含むクライアント／サーバシステムのブロック図である。
【図４】[0012]図４は、本発明のいくつかの実施形態に係る、マルチユーザ検索システムを含むサービングシステムのブロック図である。
【図５】[0013]図５は、本発明のいくつかの実施形態に係る、共有ドキュメントインデックスのインデックスシャードのブロック図である。
【図６】[0014]図６は、本発明のいくつかの実施形態に係る、マルチユーザ検索システムにおけるトークンの格納に対して可能な手法を示す図である。
【図７】[0015]図７は、本発明のいくつかの実施形態に係る、共有ドキュメントインデックスを構成するためのマルチユーザ検索システムのインデクサーのブロック図である。
【図８】[0016]図８は、本発明のいくつかの実施形態に係る、マルチユーザ検索システムのインデックスサーバでのインデックスの可能性のあるライフサイクルを示す図である。
【図９】[0017]図９は、本発明のいくつかの実施形態に係る、共有ドキュメントインデックスへのインデックス変更情報を生成するためのマルチユーザ検索システムにおけるインデクサーのブロック図である。
【図１０Ａ】、
【図１０Ｂ】[0018]図１０Ａ及び図１０Ｂは、本発明のいくつかの実施形態に係る、マルチユーザ検索システムのインスタントインデクサーにおける例示動作のフローチャートである。
【図１１Ａ】、
【図１１Ｂ】[0019]図１１Ａ及び図１１Ｂは、本発明のいくつかの実施形態に係る、インスタントインデクサーの例示動作中にマルチユーザ検索システムのトークンの格納における可能性のある種々の状態を示す図である。
【図１２Ａ】、
【図１２Ｂ】[0020]図１２Ａ及び図１２Ｂは、本発明のいくつかの実施形態に係る、簡単にインデックスを付与するための処理を示すフローチャートである。
【図１３Ａ】[0021]図１３Ａは、本発明のいくつかの実施形態に係る、変更ドキュメントメッセージのブロック図である。
【図１３Ｂ】[0022]図１３Ｂは、本発明のいくつかの実施形態に係る、インデックス変更情報ジャーナルエントリのブロック図である。
【発明を実施するための形態】
【００１０】
[0023]以下の詳細な説明において、本開示技術の十分な理解を提供するために、説明の目的で多くの特定事例を記載する。しかしながら、本開示の技術がそれらの特定事例なしで実行されうるということが明らかであろう。他の例では、本開示の技術を不必要に不明りょうにすることを避けるために、既知の構成やデバイスがブロック図の形式で示される。フローチャートに関して、フローチャート内のブロックは方法ステップと、当該方法ステップを実行するための装置要素との両方を表してもよい。手近な特定の実施形態の要件に依存して、対応する装置要素は、ハードウェア、ソフトウェア、ファームウェア、又はそれらの組み合わせで構成されてもよい。
【００１１】
[0024]用語“第１の”及び“第２の”などは、種々の要素を説明するためにここで使用されるものの、それらの要素はそれらの用語によって限定されるべきではないことが理解されるであろう。それらの用語は、他の要素から区別するためにのみ使用される。例えば、本発明の範囲から逸脱することなく、第１のデバイスは、第２のデバイスと称されてもよく、同様に、第２のデバイスは第１のデバイスと称されてもよい。第１のデバイスおよび第２のデバイスは両方ともデバイスであるが、同一のデバイスでなくてもよい。
【００１２】
[0025]本明細書で使用される専門用語は特定の実施形態のみを説明する目的であり、特許請求の範囲における請求項の限定を意図するものではない。本明細書及び添付の特許請求の範囲で使用されるように、単数形“ａ”、“ａｎ”及び“ｔｈｅ”は、別途明確に言及しない限り、同様に複数形を含むことも意図されている。ここで使用される用語“ａｎｄ／ｏｒ（〜及び〜少なくとも１つ）”は、１以上の関連する記載の項目の可能な全ての組み合わせを参照し、かつ、包含することも理解されるであろう。用語“含む”、“含んでいる”、“備える”、及び“備えている”の少なくとも１つは、本明細書で使用される場合、記載した特徴、整数、ステップ、動作、要素、及びコンポーネントの少なくとも１つの存在を特定するものの、１つ以上の他の特徴、整数、ステップ、動作、要素、コンポーネント及びそれらのグループの少なくとも１つを除外するわけではないこともさらに理解されるであろう。
【００１３】
[0026] 用語“ｉｆ（であれば）”は、文脈に従って、“ｗｈｅｎ（のとき、の場合）”、“ｕｐｏｎ（の際に）”、“判定に応じて”又は“検出に応じて”を意味するように解釈されてもよい。同様に、フレーズ“判定した場合”又は“（記載した条件又はイベントが）検出された場合”は、“判定した際に”、“判定に応じて”、“（記載した条件又はイベント）を検出した際に”又は“（記載した条件又はイベント）を検出することに応じて”とを意味するように解釈されてもよい。
【００１４】
＜概要＞
[0027]ドキュメントのインスタントインデックス化のための方法を有するマルチユーザコンピュータシステムについて説明する。当該ドキュメントは、例えば、ユーザによって最近作成された又は最近修正されたドキュメントを含んでもよい。他の態様における種々の実施形態は、ドキュメントが作成又は修正された後にすぐに（例えば数分の間に）、ユーザがドキュメントのフルテキスト検索及びファイル名検索を実行することを許容する。
【００１５】
[0028]他の態様における本発明の種々の実施形態は、新たなドキュメントが作成され既存のドキュメントが時々更新されるマルチユーザ検索システムにおいて、ユーザ個人のドキュメントにおけるフルテキスト検索、及びファイル名検索を容易にする。
【００１６】
[0029]他の態様における本発明の種々の実施形態は、コンピュータを用いて情報検索の技術分野における改善をもたらす。
【００１７】
[0030]他の態様における本発明の種々の実施形態は、クラウドデータストレージサービスプロバイダによって提供されるマルチユーザクラウドデータストレージサービスを改善する。
【００１８】
[0031]他の態様における本発明の種々の実施形態は、マルチユーザ検索システムの機能構成を改善する。
【００１９】
[0032]一実施形態によれば、トークン格納部は、現在のバージョンのドキュメントについてのトークンのセットを格納する。インスタントインデックス化のための方法は、新たなバージョンのドキュメントをトークン化することと、新たなバージョンのドキュメントについてのトークンのセットを生成することとを含む。当該方法は、さらに、新たなバージョンのドキュメントについてのトークンのセットと、現在のバージョンのドキュメントについてのトークンのセットとの間の差分を特定することと、ドキュメントにインデックスを付与するために使用するトークンを含むインデックス変更情報を生成することと、タイムスタンプに関連して生成したインデックス変更情報（index mutation）を格納することと、特定のタイムスタンプよりも新しいタイムスタンプに関連付けられた、インデックスサーバのための生成したインデックス変更情報をインデックスサーバへ提供することとを含む。
【００２０】
[0033]一態様において、本方法は、さらに、新たなバージョンのドキュメントについてのトークンのセットと、現在のバージョンのドキュメントについてのトークンのセットとの間の特定した差分に基づき、ドキュメントにインデックスを付与するために使用しないトークンを決定することと、ドキュメントにインデックスを付与するために使用しないトークンを含むインデックス変更情報を生成することとを含む。
【００２１】
[0034]他の態様において、本方法は、さらに、インデックスサーバから送信されたネットワーク要求の特定のタイムスタンプを受信することを含む。
【００２２】
[0035]さらに他の態様において、本方法は、さらに、生成したインデックス変更情報を分散型コミットログ（commit log）へ付加することを含む。
【００２３】
[0036]さらに他の態様に、本方法は、さらに、トークン化に応じてメッセージをメッセージキューに置くことと、複数のドキュメントにおける新たなバージョンのドキュメントについてのトークンのセットを生成することとを含む。当該メッセージはドキュメントの識別子を含む。本方法は、さらに、メッセージキューからメッセージを取り出すことと、取り出したメッセージを処理することとを含む。
【００２４】
[0037]さらに他の態様において、本方法は、さらに、生成したインデックス変更情報に関連付けるためにタイムスタンプを決定することを含む。
【００２５】
[0038]さらに他の態様において、本方法は、さらに、トークンの格納において新たなバージョンのドキュメントについて生成したトークンのセットを格納することを含む。
【００２６】
[0039]さらに他の態様において、本方法は、さらに、生成したインデックス変更情報に基づき、インデックスサーバでメモリ内の差分インデックス（delta index）を更新することを含む。
【００２７】
[0040]さらに他の態様において、本方法は、さらに、インデックスサーバが新たなインデックス変更情報について定期的にポーリングを行うことを含む。
【００２８】
[0041]他の態様において、本発明は、前述したステップを実行するように構成される、コンピュータシステム及びコンピュータで読取可能な媒体を包含する。
【００２９】
＜基本的なコンピュータシステムハードウェア及びソフトウェア＞
[0042]本開示の技術は、１つ以上のコンピューティングデバイス上で実施されてもよい。そのようなコンピューティングデバイスは、限定はしないが、クライアントコンピュータ、サーバコンピュータ、ネットワークデバイス、モバイルデバイス、セルラー電話機、スマートフォン、ラップトップコンピュータ、デスクトップコンピュータ、ワークステーションコンピュータ、携帯情報端末、ブレードサーバコンピュータ、メインフレームコンピュータ、及び他のタイプのコンピュータを含む種々の形式で実装されてもよい。以下で説明するコンピューティングデバイス、及びそれらの接続、関係、及び機能を含むそのコンポーネントは、本明細書で説明する開示技術の実施形態の一例を意味し、当該実施形態を限定する意図はない。本開示の技術を実施するのに適切な他のコンピューティングデバイスは、異なる接続、関係及び機能を有するコンポーネントを含む異なるコンポーネントを含んでもよい。
【００３０】
＜基本的なコンピューティングデバイス＞
[0043]次に、図1を参照して、本発明のいくつかの実施形態に従って、本開示の技術を実施するのに適した基本的なコンピューティングデバイス１００のブロック図について説明する。コンピューティングデバイス１００は、バス１０２又はメインメモリ１０６をアドレス解決し、かつ、コンピューティングデバイス１００の種々のコンポーネント間で及び種々のコンポーネントの中でデータを転送するための他の通信機構を含む。コンピューティングデバイス１００はまた、情報を処理するためのバス１０２と結合したハードウェアプロセッサ１０４を含む。ハードウェアプロセッサ１０４は、一般用途マイクロプロセッサ、システム・オン・チップ（ＳｏＣ）、又は説明した技術を実施するのに適した他のプロセッサであってもよい。
【００３１】
[0044]ランダムアクセスメモリ（ＲＡＭ）又は他の動的ストレージデバイスなどのメインメモリ１０６は、情報やプロセッサ１０４によって実行される命令を格納するためにバス１０２に結合される。メインメモリ１０６はまた、プロセッサ１０４によって実行されるべき命令の実行中に一時変数又は他の中間情報を格納するために使用されてもよい。プロセッサ１０４へアクセス可能な一時的でない記憶媒体に格納される場合、そのような命令は、コンピュータデバイス１００を当該命令で指定された動作を実行するようにカスタマイズされた特定用途のコンピューティングデバイスへ変換する。
【００３２】
[0045]コンピューティングデバイス１００はさらに、静的情報及びプロセッサ１０４への命令を格納するためにバス１０２に結合された読み取り専用メモリ（ＲＯＭ）１０８又は他の静的ストレージデバイスを含む。
[0046]大容量ストレージデバイス１１０は、磁性式メモリ、光学式メモリ、半導体メモリ、光磁気メモリ、フラッシュメモリ、又は大容量ストレージ技術を利用可能な他のものなどの固定媒体若しくは取り外し可能な媒体に、情報及び命令を永続的に格納するためのバス１０２に結合される。大容量ストレージデバイスは、ネットワーク上で共有され、或いは、専用の大容量ストレージであってもよい。通常、大容量ストレージデバイス１１０（例えば、デバイスに対するメインハードディスク）は、オペレーティングシステム、ユーザアプリケーションプログラム、ドライバ、他のサポートファイル、及び全ての種類の他のデータファイルを含む、コンピュータデバイスの動作を方向付けるためのプログラム本体とデータを格納する。
【００３３】
[0047]コンピューティングデバイス１００は、バス１０２を介して、情報をコンピュータユーザに表示するための液晶ディスプレイ（ＬＣＤ）又は他の電子的な視覚ディスプレイなどのディスプレイ１１２へ結合されうる。ディスプレイ１１２はまた、タッチジェスチャ（例えば、指又はスタイラス）入力をプロセッサ１０４へ通知するためのタッチ感知式のディスプレイであってもよい。
【００３４】
[0048]アルファベットキー及び他のキーを含む入力デバイス１１４は、情報及びコマンドの選択をプロセッサ１０４へ通知するためのバス１０２へ結合される。
【００３５】
[0049]ユーザ入力デバイスの他のタイプは、プロセッサ１０４へ方向情報やコマンドの選択を通知し、ディスプレイ１１２上でのカーソルの移動を制御するためのマウス、トラックボール、又はカーソル方向キーなどのカーソル制御部１１６である。当該入力デバイスは、通常、デバイスが平面上の位置を特定することを許容する第１軸（例えば、ｘ）と第２軸（例えば、ｙ）の二軸の２つの自由度を有する。
【００３６】
[0050]コンピューティングデバイス１００は、カスタマイズされた配線論理、１以上の特定用途向け集積回路（ＡＳＩＣ）若しくは１以上のフィールドプログラマブルアレイ（ＦＰＧＡ）、ファームウェア、又は、コンピューティングデバイスと協働してコンピューティングデバイス１００を特定用途向けの機械とさせる若しくはプログラムするプログラム論理を用いて、ここで説明される方法を実行することができる。
【００３７】
[0051]ここで説明する方法は、メインメモリ１０６に含まれる１以上の命令の１以上のシーケンスを実行するプロセッサ１０４に応じて、コンピューティングデバイス１００によって実行されてもよい。そのような命令は、ストレージデバイス１１０などの他の記憶媒体からメインメモリ１０６へと読み込まれてもよい。メインメモリ１０６に含まれる命令のシーケンスの実行は、プロセッサ１０４にここで説明する処理ステップを実行させる。代替的な実施形態において、配線回路は、ソフトウェア命令の代わりに、又は、組み合わせで使用されうる。
【００３８】
[0052]ここで使用される用語“記憶媒体”は、コンピューティングデバイスを特定の様式で動作させるデータ及び命令の少なくとも１つを格納する非一時的な媒体として参照される。そのような記憶媒体は、不揮発性の媒体及び揮発性の媒体の少なくとも１つを備えてもよい。不揮発性媒体は、ストレージデバイス１１０などの、例えば、光学ディスク、磁性ディスク、又は半導体ドライバを含む。揮発性媒体はメインメモリ１０６などの動的メモリを含む。記憶媒体の一般的な形式は、例えば、フロッピー（登録商標）ディスク、フレキシブルディスク、ハードディスク、半導体ドライブ、磁性テープ、若しくは任意の他の時期的データ記憶媒体、CD-ROM、若しくは穴のパターンを伴う任意の他の光学的データ記憶媒体、RAM、PROM、及びEPROM、FLASH-EPROM、NVRAM、任意の他のメモリチップ又はカートリッジを含む。
【００３９】
[0053]記憶媒体は、送信媒体とは区別されるものの、当該送信媒体と連結して使用されうる。送信媒体は、記憶媒体間で情報を転送することに使用されてもよい。例えば、送信媒体は、バス１０２を備える有線を含む同軸ケーブル、銅線、及び光ファイバーを含む。送信媒体はまた、電波及び赤外データ通信中に生成されるものなどの、音波又は光波の形式をとることもできる。
【００４０】
[0054]媒体の様々な形式は、実行のためにプロセッサ１０４へ１つ以上の命令の１つ以上のシーケンスを運ぶことに含まれてもよい。例えば、命令は、リモートコンピュータの磁性ディスク又は半導体ドライバ上でまず実行されうる。リモートコンピュータは、その動的メモリへ命令をロードし、モデムを用いて電話線を介して命令を送信することができる。コンピューティングデバイス１００のローカルなモデムは、電話回線でデータを受信し、データを赤外線信号に変換するための赤外線送信機を用いることができる。赤外線検出機は赤外線信号で運搬されたデータを受信することができ、適切な回路がそのデータをバス１０２に乗せる。バス１０２は、プロセッサ１０４が命令を読み出して実行するメインメモリ１０６にデータを運搬する。メインメモリ１００６によって受信される命令は、プロセッサ１０４によって実行される前又は実行された後の何れかにストレージデバイス１１０に選択的に格納されうる。
【００４１】
[0055]コンピューティングデバイス１００はまた、バス１０２へ結合される通信インタフェース１１８を含む。通信インタフェース１１８は、ローカルネットワーク１２２（例えば、イーサネットネットワーク、無線ローカルエリアネットワーク、セルラー電話ネットワーク、Ｂｌｕｅｔｏｏｔｈ無線ネットワーク、又は同様のもの）へ接続された、有線又は無線のネットワークリンク１２０へ結合する２つの方法のデータ通信を提供する。通信インタフェース１１８は、種々のタイプの情報を表すデジタルデータストリームを伝達する電気信号、電磁信号、又は光信号を送受信する。例えば、通信インタフェース１１８は、有線のネットワークインタフェースカード、一体化された無線アンテナを有する無線ネットワークインタフェースカード、又はモデム（例えば、ＩＳＤＮ、ＤＳＬ、又はケーブルモデム）であってもよい。
【００４２】
[0056]ネットワークリンク１２０は、通常、１以上のネットワークを通じて、他のデータデバイスへのデータ通信を提供する。例えば、ネットワークリンク１２０は、ホストコンピュータ１２４への、又は、インターネットサービスプロバイダ（ＩＳＰ）１２６によって操作されるデータ機器へのローカルネットワーク１２２を通じた接続を提供してもよい。ＩＳＰ126は順に、”Ｉｎｔｅｒｎｅｔ”１２８として通常参照されるワールド・ワイド・パケットデータ通信ネットワークを通じてデータ通信サービスを提供する。ローカルネットワーク１２２及びＩｎｔｅｒｎｅｔ１２８は、デジタルデータストリームを伝達する電気信号、磁性信号、又は光信号を使用する。コンピューティングデバイス１００への及びコンピューティングデバイス１００からのデジタルデータを伝達する、種々のネットワークを通じた信号、及び、ネットワークリンク１２０上の、及び通信インタフェース１１８を通じた信号は、送信媒体の例示の形式である。
【００４３】
[0057]コンピューティングデバイス１００は、ローカルネットワーク１２２、インターネット１２８、ＩＳＰ１２６、ネットワークリンク１２０、及び通信インタフェース１１８を通じて、プログラムコードを含む、メッセージを送信し、データを受信することができる。インターネットの一例において、サーバコンピュータ１３０は、インターネット１２８、ＩＳＰ１２６、ローカルエリアネットワーク１２２、及び通信インタフェース１１８を通じて、アプリケーションプログラムに対して要求されるコードを送信するかもしれない。
【００４４】
[0058]受信コードは、受信した際にプロセッサ１０４によって実行されてもよく、及び、後の実行のためにストレージデバイス１１０又は他の不揮発性のストレージに格納されてもよく、或いは、そのいずれもが行われてもよい。
【００４５】
＜基本的なソフトウェアシステム＞
[0059]次に、図2を参照して、本発明のいくつかの実施形態に従って、コンピューティングデバイス１００の動作を制御するための基本的なソフトウェアシステム２００のブロック図について説明する。図示するように、コンピュータソフトウェアシステム２００は、コンピューティングデバイス１００の動作を方向付けるために提供される。システムメモリ（ＲＡＭ）106及び固定ストレージ（例えば、ハードディスク）110に格納されるソフトウェアシステム２００はカーネル又はオペレーティングシステム（ＯＳ）210を含む。ＯＳ２１０は、プロセス、メモリ配置、ファイル入力及び出力（Ｉ／Ｏ）、及びデバイスＩ／Ｏの実行を管理することを含む、コンピュータ動作のローレベルの態様を管理する。１以上のアプリケーションプログラム２０２（例えば、２０２Ａ、２０２Ｂ、２０２Ｃ・・・２０２Ｎ）は、システム２００による実行のために”ロードされ”うる（例えば、固定ストレージ１１０からメモリ１０６へ転送される）。いくつかの例において、アプリケーションプログラム２０２又はデバイス１００上での使用を意図した他のソフトウェアはまた、ダウンロード可能で、コンピュータで実行可能な命令のトークンのセットとして、例えば、インターネット上の記憶場所から（例えば、ウェブサーバから）ダウンロード及びインストールするために格納されうる。
【００４６】
[0060]ソフトウェアシステム２００は、グラフィカルな（例えば、”ポイント・アンド・クリック”又は”タッチジェスチャ”）形式で、ユーザコマンド及びデータを受信するためのグラフィカルユーザインタフェース（ＧＵＩ）２１５を含んでもよい。これらの入力は順に、オペレーティングシステム210及びアプリケーションプログラム２０２の少なくとも１つからの命令に従ってシステム２００によって作動される。ＧＵＩ215はまた、ユーザが追加の入力を供給したり、又は、セッションを終了させたりする（例えば、ログオフする）とすぐに、ＯＳ２１０及びアプリケーションプログラム２０２からの動作結果を表示するように務める。
【００４７】
[0061]ＯＳ２１０は、コンピューティング１００のベアハードウェア（例えば、プロセッサ１０４）上で直接的に実行することができる。代替的に、ハイパーバイザ又は仮想マシンモニタ（ＶＭＭ）２３０は、ベアハードウェア及びＯＳ２１０の間に割り込んで設けられてもよい。この構成において、ＶＭＭ２３０はコンピューティングデバイス１００のＯＳ２１０及びベアハードウェアの間のソフトウェア”クッション”又は仮想レイヤとして作動する。
【００４８】
[0062]ＶＭＭ２３０が存在すれば、仮想マシンインスタンス（例えばゲストマシン）を作成して実行する。各ゲストマシンは、ＯＳ２１０などの”ゲスト”オペレーティングシステムと、ゲストオペレーティングシステム上で実行するように設計された、アプリケーションプログラム２０２などの１以上のアプリケーションプログラムを含む。ＶＭＭ２３０は、仮想オペレーティングプラットフォームを有するゲストオペレーティングシステムを提示し、ゲストオペレーティングシステムの実行を管理する。いくつかの例において、ＶＭＭ２３０は、コンピューティングデバイス１００のベアハードウェア上で直接実行されているかのように、ゲストオペレーティングシステムを実行することを許容してもよい。これらの例において、ベアハードウェア上で直接的に実行するように構成されたゲストオペレーティングシステムの同一のバージョンはまた、修正又は再構成なしにＶＭＭ２３０上で実行されうる。言い換えれば、ＶＭＭ２３０は、いくつかの例において、ゲストオペレーティングシステムへ完全なハードウェアと、ＣＰＵ仮想化を提供してもよい。他の例において、ゲストオペレーティングシステムは、効率的にＶＭＭ２３０上で実行されるように特別に設計されるか、又は、構成されてもよい。それらの例において、ゲストオペレーティングシステムは、仮想マシンモニタ上で実行する”ａｗａｒｅ”であってもよい。言い換えれば、ＶＭＭ２３０は、いくつかの例において、ゲストオペレーティングシステムへ準仮想化を提供することができる。
【００４９】
[0063]上述のコンピュータハードウェア及びソフトウェアは、本開示の技術を実施するために採用されうる基本的な下層のコンピュータコンポーネントを示す目的で提示される。しかしながら、本開示の技術は、任意の特定のコンピューティング環境又はコンピューティングデバイス構成に限定されない。代わりに、本開示の技術は、システムアーキテクチャ、又は、ここで詳細に提示した本開示の技術をサポートすることが可能な処理環境の任意のタイプで実装されてもよい。
【００５０】
＜クライアント／サーバ  マルチユーザ検索システムコンポーネント＞
[0064]次に、図3を参照し、本発明のいくつかの実施形態に従って、クライアント／サーバシステム３００の基本ブロック図について説明する。クライアント／サーバシステム３００は、１以上のサーバ３２０を含む（ここではまとめて”マルチユーザ検索システム３２０”と称する。）。また、クライアント／サーバシステム３００は、ネットワーク３３０を介して１以上のサーバ３２５（ここではまとめて”サービングシステム３２５”と称する。）へ接続された１以上のクライアント３１０を含む。具体的には、クライアント３１０は、１以上のサーバ３２６（ここではまとめて”検索フロントエンド３２６”と称する。）へ接続された１以上のエンドユーザコンピューティングデバイス３１１を備える。例示の実施形態において、エンドユーザコンピューティングデバイス３１１は、MICROSOFT  WINDOWS（例えば、XP、VISTA、７、８等）、MAC  OS  X、LINUX（例えば、UBUNTU、FEDORA等）、IOS、ANDROID、BLACKBERRY  OS、及び同等のものなどの従来のオペレーティングシステムを実行する上述のコンピューティングデバイス１００などの複数のエンドユーザパーソナルコンピューティングデバイスをそれ自身に備えてもよい。
【００５１】
[0065]例示の実施形態において前述したDROPBOXコンテンツ管理サービスの一部である、サービングシステム３２５及び１つ以上の他のサーバ３２１（ここでは、まとめて”ビルドシステム３２１”と称する。）は、一般的には、UNIX、LINUX及び同様のものなどのサーバオペレーティングシステムの下で実行する、１以上の独立したプロセス（例えば、独立した複数のクライアント）として動作する。ビルドシステム３２１は、トークン格納部３２４、インデクサーサーバ３２３（又は、単に”インデクサー３２３”）、及びトークナイザ３２２（又は、単に”トークナイザ３２２”）を含む。検索フロントエンド３２６に加えて、サービングシステム３２５はまた、クエリプロセッサ３２７及びドキュメントインデックス３２８を含む。
【００５２】
[0066]ビルドシステム３２１のサーバ及びサービングシステム３２５のサーバを含むマルチユーザ検索システム３２０のサーバは、サーバコンピュータ（例えば、図１のコンピューティングデバイス１００）として、又は手近な特定の実施形態の要求に依存した仮想マシンインスタンスとして実現されてもよい。マルチユーザ検索システム３２０のサーバが仮想マシンインスタンスとして実現される場合には、”仮想”サーバをホストする（実行する）下層のサーバコンピュータであってもよい。しかしながら、仮想サーバとサーバコンピュータとの間において一対一で対応する必要性はない。例えば、サーバコンピュータは複数の仮想サーバをホストすることができる。
【００５３】
[0067]本明細書及び添付の特許請求の範囲で使用される場合、”サーバ（server）”の単数形は、別段の明確な示唆がない限り、複数形を含むことも意図している。例えば、マルチユーザ検索システム３２０の”サーバ”は、実際には、手近な特定の実施形態の要件に従った、平衡性、フェイルオーバー、冗長性、高可用性、及び他の目的の少なくとも１つのための、互いのミラー又は複製である複数のサーバによって実現されてもよい。
【００５４】
[0068]動作中において、クライアント３１０は、検索クエリ３３２を検索フロントエンド３２６へ送信し、検索フロントエンド３２６からクエリ回答３３４を受信する。クエリ３３２は、ネットワーク要求で検索フロントエンド３２６において受信されてもよく、当該回答３３４はネットワーク要求へのネットワーク応答で検索フロントエンド３２６から送信されてもよい。ネットワーク要求及びネットワーク応答は、ネットワークデータパケットでネットワーク３３０上で受信／送信されてもよい。本発明のいくつかの実施形態において、ネットワークデータパケットは、インターネットプロトコル（ＩＰ）に従ってフォーマットされる。ネットワーク要求及びネットワーク応答はまた、アプリケーションレイヤのネットワークプロトコルに従って受信／送信されてもよい。いくつかの実施形態において、アプリケーションレイヤのネットワークプロトコルは、ハイパーテキスト転送プロトコル（ＨＴＴＰ）又はセキュアハイパーテキスト転送プロトコル（ＨＴＴＰＳ）である。例えば、クエリ３３２は、１以上のＨＴＴＰ又はＨＴＴＰＳ要求で受信されてもよく、回答３３４は１以上のＨＴＴＰ又はＨＴＴＰ応答で送信されてもよい。
【００５５】
[0069]ネットワーク３３０は、例えば、セルラー電話ネットワーク、ローカルエリアネットワーク（ＬＡＮ）、ワイドエリアネットワーク（WＡN）、インターネット及び同様のものなどの多くの従来の有線又は無線ネットワークシステムを含んでもよい。サービングシステム３２５、ビルドシステム３２１、及びそれらのサーバはまた、１以上のＩＰネットワーク及び他の適切な種別のデータ通信ネットワークによって相互に接続されてもよく、ＨＴＴＰ、ＨＴＴＰＳ、及び他の適切なアプリケーションレイヤプロトコルの少なくとも１つを用いて互いに通信してもよい。
【００５６】
[0070]検索クエリ３３２は検索式を含んでもよい。検索式の構文は、１以上のブール演算子（例えば、AND、OR、NOTなど）によって共に関連付けが可能な、１以上の検索トークンのシーケンスを含んでもよい。トークンは、１以上の文字の文字列として定義されてもよい。トークンの文字は、従来の文字符号化手法（例えば、ASCII、UTF-８、及び同等のもの）に従って符号化されてもよい。
【００５７】
[0071]クエリのトークンは、検索クエリ３３２に現れるトークンとして定義されてもよい。例えば、単一の結合クエリ３３２が［baguette fromage］（囲い括弧（enclosing brackets）なしで）の場合を検討する。当該クエリ３３２を満足するドキュメント３４０は、トークン“baguette”と、トークン“fromage”との両方を含んでもよく、ドキュメント３４０の中で互いが隣接する必要はなく、かつドキュメント３４０の中でトークン“fromage”の前にトークン“baguette” が現れる必要性はない。しかしながら、トークン“baguette”と、トークン“fromage”とを互いに近くに含むか関連付けられ、トークン“fromage”の前にトークン“baguette”を含むか関連付けられるドキュメント３４０は、クエリ３３２を満足する他のドキュメント３４０よりも関連があるものとみなされてもよい。
【００５８】
[0072]検索フロントエンド３２６からクライアント（例えば、エンドユーザコンピューティングデバイス３１１Ａ）へ返される検索クエリ３３２に対するクエリ回答３３４は、関連性で順序づけられた検索回答の概要のリストを含んでもよい。それぞれのそのような概要は、検索クエリ３３２を満足するドキュメントインデックス３２８においてクエリプロセッサ３２７によって識別されたドキュメント３４０に対応してもよい。検索回答の概要は、例えば、対応するドキュメントの識別子（例えば、名称、タイトルなど）、対応するドキュメントの短い説明（例えば、概要、要約、抽出、抜粋など）、ダウンロード、閲覧又は対応するドキュメントへのいくつかの他のユーザアクションを行うためのインタラクティブなハイパーリンク（例えば、ユニフォーム・リソース・ロケータ（URL））、及び、対応するドキュメント３４０について可能な他の有用な情報（例えば、対応するドキュメントのサムネイル画像）を含んでもよい。概要のリストは、エンドユーザのコンピューティングデバイスのユーザへ、エンドユーザのコンピューティングデバイス上で実行するウェブブラウザアプリケーションのウェブページ上で、又は、例えばエンドユーザコンピューティングデバイス上で実行するアプリケーション（例えば、モバイルアプリケーション）のその他のグラフィカルユーザインタフェースで、提示されてもよい。
【００５９】
[0073]検索フロントエンド３２６で受信される検索クエリ３３２は、クエリプロセッサ３２７によって処理されてもよい。クエリプロセッサ３２７は、検索クエリ３３２を満足するドキュメントを特定するためにドキュメントインデックス３２８を調べてもよい。検索クエリ３３２を満足するクエリプロセッサ３２７によって特定されるドキュメントへの参照（例えば、ハイパーリンク）は回答３３４で返されてもよい。以下では、クエリ３３２を処理するためのクエリプロセッサ３２７によって実行される本発明のいくつかの実施形態における技術をより詳細に説明する。
【００６０】
[0074]いくつかのケースにおいて、検索クエリ３３２は”コンプリーション（completion）”検索クエリ３３２である。コンプリーション検索クエリ３３２は、コンプリートしていないトークンを含む一連の１以上のクエリトークンを含む検索クエリ３３２として定義されうる。例えば、コンプリーション検索クエリ３３２は、エンドユーザコンピューティングデバイスのユーザがコンプリーション検索クエリ３３２のクエリトークンの１つを入力する（例えば、タイピングによって）過程にある（処理中の）場合に、エンドユーザコンピューティングデバイス（例えば、３１１Ａ）から検索フロントエンド３２６へ提示されてもよい。この場合、コンプリーションクエリ３３２への回答３３４は、クエリプロセッサ３２７がコンプリーションクエリ３３２に基づいてドキュメントインデックス３２８を定義するコンプリーション検索クエリ３３２に対する可能なコンプリーション要素のリストを含んでもよい。
【００６１】
[0075]コンプリートされるコンプリーションクエリ３３２のクエリトークンは、”コンプリートトークン（complete tokens）”と称する。コンプリートされないコンプリーションクエリ３３２のクエリトークンは、”コンプリーショントークン（completion tokens）”と称する。このように、コンプリーションクエリはまた、コンプリーショントークンを含むクエリ３３２として定義されてもよい。
【００６２】
[0076]コンプリーションクエリ３３２は、単に単一の文字又は一文字より多くの文字を含んでもよい。例えば、コンプリーションクエリ３３２［ｐ］（囲い括弧なしで）では、コンプリートトークンはなく、トークン”ｐ”はコンプリーショントークンとなりうる。コンプリーションクエリ３３２は、代わりに、１以上のコンプリートトークンを含んでもよい。例えば、コンプリーションクエリ３３２［ｐｒｉｖａｔｅ  ｓｅ］（囲い括弧なしで）では、トークン”ｐｒｉｖａｔｅ”がコンプリートトークンであり、トークン”ｓｅ”はコンプリーショントークンとなりうる。
【００６３】
[0077]典型的には、コンプリーションクエリ３３２の一連のトークンにおける最後のトークン（又は、列の中にただ一つのトークンがある場合には唯一のトークン）はコンプリーショントークンである。大抵の場合、これは、ユーザが列に現れるのと同じ順序でコンプリーションクエリ３３２のトークンを入力するためである。しかしながら、コンプリーションクエリ３３２の最後のトークンよりも前のトークンがコンプリーショントークンであってもよい。例えば、ユーザは前回入力されたトークンを編集するために彼らのエンドユーザコンピューティングデバイス（例えば、３１１Ａ）において入力カーソルを動かしてもよい。例えば、ユーザは、最初にクエリ３３２［solved two problems］（囲い括弧なしで）を入力してもよい。その後、ユーザは、コンプリーションクエリ［solved th probrems］を生成するために、トークン”ｔｗｏ”を”ｔｈ”で置き換えるように入力カーソルを動かしてもよい。本例示のコンプリーションクエリ３３２において、第１のトークン”ｓｏｌｖｅｄ”と最後のトークン”ｐｒｏｂｌｅｍｓ”とは、コンプリートトークンであってもよく、第２のトークン”ｔｈ”はコンプリーショントークンであってもよい。
【００６４】
[0078]本発明のいくつかの実施形態において、クエリ３３２は、クエリ３３２を含むネットワーク要求において、コンプリーションクエリ３３２として指定される。例えば、ネットワーク要求は、クエリ３３２のクエリトークンがコンプリーショントークンであることを示してもよい。コンプリーショントークンの指標は、ユーザのエンドユーザコンピューティングデバイス（例えば、３１１Ａ）において実行するソフトウェアによって作成されてもよい。例えば、ソフトウェアは、ユーザがユーザのエンドユーザコンピューティングデバイスで提示される検索ユーザインタフェースへ（例えば、物理的なキーボード、又はソフトウェアキーボードで）クエリ３３２のトークンの文字を入力している際に、フロントエンド３２６を検索するクエリ３３２を含むネットワーク要求を送信してもよい。そうすることで、ソフトウェアは、ユーザが入力しているトークンがコンプリーショントークンであることをネットワーク要求（例えば、メタデータ）においてフラグで示すか、印を付けるか、特定するか、さもなければ、示してもよい。本発明のいくつかの実施形態において、ユーザのエンドユーザコンピューティングデバイスで実行するソフトウェアはJAVASCRIPTソフトウェア又は他のウェブブラウザクライアント側のスクリプト言語ソフトウェアであり、検索ユーザインタフェースはユーザのウェブブラウザのウィンドウに表示されるウェブページ上に提示されてもよい。本発明のいくつかの実施形態において、ユーザのエンドユーザコンピューティングデバイスで実行するソフトウェアは、モバイルアプリケーション、又は、ユーザのエンドユーザコンピューティングデバイスにおいて検索ユーザインタフェースを駆動する他の専用のソフトウェアアプリケーションである。
【００６５】
[0079]コンプリーション検索クエリ３３２に対する可能性のあるコンプリーションは、ドキュメントインデックス３２８によってインデックスが付与された少なくとも１つのドキュメント３４０によって満足され、かつ、コンプリーションクエリ３３２をコンプリートする検索クエリ３３２として定義されてもよい。例えば、ドキュメントインデックス３２８によってインデックスが付与された少なくとも１つのドキュメント３４０によって満足される検索クエリ３３２［solved two problems］（囲い括弧なし）は、コンプリーション検索クエリ３３２［solved two prob］（囲い括弧なしで）に対する可能性のあるコンプリーションであってもよい。コンプリーションクエリ３３２への可能なコンプリーションのリストは、コンプリーションクエリ３３２を満足するドキュメント３４０の検索回答の概要のリストへの追加として、又は、その代わりに、回答３３４で提示されてもよい。以下では、コンプリーションクエリ３３２を処理するためのクエリプロセッサ３２７によって採用される本発明のいくつかの実施形態における技術をより詳細に説明する。
【００６６】
[0080]コンプリーションクエリ３３２でないクエリ３３２は、時には、コンプリーションクエリ３３２から当該クエリ３３２を区別するために、”非コンプリーション（non-completion）”クエリ３３２として参照されてもよい。非コンプリーションクエリ３３２はまた、コンプリートトークンのみを含み、任意のコンプリーショントークンを含まないクエリ３３２として定義されてもよい。通常、クエリ３３２と称する場合、当該参照は、ここでは前述した”コンプリーション”又は”非コンプリーション”の限定詞なしで、”クエリ３３２”又は”検索クエリ３３２”として参照されてもよい。文中で明確に言及しない限り、クエリ３３２に関連するここでの説明は、通常、コンプリーションクエリ３３２及び非コンプリーションクエリ３３２の両方に関連する。
【００６７】
[0081]ドキュメント３４０は、テキストコンテンツを含むデジタル情報（例えば、文字データ）、及びテキストコンテンツに関連付けられるデジタル情報（例えば、テキストメタデータ）の少なくとも１つのデジタル情報の収集物として定義されてもよい。いくつかの例示では、ワード処理ドキュメント３４０は、大抵の場合、テキストコンテキスト（例えば、ドキュメントの作成者による単語及び文章）を含み、スプレッドシートのドキュメント３４０は、単語及び数字の形式でのテキストコンテキストを含んでもよく、デジタル画像ドキュメント３４０（例えば、デジタル写真）は、そのヘッダ（例えば、交換可能な画像ファイル形式（Ｅｘｉｆ））にテキストコンテンツを含んでもよい。追加的に又は代替的に、デジタル画像ドキュメント３４０は、画像コンテンツのテキストメタデータのタグ又は他のテキスト記述の形式でテキストコンテンツと関連付けられてもよい。それらは、単にドキュメントの可能ないくつかの例示であり、他の種別のドキュメントも本発明の範囲内にある。
【００６８】
[0082]いくつかの例で、ドキュメント３４０は、ファイルタイプを有するファイルに対応する。ドキュメントとなりうるいくつかのファイルタイプは、限定はしないが、画像ファイル（例えば、．ｊｐｇ、．ｔｉｆｆ、．ｇｉｆｆ）、音楽ファイル（例えば、．ｍｐ３、．ａｉｆｆ、．ｍ４ａ、．ｗａｖ）、動画ファイル（例えば、．ｍｏｖ、．ｍｐ４、．ｍ４ｖ）、ワード処理ファイル（例えば、．ｄｏｃ、．ｄｏｃｘ、．ｐａｇｅｓ）、プレゼンテーションファイル（例えば、．ｐｐｔ、．ｐｐｔｘ、．ｋｅｙ）、スプレッドシートファイル（例えば、．ｘｌｓ、．ｘｌｓｘ、．ｎｕｍｂｅｒｓ）、ウェブページファイル（例えば、．ｈｔｍ、．ｈｔｍｌ）、テキストファイル（例えば、．ｔｘｔ）、及び、テキストを含む及び／又はテキストに関連する任意の他のタイプのファイルを含む。
【００６９】
[0083]ドキュメント３４０は、ドキュメントの内容を記述するテキスト内容に関連付けられうる。当該関連付けられたテキスト内容は、ドキュメントについての”テキストメタデータ”として時には参照される。例えば、ドキュメント３４０のファイル名は、ドキュメント３４０についてのテキストメタデータでありうる。他の例として、デジタル画像ドキュメントのテキストメタデータは、画像のコンピュータ解析（例えば、光学文字認識（ＯＣＲ）又は顔認識アルゴリズム等）によって作製されてもよい。ドキュメント３４０についてのテキストメタデータの他の形式は、例えば、ドキュメント３４０を参照する（例えば、ハイパーリンクによって）、ドキュメント３４０について言及する（例えば、ソーシャルネットワークへのポストにおいて）、又は、ドキュメント３４０を議論する（例えば、ブログポスト及び／又はユーザコメントのポストにおいて）、ウェブページから取得したドキュメント３４０についてのテキスト内容を含みうる。本説明の目的で、ドキュメント３４０についてのテキストメタデータは、ドキュメント３４０のテキスト内容の一部であり、かつ、ドキュメント３４０のテキスト内容に含まれる（現れる）ように考慮されてもよい。
【００７０】
[0084]ドキュメント３４０はまた、現在のバージョンとみなされるものを含む複数のバージョンを有してもよい。例えば、ユーザは、ワード処理プログラムを用いてワード処理ドキュメント３４０の第１のバージョンを作成し保存してもよい。その後、ユーザは、ドキュメント３４０の第１のバージョンを修正してもよく、当該修正を含むドキュメント３４０の第２のバージョンを保存してもよい。代替的には、ドキュメント３４０はまた、現在のバージョンとみなされる時間でのただ一つのバージョンを有してもよい。
【００７１】
[0085]ドキュメントインデックス３２８は、１以上の辞書及び登録（posting）のペアを含んでもよい。辞書のペアは、インデックストークンを格納してもよく、また、各インデックストークンについての登録のペアにおける登録リストへのポインタを含んでもよい。例えば、ポインタは、登録リストが格納される、揮発性又は不揮発性メモリの位置のアドレスであってもよい。
【００７２】
[0086]インデックストークンは、ドキュメント３４０がドキュメントインデックス３２８においてインデックスを付与されるトークンとして定義されてもよい。インデックストークンに加えて、辞書は、例えばトークンのドキュメントでの頻度などのインデックストークンについてのトークン属性を格納してもよい。インデックストークンについてのトークン属性は、クエリ処理効率及び検索結果ランキングを改善するためにクエリプロセッサ３２７によって使用されてもよい。
【００７３】
[0087]インデックストークンについての登録リストは、トークンが現れる１以上のドキュメント３４０の１以上のドキュメント識別子のリストを格納してもよく、また、例えばドキュメント３４０でのトークンの頻度、又はドキュメント３４０内のトークンの位置などの登録リストに特定されたドキュメント３４０についてのドキュメントトークン属性を格納してもよい。登録リストのドキュメント３４０についてのドキュメントトークン属性はまた、クエリ処理効率及び検索結果ランキングを改善するためにクエリプロセッサ３２７によって使用されてもよい。
【００７４】
[0088]クエリ３３２を処理する際に、クエリプロセッサ３２７は、クエリ３３２のクエリトークンに基づいて、ドキュメントインデックス３２８の辞書内のインデックストークンを探してもよい。例えば、［solved two problems］（囲い括弧なしで）などのクエリ３３２について、クエリプロセッサ３２７は、辞書内のインデックストークン”solved”、”ｔｗｏ”、及び”problems”を探してもよい。クエリプロセッサ３２７は、辞書内で探されたインデックストークンに関連付けられるポインタを用いて探されたインデックストークンについての登録リストを取り出してもよい。例えば、クエリプロセッサ３２７は、インデックストークン”solved”、”ｔｗｏ”、及び”problems”についての辞書の登録リストに関連付けられるドキュメントインデックス３２８の登録から取り出してもよい（例えば、ＲＡＭへロードしてもよい）。
【００７５】
[0089]クエリプロセッサ３２７は、クエリ３３２を満足するドキュメント３４０を特定するためにマージアルゴリズムを用いて取り出した登録リストをマージしてもよい。例えば、インデックストークン”ｓｏｌｖｅｄ”について取り出された登録リストがドキュメントＤ２及びＤ３を特定し、インデックストークン”ｔｗｏ”について取り出された登録リストがドキュメントＤ２を特定し、インデックストークン”problems”について取り出された登録リストがドキュメントＤ２及びD3を特定することを想定する。従って、クエリプロセッサ３２７は、探し出したインデックストークンの全てを含むドキュメントＤ２を特定するために、マージアルゴリズムに従って、それら３つの登録リストをマージしてもよい。種々の異なるマージアルゴリズムは、登録リストをマージするために使用されてもよく、本発明は任意の特定のマージアルゴリズムに限定されない。例えば、マージアルゴリズムは、複数の登録リストのそれぞれを通じて複数のポインタを交互に進めることによって複数のポインティングリストを組み合わせてもよい。
【００７６】
[0090]クエリプロセッサ３２７は、ただ単一の結合クエリ３３２を処理することに限定されず、クエリプロセッサ３２７は、より複合的なクエリ３３２を処理してもよい。例えば、クエリプロセッサ３２７は、以下で例示のタイプのクエリ３３２、クエリＡ：［(two or three )NOT problems］、クエリＢ：［two three problems］、クエリC：［(two three) problems］、及びクエリＤ［(two OR three) (problems OR solutions)］を処理してもよい。囲い括弧［］内の前述の例示のクエリ３３２のそれぞれにおいて、囲い括弧［］はクエリの一部ではない。クエリＡはクエリ３３２［(two or three) AND NOT problems］と同等であり、クエリBはブールクエリ３３２［two AND three AND problems］と同等であり、クエリＣはブールクエリ３３２[(two AND three) AND problems]と同等であり、クエリDはブールクエリ３３２[(two OR three) AND (problems OR solutions)]と同等である。前述の例示のクエリ３３２において、AND OR NOT ()はブール演算子である。
【００７７】
[0091]いくつかの実施形態において、ドキュメントインデックス３２８は、インデックスサーバのそれぞれがドキュメントインデックス３２８の部分（例えば、共有部分）を格納するサービングシステム３２５の複数のインデックスサーバに渡って水平分割される（例えば、共有される）。種々の異なる技術が複数のインデックスサーバに渡ってインデックス３２８を水平分割する（共有する）ために使用されてもよい。本発明のいくつかの実施形態において、ドキュメントインデックス３２８は、”ドキュメンネームスペース”によって共有される。
【００７８】
[0092]ドキュメントネームスペースは、共有アクセス制御の下で、１以上のドキュメント３４０の収集物として定義されてもよい。共有アクセス制御は、ユーザ及びユーザグループの少なくとも１つのいずれがドキュメント３４０へのアクセスを有するかと、ユーザ及びユーザグループの少なくとも１つがドキュメントネームスペースに属するドキュメント３４０上にどんなアクセス（例えば、読み出しアクセス、書込みアクセス、共有アクセス、プレビューアクセス、ダウンロードアクセスなど）を有するかと、を特定する及び／又は示す、明示的な許可及び暗黙的な許可の少なくとも１つに基づくことができる。明示的な許可は、ユーザ及びユーザグループの少なくとも１つのいずれがドキュメント３４０へのアクセスを有するかと、ユーザ及びユーザグループの少なくとも１つがドキュメントネームスペースのドキュメント３４０上にどんなアクセスを有するかと、を特定する及び／又は示す、例えばドキュメントネームスペース（又は、それらの識別子）に関連付けられる１以上のアクセス制御リスト（ＡＣＬ）及び他のデータの少なくとも１つの形式で行ってもよい。暗黙的な許可の一例は、ユーザが当該ユーザのユーザアカウント（又は、それらの識別子）に関連付けられるドキュメントネームスペースの全てのドキュメント３４０へのアクセスを有するものである。
【００７９】
[0093]例示の実施形態において、ドキュメントネームスペースは、例えば、前述したDROPBOXコンテンツ管理サービスなどのクラウドデータストレージサービスで保持されるユーザのアカウントに関連付けられるドキュメント３４０を含む。アカウントに対する認証が成功すると（例えば、有効なユーザ名／パスワード）、ユーザは、ユーザのアカウントと関連付けられるドキュメントネームスペースにおいてドキュメント３４０へのアクセスを暗黙的に有する。
【００８０】
[0094]例示の実施形態において、ドキュメントネームスペースは、例えば前述したDROPBOXコンテンツ管理サービスなどのオンラインデータストレージサービスで保持される複数のユーザアカウントの中で共有される１以上のドキュメント３４０の収集物に属しているドキュメント３４０を含む。いくつかの例で、ドキュメントの収集物は、”共有フォルダ”と称してもよい。ドキュメントの収集物が共有されるアカウントに対する認証が成功すると、ユーザは、共有されるドキュメントネームスペースにおけるドキュメントへのアクセスを有する。
【００８１】
[0095]ドキュメントインデックス３２８がドキュメントネームスペースによって共有される本発明のいくつかの実施形態によれば、サービングシステム３２５の複数のインデックスサーバのそれぞれは、１以上のドキュメントネームスペースに属しているドキュメント３４０にインデックスを付与する。本発明のいくつかの実施形態において、ドキュメントネームスペースの識別子はドキュメントネームスペース内のドキュメント３４０にインデックスを付与するインデックスサーバを決定するためにシャードキー（shard key）として使用される。限定しない例示の実施形態において、ドキュメントインデックス３２８は、４億（４００，０００，０００）を超えるドキュメントネームスペース内のドキュメントにインデックスを付与する。
【００８２】
[0096]ドキュメント３４０は、ビルドシステム３２１によって処理することが可能に提供されるか若しくは可能にされる任意のドキュメント３４０、又は、ドキュメントインデックス３２８でインデックスが付与される任意のドキュメント３４０を含んでもよい。ビルドシステム３２１は、ドキュメント３４０からドキュメントインデックス３２８のインデックスデータベースファイル３５１を構築する。ビルドシステム３２１はまた、ドキュメント３４０からドキュメントインデックス３２８へのインデックス変更情報３５２を生成する。
【００８３】
[0097]インデックスデータベースファイル３５１は、１以上のドキュメント３４０に共にインデックスを付与する辞書及び登録のペアを含んでもよい。より一般的には、インデックスデータベースファイル３５１内のデータは、キーが辞書のインデックストークンに対応し、かつ、その値が登録の登録リストに対応する、キー−値ペアの集合（例えば、連想配列）として構成されてもよい。本発明のいくつかの実施形態において、インデックスデータベースファイル３５１は、１つのドキュメントネームスペースにおいてドキュメント３４０にインデックスを付与する。本発明のいくつかの実施形態において、ドキュメントのインデックス３２８のインデックスデータベースファイル３５１の数を低減するために、インデックスデータベースファイル３５１は、複数のドキュメントネームスペースにおいてドキュメント３４０にインデックスを付与する。インデックスデータベースファイル３５１によってインデックスが付与された複数のドキュメントネームスペースは、時には、ここでドキュメントネームスペースの”ドキュメントネームスペースのグループ”として参照される。
【００８４】
[0098]ビルドシステム３２１によるドキュメントインデックス３２８のインデックスデータベースファイル３５１を構築することは、ドキュメント３４０をトークン化することによって複数トークンのセットを生成し、トークン格納部３２４に生成した複数トークンのセットを格納するトークナイザ３２２に関与してもよい。その後、インデクサー３２３は、生成した複数トークンのセットに基づいてインデックスデータベースファイル３５１を生成してもよい。インデクサー３２３は、生成したインデックスデータベースファイル３５１を、ドキュメントインデックス３２８の一部として、サービングシステム３２５のインデックスサーバへの格納のために、サービングシステム３２５へ提供する。ドキュメント３４０からドキュメントインデックス３２８のインデックスデータベースファイル３５１を構築するためのビルドシステム３２１によって実現される本発明のいくつかの実施形態における技術はここに記述されるようなものであってもよい。
【００８５】
[0099]ビルドシステム３２１によってドキュメント３４０からドキュメントインデックス３２８へのインデックス変更情報３５２を生成することは、最近作成された又は最近修正されたドキュメント３４０からの複数トークンのセットを生成した後に、インデクサー３２３に通知するトークナイザ３２２に関与してもよい。例えば、ドキュメント３４０は、エンドユーザコンピューティングデバイス３１１のユーザによって最近作成された又は最近修正されたものであってもよい。最近作成したドキュメント３４０の通知、或いは、修正ドキュメント３４０の通知が行われると、インデクサー３２３は、トークン格納部３２４に当該ドキュメントについて格納された１以上の複数トークンのセットに基づいて、ドキュメントについてのインデックス変更情報３５２を生成する。例えば、ドキュメントが修正される場合などのいくつかの例において、生成したインデックス変更情報３５２は、修正ドキュメントについて生成した複数トークンのセットと、以前のバージョンのドキュメントについて生成した複数トークンのセットとの間の差分を反映する。生成したインデックス変更情報３５２は、その後ドキュメントインデックス３２８にそれを適用するサービングシステム３２５へ提供されてもよい。最近作成された及び最近修正されたドキュメント３４０からドキュメントインデックス３２８へのインデックス変更情報３５２を生成するためのビルドシステム３２１によって実現される本発明のいくつかの実施形態における技術はここに記述されるようなものであってもよい。
【００８６】
[0100]トークナイザ３２２は、ドキュメント３４０のテキスト内容をトークン化することによって複数トークンのセットを作製する。ドキュメントのテキスト内容をトークン化することは、ドキュメントの文字列を取得することを含んでもよい。種々の技術がドキュメントデータの形式に従って、ドキュメントの文字列を取得するトークナイザ３２２によって使用されてもよい。例えば、技術又は使用される当該技術は、ドキュメントの文字符号化手法（例えば、ASCII、Unicode、UTF-8、マイクロソフトWORD、ADOBE、PDFなど）に従ってドキュメントを復号することと、ドキュメントが圧縮されているかどうか（例えば、ZIP圧縮によって）に従ってドキュメントを解凍することとの少なくとも１つを含んでもよい。
【００８７】
[0101]ドキュメントの文字列が取得されるとすぐに、トークナイザ３２２は、同時にトークン上で言語プロセスを実行することが可能なように、文字列を、複数の小片、いわゆるトークンに分割する。言語プロセスは、例えば、所定の文字列（例えば、句読点）を無視することと、共通の単語（例えば、ストップワード）を除外することと、並びに、語幹解釈及び見出語解釈を行うこととの少なくとも１つを含んでもよい。言語プロセスはまた、付加記号、アクセント及び大文字化／大文字変換の少なくとも１つなどを取り除くことを含むトークンの正規化を含んでもよい。
【００８８】
[0102]トークナイザ３２２がドキュメントについての複数トークンのセットを生成した後に、トークナイザ３２２は、トークン格納部３２４に複数トークンのセットを格納する。例えばトークナイザ３２２がインデクサー３２３へ最近作成したドキュメント３４０を通知するか、或いは、インデクサー３２３へ最近修正されたドキュメント３４０を通知する場合などのいくつかの例において、トークナイザ３２２はまた、複数トークンのセットをインデクサー３２３へ提供してもよい。
【００８９】
[0103]トークン格納部３２４は、トークナイザ３２２によって複数のドキュメント３４０について生成された複数トークンのセットを格納する。例えば、所定バージョンのドキュメント３４０に関して、トークン格納部３２４は、当該ドキュメントバージョンについてトークナイザ３２２によって生成された複数トークンのセットを格納してもよい。
【００９０】
[0104]本発明のいくつかの実施形態において、トークン格納部３２４は、例えば、ＡPＡCHE  HBＡSEデータベースシステムなどの列指向型の分散データベースシステムを含む。しかしながら、データベースシステムの他のタイプが、それぞれにおける特定の実装の要件に従って、他の実施形態に使用されてもよい。例えば、独自の、関係型、又は、独立型のデータベースシステムが、オープンソース、列指向型又は分散型のものの代わりに使用されてもよい。
【００９１】
[0105]上記例示のクライアントサーバのマルチユーザ検索システム３２０を考慮すると、サービングシステム３２５及びクエリ３３２を処理し、個別の回答３３４をそれらへ返すために使用されるそれらのコンポーネントについて以下で詳細に説明する。
【００９２】
＜サービングシステム＞
[0106]次に、図4を参照して、本発明のいくつかの実施形態に従う、サービングシステム３２５のより詳細を示すブロック図について説明する。サービングシステム３２５は１つ以上のサーバ３２６（以下、まとめて”フロントエンドサーバ３２６として参照する”）と、１つ以上のサーバ４１０（以下、まとめて”アクセス制御サーバ４１０として参照する”）と、クエリプロセッサ３２７とを含む。
【００９３】
[0107]クエリプロセッサ３２７は、（１）ドキュメントインデックス３２８の格納と、ドキュメントインデックス３２８のインデックスシャード（index shard）（例えば３２８Ａ、３２８Ｂ、３２８Ｃ．．．３２８Ｎ）に対するクエリ３３２の処理とに対して責任をもつ１つ以上のサーバ４３０（まとめて”インデックスサーバ４３０”として参照される）と、（２）クエリ３３２と関連付けられたドキュメントネームスペース識別子に基づいて、フロントエンドサーバ３２６から適切なインデックスサーバ４３０へのクエリ３３２のルーティングと、インデックスサーバ４３０から返答される回答４１８を、その後フロントエンドサーバ３２６に、そして最後にエンドユーザコンピューティングデバイス３１１に返答される回答３３４に統合すること、に対する責任をもつ１つ以上のサーバ４３０（まとめて”ルーティングサーバ４２０”として参照される）、との２つのレベルのサーバにわたって分散される。
【００９４】
[0108]ドキュメントインデックス３２８の各インデックスシャード（例えば、３２８Ａ、３２８Ｂ、３２８Ｃ...３２８Ｎ）は、対応するインデックスサーバ（例えば、４３０Ａ、４３０Ｂ、４３０Ｃ．．．４３０Ｎ）において格納されうる。インデックスサーバ（４３０Ｂ）におけるインデックスシャード（例えば３２８Ｂ）は、当該インデックスシャードに割り当てられた１つ以上のドキュメントネームスペース内の、インデックスドキュメント３４０でありうる。
【００９５】
[0109]動作において、フロントエンドサーバ３２６Ａは、エンドユーザコンピューティングデバイス（例えば３１１Ａ）から検索クエリ３３２Ａを受信して、個別化された回答３３４Ａをエンドユーザコンピューティングデバイスに返答する。回答３３４Ａは、クエリ３３２Ａに関連するものとして回答３３４で特定されたドキュメント３４０が、ユーザがアクセスを認証されたドキュメントネームスペースに属すドキュメント３４０にのみ限定されうるという意味において個別化されうる。クエリ３３２Ａがコンプリーションクエリ（completion query）である場合、回答３３４Ａはまた、回答３３４に含まれるコンプリーションクエリにあり得るコンプリーション要素が、ユーザがアクセスを認証されたドキュメントネームスペースに属すインデックスドキュメント３４０のドキュメントインデックス３２８におけるインデックストークンのみから構成されうるという意味において個別化されうる。ユーザは、認証されて、回答３３４Ａの個別化を促進しうる。
【００９６】
[0110]例えば、クエリ３３２Ａは、認証されたユーザに対して確立された認証セッションのコンテキストにおいて、フロントエンドサーチ３２６Ａで受信されうる。例えば、認証されたユーザは、クエリ３３２Ａをフロントエンドサーバ３２６Ａに送信するエンドユーザコンピューティングデバイスのユーザでありうる。認証されたユーザは、フロントエンドサーバ３２６Ａがクエリ３３２Ａを受信する前に認証されうる。例えば、認証されたユーザは、認証クレデンシャル（例えばユーザ名／パスワードのペア）を含んだ、エンドユーザコンピューティングデバイスからの認証ネットワーク要求を受信したことに応答して認証されうる。認証ネットワーク要求を受信したことに応じて、当該ネットワーク要求内のパスワードが当該ユーザ名に対する既知のパスワードと比較されうる。パスワードが一致した場合には認証セッションが確立する。そうではなくパスワードが一致しない場合、認証セッションは確立しない。
【００９７】
[0111]ユーザ名／パスワードのペア以外の認証クレデンシャルがユーザを認証するために用いられうる。例えば、ある例では、ユーザはマルチファクタ（multi-factor）認証技術に従って認証されうる。例えば、ユーザの知っている何か（例えばユーザ名／パスワード）に加えて、ユーザはユーザの所有する何か（例えばＦＯＢ又は携帯電話機）及びユーザ自身である何か（生体測定値）の少なくともいずれかに基づきうる。ある例では、ユーザがパスワードを提供しない認証プロトコルに従って認証されうる。この目的に適した認証プロトコルのいくつかの例は、オーオース（Open Authorization）（OAuth)、オープンＩｄ（OpenId）及びセキュリティアサーションマークアップ言語（Security Assertion Markup Language）（ＳＡＭＬ）認証プロトコルを含む。
【００９８】
[0112]いくつかの例では、ユーザはフロントエンドサーバ３２６Ａがクエリ３３２Ａを受信する前に認証されるのに対し、他の実施形態では、ユーザはクエリ３３２Ａを受信することに応じて認証される。例えば、クエリ３３２Ａを含むネットワーク要求はまた、ユーザを認証する認証クレデンシャルを含み得、又は、ユーザは、他の方法でクエリ３３２Ａを含むネットワーク要求を受信したことに応じて認証されうる。
【００９９】
[0113]ユーザが認証された後で、認証セッションは、セッション識別トークンの形式でユーザのために確立されうる。特に、当該セッション識別トークンは、成功裏にユーザを認証したことに応じて生成されうる。生成後には、セッション識別トークンは、ユーザのエンドユーザコンピューティングデバイスとフロントエンドサーバ３２６Ａとの間で、クエリ３３２Ａを含んだネットワーク要求と回答３３４Ａを含むネットワーク応答を含む、ネットワーク要求及びネットワーク応答において（例えば”クッキー”で）送信されうる。セッション識別トークンは、直接的又は間接的（例えば連想配列を介して）に、ユーザが成功裏に認証したユーザアカウント（例えばユーザ名によってユニークに識別されるアカウント）を識別する。セッション識別トークンは、更なるセキュリティのために暗号によって暗号化されうる。
【０１００】
[0114]時々（例えば、クエリ３３２Ａを受信することに応じて）又はある期間にわたって（例えばユーザが認証された時間からユーザのエンドユーザコンピューティングデバイスに回答３３４Ａが戻るまで）、認証セッションデータ４１１は、フロントエンドサーバ３２６Ａの揮発性又は不揮発性メモリに格納されうる。認証セッションデータ４１１は、認証されたユーザのユーザ名、ユーザ識別子又は他のユーザアカウント識別子と、関連付けられた特権、許可及び権限の少なくともいずれかと、のような認証されたユーザと関連する情報を含みうる。
【０１０１】
[0115]サービングシステム３２５は、クエリ３３２Ａを満たし、且つ、ユーザのアクセスが認証されたドキュメントネームスペースに属すドキュメントインデックス３２８にインデックス化されたドキュメント３４０のみを識別するために、クエリ３３２Ａへの回答３３４Ａを制限することができる。サービングシステム３２５は、ドキュメントインデックス３２８が、クエリ３３２Ａを満たすが、ユーザのアクセスが認証されていないドキュメントネームスペースに属すインデックスドキュメント３４０をインデックス化しうるものの、この制限を行うことができる。
【０１０２】
[0116]クエリ３３２Ａに対する回答３３４Ａを制限するために、フロントエンドサーバ３２６Ａは、ネットワーク要求４１２を送信してアクセス制御サーバ４１０Ａにアクセスし、認証されたユーザによるアクセスが許容されるドキュメントネームスペースの識別子を要求する。アクセス制御サーバ４１０Ａによる決定を容易にするため、ネットワーク要求４１２は、認証されたユーザの識別又は識別子を含みうる。例えば、識別又は識別子は、ユーザ名、セッション識別子トークン、ユーザアカウント識別子、又は、ユーザ及び／又はユーザが成功裏に認証されたユーザアカウントをユニークに識別する他の情報であってよい。
【０１０３】
[0117]ネットワーク要求４１２を受信したことに応じて、アクセス制御サーバ４１０Ａは、認証されたユーザがアクセスすることが許可されたドキュメントネームスペースのユーザアカウントデータベースの識別子（図４では不図示）をルックアップすることができ、このルックアップは、要求４１２で提供された、認証されたユーザの識別又は識別子をルックアップ動作のキーとして用いてなされる。
【０１０４】
[0118]フロントエンドサーバ３２６Ａは、様々な異なる時間帯において、アクセス制御サーバ４１０Ａにネットワーク要求４１２を送信し得、例えば、フロントエンドサーバ４２６Ａは、クエリ３３２Ａを受信したことに応じて、ネットワーク要求４１２を送信しうる。他の例として、フロントエンドサーバ４２６Ａは、成功裏にユーザを認証した後にネットワーク要求４１２を送信しうる。
【０１０５】
[0119]ネットワーク要求４１２を受信したことに応じて、アクセス制御サーバ４１０Ａは、認証されたユーザがアクセスを許可された、認証されたドキュメントネームスペースの識別子を含むネットワーク応答４１３を返す。認証された各ドキュメントネームスペースは、認証されたユーザが、ドキュメントネームスペースの明示的及び／又は暗黙的なアクセス制御に従ういくつかのアクセスレベルでアクセスを許可された認証されたドキュメントネームスペースを、ユニークに識別する。例えば、認証されたドキュメントネームスペースの識別子は、認証されたユーザが、ドキュメントネームスペースに属すドキュメント３４０への、少なくとも読み取りアクセス権を有するドキュメントネームスペースを識別しうる。続くネットワーク要求に対する処理の効率化のため、フロントエンドサーバ３２６Ａは、認証されたユーザのために維持される認証セッションデータ４１１の一部として、認証されたドキュメントネームスペースの識別子を格納（キャッシュ）しうる。この場合、フロントエンドサーバ３２６Ａは、クエリ３３２Ａを受信したことに応じて、ネットワーク要求４１２をアクセス制御サーバ４１０Ａに送信する必要がない。
【０１０６】
[0120]ユーザのエンドユーザコンピューティングデバイスからのクエリ３３２Ａを含むネットワーク要求はまた、ユーザが検索することを望むドキュメントネームスペースの識別子を特定しうる。この場合、ユーザが検索することを望むドキュメントのネームスペースの識別子のセットと、ユーザのアクセスが許可された認証されたドキュメントネームスペースの識別子のセットとの共通部分が計算されて、検索のための認証されたドキュメントネームスペースの識別子のセットが決定されうる。この共通部分は、フロントエンドサーバ３２６Ａによって実行されうる。或いは、この共通部分は、アクセス制御サーバ４１０Ａによって実行されうる。この場合、フロントエンドサーバ３２６Ａは、ネットワーク要求４１２内に、ユーザが検索することを望むドキュメントのネームスペースの識別子を含み、ネットワーク応答４１３は、アクセス制御サーバ４１０Ａによって計算されるような共通部分の結果を含みうる。
【０１０７】
[0121]クエリ３３２Ａを含むネットワーク要求が、特定の要求された検索すべきドキュメントネームスペースでない場合、認証された検索すべきドキュメントネームスペースの識別子のデフォルトのセットが選択されうる。このデフォルトのセットの選択は、応答４１３で戻る認証されたドキュメントネームスペースの識別子から、又は、場合によっては認証セッションデータ１１の一部としてのキャッシュから、フロントエンドサーバ３２６Ａによって実行されうる。或いは、アクセス制御サーバ４１０Ａは、ユーザがアクセスを許可された、全ドキュメントネームスペースのセットからデフォルトのセットを選択しうる。いずれの場合も、デフォルトのセットは、ａ）ユーザがアクセスを許可された、全ドキュメントネームスペース（例えば、認証されたユーザのアカウントに関連付けられた全ドキュメントネームスペース）、又は、ｂ）それらのサブセットを特定することができる。
【０１０８】
[0122]検索のための認証されたドキュメントネームスペースの識別子が決定された後、クエリ３３２Ａと検索のための認証されたドキュメントネームスペースの識別子とを含むネットワーク要求が、クエリプロセッサ３２７による更なるクエリ３３２Ａの処理のために、フロントエンドサーバ３２６Ａからルーティングサーバ４２０Ａに送信されうる。
【０１０９】
[0123]クエリ３３２Ａと検索のための認証されたドキュメントネームスペースの識別子とを含む、フロントエンドサーバ３２６Ａからのネットワーク要求を受信したことに応じて、ルーティングサーバ４２０Ａにおけるクエリプロセッサ３２７は、クエリ３３２Ａをルーティングする１つ以上のサーバ４３０を決定する。この決定は、ルーティングサーバ４２０Ａが、検索のための認証されたドキュメントネームスペースの識別子の各々に対して決定論マッピング機能（deterministic mapping function）４１６を適用した結果に基づいてなされうる。決定論マッピング機能４１６と、ドキュメントネームスペースの識別子が与えられたインデックスサーバマッピング４１７とはルーティングサーバ（例えば４２０Ａ）によって用いられて、所定のドキュメントネームスペースのドキュメントをインデックス化するインデックスシャード（例えば３２８Ｂ）を格納するインデックスサーバ（例えば４３０Ｂ）が決定される。
【０１１０】
[0124]本発明のいくつかの実施形態に従って、決定論マッピング機能４１６は、ドキュメントネームスペースを割り当てるインデックスシャード（例えば３２８Ｂ）を決定するために、一方向ハッシュ関数、単純なハッシュ関数、コンシステントハッシュ（consistent hash）関数等を検索するドキュメントネームスペースの識別子に適用する。この決定を実行するため、ルーティングサーバ４２０Ａのクエリプロセッサ３２７は、インデックスサーバマッピング４１７へのアクセスを有しうる。同時に、決定論マッピング機能４１６とインデックスサーバマッピング４１７とは、ルーティングサーバ４２０Ａのクエリプロセッサ３２７の方法を提供して、所定のドキュメントネームスペースのためのインデックスを含むインデックスシャード（例えば３２８Ｂ）を可能するインデックスサーバ（例えば４３０Ｂ）のホスト名又はネットワークアドレスを決定する。
【０１１１】
[0125]本発明のいくつかの実施形態では、決定論マッピング機能４１６は、ハッシュ機構（hash mechanism）とモジュロ機構（modulo mechanism）とを含む。ハッシュ機構は、入力としてドキュメントネームスペースの識別子（例えばドキュメントネームスペースの識別子を表す文字列データ）を受け付け、出力としてハッシュ値ｈｖを生成しうる。例えば、ハッシュ機構は、ＭＤ４、ＭＤ５、ＳＨＡ−１又はＳＨＡ２メッセージダイジェストアルゴリズムを含み得、メッセージダイジェストアルゴリズムは、入力として提供されたドキュメントネームスペースの識別子に適用したときに、出力としてハッシュ値（例えば３２ビットのハッシュ値）を生成する。モジュロ機構は、係数ｋによってハッシュ値ｈｖを除算した余りｒを計算し、これにより、入力のドキュメントネームスペースの識別子を、０からｋ−１の範囲内でｋの１つにマッピングする。係数ｋは、例えば、実際の、期待される又は望ましいインデックスサーバ４３０の数、ドキュメントインデックス３２８によってインデックス化された、実際の、期待される又は望ましいドキュメントネームスペースの数、及び、実際の、期待される又は望ましいドキュメントネームスペースのグループの数の少なくともいずれかを含む、様々な異なる要素に基づいて選択されうる。１つの例示的な実施形態では、値ｋは２のべき乗であり少なくとも１０２４と等しい。
【０１１２】
[0126]本発明のいくつかの実施形態では、インデックスサーバマッピング４１７は、インデックスサーバ４３０のそれぞれに対するエントリを含む。このようなエントリのそれぞれは、０からｋ−１の範囲の１つ以上の重複していないサブレンジ（sub-range）によってキーが付与（keyed）される。例えば、マッピング４１７内の第１エントリＥ１は、０からｋ−１の範囲内における連続値の第１の範囲を定義するＫ１とＫ２の値を含むキーを有し得、マッピング４１７内の第２エントリＥ２は、０からｋ−１の範囲内における連続値の第２の範囲を定義するＫ３とＫ４の値を含むキーを含み得、ここで第１の範囲のＫ１からＫ２は第２の範囲のＫ３からＫ４とは重複しない。
【０１１３】
[0127]ルーティングサーバ４２０Ａにおけるクエリプロセッサ３２７が所定のドキュメントネームスペースの識別子に決定論マッピング機能４１６を適用する場合、０からｋ−１の範囲内の値ｒが生成されうる。ルーティングサーバ４２０Ａにおけるクエリプロセッサ３２７は、インデックスサーバマッピング４１７と値ｒを情報交換して、値ｒがエントリキーの範囲内であるエントリを識別する。このエントリのホスト名又はネットワークアドレスは、所定のドキュメントネームスペースに属すドキュメント３４０をインデックス化するインデックスシャード（例えば３２８Ｂ）が格納されるインデックスサーバ（例えば４３０Ｂ）を識別しうる。
【０１１４】
[0128]本発明のいくつかの実施形態では、インデックスシャード（例えば３２８Ｂ）に割り当てられるドキュメントネームスペースは、インデックスシャードが格納されるインデックスサーバ（例えば４３０Ｂ）に格納されるインデックスファイルの数を低減するために、インデックスシャードのより少ない数のドキュメントネームスペースのグループにグループ分けされる。すなわち、インデックスシャード（例えば３２８Ｂ）内で、インデックスシャードに割り当てられたるドキュメントネームスペースはドキュメントネームスペースのグループに分割されうる。そのようなドキュメントネームスペースのグループのそれぞれは、複数のドキュメントネームスペースを含みうる。
【０１１５】
[0129]例えば、インデックスシャード（例えば３２８Ｂ）に割り当てられる２百万（2,000,000）のドキュメントネームスペースのそれぞれは、インデックスシャードの８０のドキュメントネームスペースのグループの１つに分割されうる。効率化のため、インデックスシャード（例えば３２８Ｂ）が格納されるインデックスサーバ（例えば４３０Ｂ）は、８０のドキュメントネームスペースのグループのそれぞれに対する、１つ以上のインデックスファイルを、２百万（2,000,000）のドキュメントネームスペースのそれぞれに対する、１つ以上のインデックスファイルの代わりに格納しうる。この場合、ドキュメントネームスペースの識別子に適用される場合にハッシュ機構によって出力されるハッシュ値ｈｖは、所定のドキュメントネームスペースが属すドキュメントネームスペースのグループの識別子として用いられうる。
【０１１６】
[0130]いくつかの実施形態では、ドキュメントネームスペースのグループはインデックスシャード（例えば３２８Ｂ）を更に分割するためには用いられない。このような実施形態では、係数ｋによってハッシュ値ｈｖを除算した余りｒが、所定のドキュメントネームスペースが割り当てられるインデックスシャードの識別子として用いられうる。これらの実施形態ではまた、インデックスシャードが格納されるインデックスサーバは、インデックスシャードが割り当てられる全てのドキュメントネームスペースに対する１つ以上のインデックスファイルを格納しうる。例えば、インデックスサーバは、インデックスシャードが割り当てられる全てのドキュメントネームスペースに対する単一のインデックスファイルを格納しうる。
【０１１７】
[0131]図４では、インデックスサーバマッピング４１７が決定論マッピング機能４１６及びルーティングサーバ４２０Ａにおけるクエリプロセッサ３２７とは別に図示されているが、インデックスサーバマッピング４１７は、決定論マッピング機能４１６の構成要素、又はルーティングサーバ４２０Ａにおけるクエリプロセッサ３２７の構成要素であってもよい。更に、各ルーティングサーバ４２０Ａは、インデックスサーバマッピング４１７へのアクセスを有しうる。この場合、効率的なアクセスのために、インデックスサーバマッピング４１７のコピーがルーティングサーバ４２０のそれぞれにおいて格納（キャッシュ）されうる。追加的に又は代替的に、インデックスサーバマッピング４１７は、ネットワークサービスとしてルーティングサーバに対して利用可能であってもよい。サービングシステム３２５は、負荷分散、容量の増加、スループットの増加、レイテンシの低減、フェイルオーバ、及び冗長性の少なくともいずれかのために、水平方向にスケールされる複数のルーティングサーバ４２０を含みうる。
【０１１８】
[0132]例示的な実施形態では、ドキュメントインデックス３２８は、４億（400,000,000）を超えるドキュメントネームスペースのドキュメント３４０をインデックス化し、決定論マッピング機能４１６とインデックスサーバマッピング４１７とは、４億（400,000,000）を超えるドキュメントネームスペースのそれぞれを、およそ２百（200）のインデックスシャード（例えば３２８Ａ、３２８Ｂ、３２８Ｃ...３２８Ｎ）の１つに割り当てる（マッピングする）。この例示的な実施形態では、各インデックスシャード（例えば３２８Ａ）は、およそ２百万（2,000,000）のドキュメントネームスペースにおけるドキュメント３４０をインデックス化する。
【０１１９】
[0133]いくつかの例では、インデックスサーバ（例えば４３０Ｃ）は、実際には水平方向に分散された複数のサーバを含み、インデックスシャード（例えば３２８Ｃ）に対する負荷分散、フェイルオーバ、冗長性を提供する。この場合、複数のインデックスサーバのそれぞれは、インデックスシャード（例えば３２８Ｃ）の複製（replica）又はコピーを格納しうる。
【０１２０】
[0134]いくつかの例では、インデックスサーバ（例えば４３０Ａ）は、インデックスシャード（例えば３２８Ａ）の一部を格納する、複数のサーバを含む。この場合、複数のレベルのルーティングサーバが存在しうる。第１のルーティングレベルは、フロントエンドサーバ３２６Ａから受信したクエリ３３２Ａを、１つ以上のインデックスサーバ４３０にルーティングするルーティングサーバ４２０Ａによって例示される。この例では、ルーティングサーバの第２のレベルは、インデックスサーバ（例えば４３０Ｃ）内でクエリをインデックスサーバの複数のサーバの１つ以上に更にルーティングするために存在しうる。この場合、第２のレベルのルーティングサーバはまた、決定論マッピング機能と、ドキュメントネームスペースの識別子に基づいてクエリをルーティングするための決定論マッピング機能４１６とインデックスサーバマッピング４１７のようなマッピングとを有しうる。
【０１２１】
[0135]図４の例では、クエリ３３２Ａは、ルーティングサーバ４２０Ａにより、決定論マッピング機能４１６とインデックスサーバマッピング４１７に従ってインデックスサーバ４３０Ｂと４３０Ｃとにルーティングされる。しかし、クエリ３３２Ａは、クエリ３３２Ａを用いて検索する認証されたドキュメントネームスペースの数に応じて、容易に単なる１つのインデックスサーバ４３０にルーティングされるか、２つ以上のインデックスサーバ４３０にルーティングされるかする。例えば、検索する１つの認証されたドキュメントネームスペースのみが存在する場合、又は、検索する全ての認証されたドキュメントネームスペースが１つのインデックスシャード（例えば３２８Ｂ）に割り当てられている場合、そのときは、クエリ３３２Ａは、ルーティングサーバ４２０Ａにより、単なる１つのインデックスサーバ（例えば４３０Ｂ）にルーティングされうる。
【０１２２】
[0136]クエリ３３２Ａをインデックスサーバ（例えば４３０Ｂ）にルーティングする場合、ルーティングサーバ４２０Ａは、インデックスサーバへクエリ３３２Ａを含むネットワーク要求を送信しうる。加えて、ネットワーク要求は、インデックスサーバに格納されたインデックスシャード（例えば３２８Ｂ）に割り当てられる、検索する識別されたドキュメントネームスペースの識別子を含みうる。加えて、そのような認証されたドキュメントネームスペースの識別子のそれぞれは、ネットワーク要求内で、ドキュメントネームスペースが属すドキュメントネームスペースのグループの識別子と関連付けられうる。
【０１２３】
[0137]本発明のいくつかの実施形態において、インデックスサーバ（例えば４３０Ｂ）のクエリプロセッサ３２７は、クエリ３３２Ａへの回答（例えば、４１８Ａ）を判定する際に、アクセスされるインデックスシャード（例えば、３２８B）の部分を制限するために、ルーティングサーバ４２０Ａから受信したネットワーク要求内のドキュメントネームスペースのグループを用いる。例えば、インデックスサーバのクエリプロセッサ３２７は、ネットワーク要求内のドキュメントネームスペースのグループの識別子に基づいて、インデックスサーバの不揮発性メモリに格納される所定のインデックスデータベースにのみ、又はインデックスサーバの不揮発性メモリに格納された所定のデータ構造にのみアクセスしうる。
【０１２４】
[0138]例として、対応するドキュメントネームスペースの識別子”ａｂｃｄ”及び”ｄeｆｇ”を用いて２つの認証されたドキュメントネームスペースが検索されるべきであることを特定したクエリ３３２Ａを含むネットワーク要求が、フロントエンドサーバ３２６Ａからルーティングサーバ４２０Ａに送信されることを想定する。更に、決定論マッピング機能４１６とインデックスサーバマッピング４１７に従って、認証されたドキュメントネームスペース”ａｂｃｄ”がドキュメントネームスペースのグループ”１２３４”に属し、かつインデックスシャード３２８Bに割り当てられるとともに、認証されたドキュメントネームスペース”ｄeｆｇ”がドキュメントネームスペースのグループ”５６７８”に属し、かつインデックスシャード３２８Ｃに割り当てられることを想定する。この場合、ルーティングサーバ４２０Ａからインデックスサーバ４３０Ｂへのネットワーク要求が、ドキュメントネームスペースのグループ”１２３４”におけるドキュメントネームスペース”ａｂｃｄ”が検索されるべきであることを特定し、ルーティングサーバ４２０Ａからインデックスサーバ４３０Ｃへのネットワーク要求が、ドキュメントネームスペースのグループ”５６７８”におけるドキュメントネームスペース”ｄeｆｇ”が検索されるべきであることを特定する。インデックスサーバ４３０Ｂは、クエリ３３２Ａに対する回答４１８Ａを形成する場合に、インデックスサーバ４３０Ｂへ送信されたネットワーク要求内の、ドキュメントネームスペースのグループの識別子”１２３４”を用いて、インデックスサーバ４３０Ｂのクエリプロセッサ３２７によってアクセスされるインデックスシャード３２８Ｂの部分を限定する。同様に、インデックスサーバ４３０Ｃは、クエリ３３２Ａに対する回答４１８Ｂを形成する場合に、インデックスサーバ４３０Ｃへ送信されたネットワーク要求内の、ドキュメントネームスペースのグループの識別子”５６７８”を用いて、インデックスサーバ４３０Ｃのクエリプロセッサ３２７によってアクセスされるインデックスシャード３２８Ｃの部分を限定する。このような限定は、例えば、インデックスサーバの不揮発性メモリに格納されるインデックスデータベースファイル３５１、及び／又は、特定されたドキュメントネームスペースのグループの識別子に関連付けられたインデックスサーバの不揮発性のメモリ内のデータにのみアクセスすることを含みうる。
【０１２５】
[0139]ルーティングサーバ４２０Ａは、インデックスサーバ４３０のそれぞれのクエリプロセッサ３２７が並行してクエリを処理することができるように、クエリ３３２Ａを複数のインデックスサーバ（例えば４３０Ｂ、４３０Ｃ）にルーティングしうる。例えば、ルーティングサーバ４２０Ａは、クエリ３３２Ａを含むネットワーク要求を、ルーティングサーバ４２０Ａが、クエリ３３２Ａを含むインデックスサーバ４３０Ｃへのネットワーク要求を送信するのと同時又はほぼ同時に、インデックスサーバ４３０に送信しうる。この場合、インデックスサーバ４３０Ｂのクエリプロセッサ３２７は、インデックスシャード３２８Ｂに対するクエリ３３２Ａを、インデックスサーバ４３０Ｂのクエリプロセッサ３２７がインデックスシャード３２８Ｃに対するクエリ３３２Ａを処理するのと同時又はほぼ同時に、処理しうる。
【０１２６】
[0140]インデックスサーバ４３０（例えば４３０Ｂ）においてクエリ３３２Ａが受信された場合、インデックスサーバのクエリプロセッサ３２７はインデックスサーバに格納されたインデックスシャード（３２８Ｂ）を情報交換して（にアクセスして）、クエリを満たすドキュメント３４０を決定する。このようにするために、インデックスサーバのクエリプロセッサ３２７は、クエリに対する回答（例えば４１８Ａ）においておそらく識別可能なドキュメント３４０を、検索されるべき認証されたドキュメントネームスペースに属すドキュメント３４０のみに制限しうる。この制限を行うために、インデックスサーバのクエリプロセッサ３２７は、ルーティングサーバ４２０Ａからのネットワーク要求において識別子クエリ３３２Ａに付随する、認証されたドキュメントネームスペースを用いうる。加えて、インデックスシャードにインデックス化されたドキュメント３４０のドキュメント識別子は、インデックス化されたドキュメント３４０が属すドキュメントネームスペースの、ドキュメントネームスペースの識別子と関連付けられうる。これらの関連は、クエリプロセッサ３２７がドキュメント３４０を制限することを容易にする。ここで、当該ドキュメントは、１）クエリ３３２Ａを満たすドキュメント、及び、２）検索されるべき認証されたドキュメントネームスペースの識別子の１つである、ドキュメントネームスペースの識別子に関連付けられたドキュメントに対するクエリへの回答の中で識別されることができる。インデックス化されたドキュメント３４０が別のやり方でクエリを満たしたとしても、ドキュメント３４０が検索する認証されたドキュメントネームスペースの１つに属さない場合には、インデックスサーバのクエリプロセッサ３２７は、クエリ３３２への回答４１８Ａにおいてドキュメント３４０を特定しないかもしれない。
【０１２７】
[0141]ルーティングサーバ（例えば４２０Ａ）に戻るインデックスサーバ（例えば４３０Ｂ）からの回答（例えば４１８Ａ）は、クエリ３３２Ａを満たす認証されたドキュメントネームスペースの１つ以上で１つ以上のドキュメント３４０を識別しうる。ドキュメントは、インデックスサーバのクエリプロセッサ３２７によって採用されるランキング機能に従ってランク付けされうる。このランキング機能は、インデックス化されたドキュメントに対して計算された、クエリ依存型メトリクス及びクエリ非依存型メトリクスの少なくともいずれかに基づきうる。
【０１２８】
[0142]クエリ３３２Ａに対するインデックスサーバ（例えば４３０Ｂ）からの回答（例えば４１８Ａ）は、ランキング機能によって生成された、識別されたドキュメントのそれぞれに対するランキングスコアを含みうる。クエリプロセッサ３２７は、異なるインデックスサーバで生成された、同一のクエリに対するランキングスコアが互換性を有するように、インデックスサーバ（例えば、４３０Ａ、４３０Ｂ、４３０Ｃ、...４３０Ｎ）と全く同一のランキング機能を採用しうる。インデックスサーバと全く同一のランキング機能を用いることは、ルーティングサーバ４２０Ａにおけるクエリプロセッサ３２７が、インデックスサーバ４３０Ｂ及び４３０Ｃから戻る、クエリ３３２Ａに対する複数の回答４１８Ａ及び４１８Ｂで識別されたドキュメント３４０を、フロントエンドサーバ３２６Ａへ戻る、そして最終的には、フロントエンドサーバ３２６Ａがクエリ３３２Ａを受信したエンドユーザコンピューティングデバイス３１１Ａに戻る、単一の回答３３４Ａに統合できるようにする。
【０１２９】
[0143]本発明のいくつかの実施形態に従って、フロントエンドサーバ３２６Ａは、従来型のスペリング修正アルゴリズム及び従来型の発音修正アルゴリズム（例えばsoundexアルゴリズム）の少なくともいずれかを、得られた検索クエリ３３２Ａに適用しうる。スペリング修正アルゴリズムはスペリング修正の異なる形式を適用することができる。例えば、スペリング修正アルゴリズムは、従来型の分離語の修正アルゴリズム（isolated-term correction algorithm）（例えば、距離編集及び／又はk-gram重複）及び／又は従来型のコンテキスト依存型の修正アルゴリズムを適用することができる。従って、ルーティングサーバ４２０Ａに転送され、インデックスサーバ４３０にルーティングされたクエリ３３２Ａは、フロントエンドサーバ３２６Ａによってクエリ３３２Ａのトークンに対して実行されるスペリング修正及び／又は発音修正の結果を反映しうる。
【０１３０】
＜インデックスシャード＞
[0144]次に、図５を参照して、本発明のいくつかの実施形態に従う、ドキュメントインデックス３２８のインデックスシャード（例えば３２８Ｂ）のブロック図について説明する。本発明のいくつかの実施形態では、インデックスシャードは、辞書５１０と、対応する登録５２０とを含む逆インデックスのように構築されうる。
【０１３１】
[0145]辞書５１０は、登録５２０内で識別されるドキュメント３４０がインデックス化される、インデックストークン（例えばトークン１、トークン２、トークン３、...トークンＮ、）を含みうる。辞書５１０もまた、各インデックストークン（例えばトークン１）に対して、１つ以上のドキュメントの識別子（例えばＤＯＣ  ＩＤ１）の登録リスト（例えば登録リスト２）へのポインタを含み得、当該１つ以上のドキュメントの識別子は、インデックストークンがインデックス化された（現われる）ドキュメント３４０を識別する。
【０１３２】
[0146]辞書５１０はまた、例えばトークン頻度情報、又は、クエリに依存した方法及び／又はクエリに非依存の方法で検索クエリへのドキュメントの関連をランク付け又は他の方法で決定するクエリプロセッサ３２７のランキング機能で用いられうる他の情報などの、例えばトークン属性情報などのインデックストークン以外の情報を含みうる。
【０１３３】
[0147]登録５２０の登録リスト（例えば、登録リスト２）は、ドキュメント識別子以外の情報、例えば、ドキュメントトークンの属性情報、例えば、特定のドキュメント３４０内のトークンのトークン頻度、特定のドキュメント３４０内のトークンの１つの位置又は複数の位置などの情報、又は、クエリに依存した方法及び／又はクエリに非依存の方法でクエリへのドキュメント３４０の関連をランク付けする又は他の方法で決定するクエリプロセッサ３２７のランキングアルゴリズムによって使用されうる他の情報を含みうる。
【０１３４】
[0148]登録５２０内のドキュメント識別子（例えばＤＯＣ  ＩＤ１、ＤＯＣ  ＩＤ２、ＤＯＣ  ＩＤ３...ＤＯＣ  ＩＤ Ｎ）は、識別されるドキュメント３４０が属すドキュメントネームスペースを示すドキュメントネームスペースの識別子と関連付けられうる。この関連はまた、インデックスサーバ（例えば４３０Ｂ）のクエリプロセッサ３２７が、クエリ（例えば３３２）に対する回答（例えば４１７Ａ）を制限して、検索されるべき認証されたドキュメントネームスペースに属すドキュメント３４０のみを識別できるようにする。
【０１３５】
[0149]例えば、登録リスト（登録リスト２）の要素は、ドキュメント３４０が属すドキュメントネームスペースを識別するドキュメントネームスペースの識別子を用いてプリフィックスされ（prefixed）うる。例えば、登録リスト（例えば登録リスト２）は、＜ドキュメントネームスペースの識別子＞：＜ドキュメント識別子＞の形式の文字列データであり得、ここで＜ドキュメントネームスペースの識別子＞は、ドキュメントネームスペースを識別する文字列データフィールド、＜ドキュメント識別子＞はドキュメントネームスペースに属すドキュメント３４０を識別する文字列データフィールドである。コロン”：”文字は、セパレータ文字として用いられて、登録リスト要素内の文字列データフィールドを分割する。他のセパレータ文字も使用可能である。セパレータ文字を用いないことも可能であり、例えば、文字列データフィールドを固定長にすることもできる。ドキュメント識別子のための他の形式も使用可能であり、本発明は特定のプレフィックス形式を何ら限定しない。
【０１３６】
[0150]ドキュメント３４０と属すドキュメントネームスペースとを関連付けるドキュメントネームスペースの識別子を用いて、登録リストのドキュメント識別子をプレフィックスする代わりに、インデックスシャードは、多対１マッピングを有しうる。この多対１マッピングは、所定のドキュメント識別子を、ドキュメント３４０が属すドキュメントネームスペースの識別子にマップする。このマッピングは、ドキュメントネームスペースは複数のドキュメント３４０を含みうるため、多対１である。
【０１３７】
[0151]本発明のいくつかの実施形態では、スペースの効率化及び登録５２０のサイズ低減のため、登録リストのドキュメントネームスペースの識別子又はドキュメント識別子（例えば登録リスト２）は、ローカル識別子を含み、このローカル識別子は、インデックスシャード（インデックスシャード３２８Ｂ）に対して局所的であり、かつ、（バイト数に関して）サイズがより大きい、グローバルのドキュメントネームスペースの識別子又はグローバルのドキュメント識別子の代用となる。この局所的な識別子は、当該ローカル識別子が代用となる、グローバルのドキュメントネームスペースの識別子或いはグローバルのドキュメント識別子よりも（バイト数に関して）サイズが小さくなりうる。
【０１３８】
[0152]インデックスシャード（例えば３２８Ｂ）は、所定のローカル識別子をグローバルのドキュメント識別子にマップする１対１マッピングを含みうる。或いは、２つの１対１のマッピングを有しうる。マッピングの１つは、ローカルのドキュメントネームスペースの識別子からグローバルのドキュメントネームスペースの識別子へ変換し、他のマッピングは、ローカルのドキュメント識別子をグローバルのドキュメント識別子に変換する。更に他の代替として、所定のローカルドキュメントネームスペースからグローバルの識別子とドキュメント３４０の属すドキュメントネームスペースのグローバルドキュメントネームスペースの識別子に変換する１対１マッピングを有しうる。
【０１３９】
[0153]本説明において、明示的な説明がない限り、ドキュメント３４０の”ドキュメント識別子”は、ドキュメント識別子の全ての取り得る形式を参照し得、当該ドキュメント識別子は、ドキュメント３４０のローカルなドキュメント識別子とドキュメント３４０のグローバルなドキュメントの識別子とを含み、直接的に又は間接的に（例えば、連想配列を通じて）ユニークにドキュメント３４０を識別する。
【０１４０】
[0154]同様に、本説明において、明示的に説明がない限り、ドキュメントネームスペースの”ドキュメントネームスペースの識別子”は、ドキュメントネームスペースの識別子の全ての取り得る形式を参照し得、当該ドキュメントネームスペースの識別子は、ローカルなドキュメントネームスペースの識別子とグローバルなドキュメントネームスペースの識別子とを含み、ドキュメントネームスペースを直接的に又は間接的に（例えば、連想配列を通じて）ユニークにドキュメントネームスペースを識別する。
【０１４１】
[0155]本発明のいくつかの実施形態によれば、クエリ（例えば３３２）がインデックスサーバ（例えば４３０Ｂ）において受信されると、インデックスサーバのクエリプロセッサ３２７は、対応する登録リスト５２０における登録リストを識別するために、辞書５１０へのキーとしてクエリのクエリトークンを使用する。クエリに複数のクエリトークンがある場合、対応する登録リストは、複数のクエリのトークンが論理式として互いにどのように関連するのかに従って適切にマージされうる。
【０１４２】
[0156]本発明の実施形態では、インデックスサーバのクエリプロセッサ３２７は、クエリに対する回答（例えば４１７Ａ）に含まれ得る、対応する登録リスト内で識別されるドキュメント３４０を、検索されるべき認証されたドキュメントネームスペースに属すドキュメント３４０に制限する。本発明のいくつかの実施形態では、インデックスサーバのクエリプロセッサ３２７は、対応する登録リスト内でドキュメント識別子に関連付けられたドキュメントネームスペースの識別子を比較することによって、（ルーティングサーバ（例えば４２０Ａ）からの、クエリを含むネットワーク要求に含まれる）クエリと関連付けられた認証されたドキュメントネームスペースの識別子に限定する。クエリを他の方法で満たす、ドキュメント３４０のドキュメント識別子と関連付けられたドキュメントネームスペースの識別子が、クエリと関連付けられた認証されたドキュメントネームスペースの識別子と一致する場合、ドキュメント３４０はクエリに対する回答に含まれうる。しかしながら、ドキュメント識別子と関連付けられたドキュメントネームスペースの識別子が、クエリと関連付けられた認証されたドキュメントネームスペースの識別子と一致しない場合、そのドキュメントが他の方法でクエリを満たす場合であっても、ドキュメント３４０はクエリに対する回答に含まれない。このように、インデックスサーバ４３０のクエリプロセッサ３２７は、回答を、検索されるべきクエリと関連付けられた認証されたドキュメントネームスペースに属すドキュメント３４０のみに限定しうる。
【０１４３】
[0157]本発明のいくつかの実施形態では、インデックスシャードは複数の辞書５１０／登録５２０のペアを格納する。例えば、インデックスシャードは、インデックスシャードに関連付けられた複数のドキュメントネームスペースのそれぞれに対して、又は、インデックスシャードに関連付けられた複数のドキュメントネームスペースのグループのそれぞれに対して、辞書５１０と対応する登録５２０とを格納しうる。
【０１４４】
[0158]本発明の複数の実施形態では、インデックスシャード（３２８Ｂ）は、インデックスデータファイル３５１の識別可能な別々のセットと、インデックスシャードに関連付けられるドキュメントネームスペースのグループの識別子に従う揮発性メモリデータ構造とに組織化されうる。この場合、分離された辞書５１０、又は、インデックスシャードにあり得てられるドキュメントネームスペースのグループのそれぞれに対して分離された辞書５１０と対応する登録５２０が存在しうる。クエリ（例えば３３２）がインデックスサーバ（例えば４３０Ｂ）において受信されると、インデックスサーバのクエリプロセッサ３２７は、ルーティングサーバからのネットワーク要求における、認証されたドキュメントネームスペースの識別子と関連付けられたドキュメントネームスペースのグループの識別子を用いて、アクセスすべき、辞書５１０或いは辞書５１０と対応する登録５２０を決定することができる。
【０１４５】
[0159]本発明の複数の実施形態では、インデックスシャード（３２８Ｂ）は、インデックスデータファイルの識別可能な別々のセットと、インデックスシャードに関連付けられるドキュメントネームスペースの識別子に従う揮発性メモリデータ構造とに組織化されうる。この場合、分離された辞書５１０、又は、インデックスシャードに割り当てられるドキュメントネームスペースのそれぞれに対して分離された辞書５１０と対応する登録５２０が存在しうる。クエリ（例えば３３２）がインデックスサーバ（例えば４３０Ｂ）において受信されると、インデックスサーバのクエリプロセッサ３２７は、ルーティングサーバからのネットワーク要求における、認証されたドキュメントネームスペースの識別子と関連付けられたドキュメントネームスペースのグループの識別子を用いて、アクセスすべき、辞書５１０或いは辞書５１０と対応する登録５２０を決定することができる。
【０１４６】
[0160]本発明のいくつかの実施形態では、インデックスシャードは複数の辞書５１０／登録５２０のペアを、クエリの異なる種別を処理するために格納する。例えば、インデックスシャードに関連付けられた、所定のドキュメントネームスペース又はドキュメントネームスペースのグループに対し、インデックスシャードは、非コンプリーションクエリを処理するための第１の辞書５１０／登録５２０のペアと、コンプリーションクエリを処理するための第２の辞書５１０／登録５２０とを格納しうる。分離された辞書５１０／登録５２０のペアを格納することにより、構造と、辞書５１０のコンテンツ及び対応する登録５２０とが、所定の種別のクエリを処理するために適合したものになる。例えば、コンプリーションクエリを処理するための辞書５１０は、ドキュメントの全テキストに対して対立するインデックストークンとして、ドキュメントのファイル名に対するインデックストークンのみを含んで、不揮発性メモリ（例えばフラッシュメモリ）又は揮発性メモリ（例えばＲＡＭ）に格納する際に消費されるバイトに関して辞書のサイズを低減しうる。これにより、クエリプロセッサ３２７がより高速にコンプリーションクエリを処理することを可能にする。
【０１４７】
[0161]インデックスサーバ（例えば４３０Ｃ）のクエリプロセッサ３２７は、より効率的なアクセスのため、辞書５１０（又はその一部）を不揮発性メモリ（例えばフラッシュメモリ）から揮発性メモリ（例えばＲＡＭ）に読み込む。登録リスト（例えば登録リスト２）は、より効率的なアクセスのため、インデックスサーバ（例えば４３０Ｃ）の不揮発性メモリ（例えばフラッシュメモリ）に格納され、及び／又は、インデックスサーバの揮発性メモリ（例えばＲＡＭ）にキャッシュされうる。キャッシュされた登録リストは、例えば最長未アクセスポリシーなどのキャッシュ退避ポリシーに従って、インデックスサーバの揮発性メモリから退避される。インデックスサーバ（例えば４３０Ｂ）のクエリプロセッサ３２７はまた、登録５２０から検索された複数の登録リストについて実行されるマージアルゴリズムの結果として生成される登録リストを、揮発性メモリにキャッシュしうる。このようにすることで、インデックスサーバのクエリプロセッサ３２７は、複数の登録リストについてマージアルゴリズムを後に実行しなければならなくなることを回避しうる。
【０１４８】
[0162]図５の参照を継続して、本発明のいくつかの実施形態では、コンプリーションクエリの処理を容易にするため、辞書５１０内のインデックストークンはドキュメントネームスペースの識別子によってプレフィックスされ得、プレフィックスされたインデックストークンは、辞書内においてプレフィックスされたインデックストークンの辞書順でソートされうる。この方法で構成される辞書５１０は、以下では”コンプリーション（completion）”辞書として参照される。
【０１４９】
[0163]本発明のいくつかの実施形態では、プレフィックスされたインデックストークンに関連付けられた登録リストは、プレフィックスされたインデックストークンにおいて識別されるドキュメントネームスペースに属す、ドキュメント３４０のドキュメント識別子を含みうる。従って、コンプリーション辞書が、１つ以上のドキュメントネームスペースに対するプレフィックスされたインデックストークンを含む場合、インデックストークンは、１度以上、複数のドキュメントネームスペースのそれぞれに対して一度の頻度で、コンプリーション辞書に現れうる。
【０１５０】
[0164]例えば、コンプリーション辞書におけるプレフィックスされたインデックストークンは、＜ドキュメントネームスペースの識別子＞：＜インデックストークン＞の形式を有し得、ここで＜ドキュメントネームスペースの識別子＞は、ドキュメントネームスペースを識別する文字列データフィールド、＜インデックストークン＞はインデックストークンの文字を含む文字列データフィールドである。コロン”：”又は他の文字は、セパレータ文字として用いられて、プレフィックスされたインデックストークン内の文字列データフィールドを分割する。プレフィックスされたインデックストークンの例は、［ａｂｃｄ：プライベート］（囲い括弧は除く）であり、ここで、”ａｂｃｄ”はドキュメントネームスペースの識別子であり、”プライベート”（private）はインデックストークンである。
【０１５１】
[0165]プレフィックスされたインデックストークンの辞書順ソートに従ってコンプリーション辞書内のプレフィックスされたインデックストークンをソートすることにより、インデックスサーバ（例えば４３０Ｂ）のクエリプロセッサ３２７は、コンプリーションクエリのコンプリーショントークンに対して、より効率的に可能性のあるコンプリーション要素を識別することができる。特に、同一のドキュメントネームスペースに属し且つコンプリーショントークンと一致するプレフィックスを共有するコンプリーション辞書におけるインデックストークンは、プレフィックスされたインデックストークンの辞書順ソートの結果として、コンプリーション辞書が不揮発性メモリ又は揮発性メモリに格納される際に、（連続して又は隣接するメモリロケーションに）互いに近くに格納され（クラスタ化され）うる。このようなクラスタリングは、クエリプロセッサが、コンプリーショントークンに対する可能性のあるコンプリーション要素を決定するために、コンプリーション辞書にアクセスする場合に、連続的なメモリアクセスを容易にし、また、コンプリーション辞書にアクセスする場合のランダムメモリアクセスを低減又は排除する。
【０１５２】
[0166]例えば、ドキュメントネームスペース”ａｂｃｄ”に対するインデックストークン”concession”、”conclude”、”conclusion”、”concrete”及び”concurrent”は、プレフィックスされたインデックストークン”abcd：concession”、”abcd：conclude”、”abcd：conclusion”、”abcd：concrete”及び”abcd：concurrent”として、それぞれメモリ内で互いに近く格納されうる。例えば、コンプリーショントークン”con”を用いるコンプリーションクエリであって、且つ、例えば”abcd”の識別子を有する特定のドキュメントネームスペースが、検索される認証されたドキュメントネームスペースである、コンプリーションクエリを処理する場合、クエリプロセッサは、コンプリーション辞書にアクセスするためのインデックスキー”abcd:con”を生成しうる。辞書順ソートの結果として、プレフィックスされたインデックストークンはメモリ内で互いに近くに格納されるため、クエリプロセッサは、プレフィックスされたインデックストークンがメモリ内で互いに近くに格納されていない場合よりも、ドキュメントネームスペース”abcd”内のコンプリーショントークン”con”に対してあり得るコンプリーション要素として、インデックストークン”concession”、”conclude”、”conclusion”、”concrete”及び”concurrent”をより効率的に識別することができる。
【０１５３】
[0167]プレフィックスされたインデックストークンの辞書順ソートの結果として、コンプリーション辞書のプレフィックスされたインデックストークンがメモリ内で互いに近くに格納されることに加えて、ソートされたプレフィックスされたインデックストークンに関連付けられるコンプリーション辞書の、対応する登録リストの格納場所へのポインタ（例えばアドレス）もまた、プレフィックスされたインデックストークンの辞書順ソートの結果として、メモリ内で互いに近くに格納されうる。特に、プレフィックスされたインデックストークンに対する登録リストの格納場所へのポインタは、メモリ内のプレフィックスされたインデックストークンの近くに格納されうる。例えば、ポインタとプレフィックスされたインデックストークンとは、同一のメモリブロック、若しくは、連続する又は隣接するメモリブロックの同じセットに格納されうる。従って、クエリプロセッサが、例えば、ドキュメントネームスペース”abcd”内のコンプリーショントークン”con”に対してあり得るコンプリーション要素として、インデックストークン”concession”、”conclude”、”conclusion”、”concrete”及び”concurrent”をより効率的に識別することができるだけでなく、クエリプロセッサはまた、辞書順ソートの結果として、これらのインデックストークンに対応する登録リストの格納場所をより効率的に識別することができる。
【０１５４】
[0168]本発明のいくつかの実施形態では、プレフィックスされたインデックストークンの辞書順にコンプリーション辞書のプレフィックスされたインデックストークンをソートすることは、各レコードが、プレフィックスされたインデックストークンと、プレフィックスされたインデックストークンに対する登録リストが格納された、揮発性又は不揮発性メモリの場所へ関連付けられたポインタと、を含むコンプリーション辞書の複数のレコード（データ構造）をソートすることを含む。複数のレコードは、プレフィックスされたインデックストークンの辞書順に従ってソートされうる。そして、ソートされたレコードは、連続した又は隣接したコンピュータメモリ（例えば揮発性メモリ又は不揮発性メモリ）のブロックに格納されうる。
【０１５５】
＜トークン格納部＞
[0169]前述したように、マルチユーザ検索システム３２０のビルドシステム３２１は、トークン格納部３２４及びインデクサー３２３を備えてもよい。
【０１５６】
[0170]図６は、本発明のいくつかの実施形態に係る、トークン格納部３２４における可能なスキーマを示す。当該スキーマによれば、トークン格納部３２４は２つのテーブル： ”ドキュメント”テーブル６１０と、”インデクサードキュメント”テーブル６２０とを含む。
【０１５７】
[0171]ドキュメントテーブル６１０は、ビルドシステム３２１のトークナイザ３２２によって処理されるホストのドキュメント３４０のバージョンについての複数トークンのセットとメタデータを格納する。特定の実施形態において、ドキュメントテーブル６１０は、所定の時点で、ドキュメント３４０の最新バージョンの番号γへのみの情報を格納してもよく、当該γは例えばドキュメントテーブル６１０の所望の最大サイズ又は手近な特定の実装の要件に従った他の要因を含む種々の要因に基づいて選択されてもよい。いくつかの実施形態によれば、ビルドシステム３２１のインデクサー３２３は、以下でより詳細に説明するように、インデックスデータベースファイル３５１を生成するためにドキュメントテーブル６１０の情報を使用する。
【０１５８】
[0172]インデクサードキュメントテーブル６２０は、インデクサー３２３によって処理されるドキュメント３４０の現在のバージョンについての複数トークンのセット及びメタデータを格納する。いくつかの実施形態において、ドキュメントの現在のバージョンは、インデクサー３２３によって処理されたドキュメントの最も後の（最新の）バージョンである。いくつかの実施形態によれば、インデクサー３２３は、以下でより詳細に説明されるように、インデックス変更情報３５２を生成するために、ドキュメントテーブル６１０とインデクサードキュメントテーブル６２０との情報を使用する。
【０１５９】
[0173]ドキュメントテーブル６１０は、多くの行を含む。ドキュメントテーブル６１０の行は、行キー（例えば、６１１）によってキーを付与されてもよい。いくつかの実施形態において行キー（例えば、611）は、ドキュメントネームスペースのグループ識別子、ドキュメント識別子、及びドキュメントバージョン識別子を含むバイト配列である。ドキュメント識別子はドキュメントを識別する。ドキュメントバージョン識別子はドキュメントの特定のバージョンを識別する。このように、ドキュメントテーブル６１０の行は、ドキュメントバージョンに対応してもよい。ドキュメントネームスペースのグループ識別子は、当該ドキュメントが属するドキュメントネームスペースを含む１以上のドキュメントネームスペースのグループ（集合）を識別する。コロン文字（’：’）若しくは他の文字又は文字列が、ドキュメントネームスペースのグループ識別子、ドキュメント識別子、及びドキュメントバージョン識別子を互いに区別するように、バイト配列に使用されてもよい。
【０１６０】
[0174]ドキュメントテーブル６１０は、”トークン”の列ファミリーを含んでもよい。ドキュメントテーブル６１０の各列に関し、トークンの列ファミリーは、対応するドキュメントバージョンからトークナイザ３２２によって作製されたトークンのリスト（例えば、６１２）を格納する。図６には示していないが、トークンの列ファミリはまた、トークンの種々のドキュメントバージョンにおけるトークン属性を格納してもよい。そのようなドキュメントバージョンにおけるトークン属性は、例えば、対応するドキュメントバージョンのトークンの頻度及びトークンの位置の少なくとも一方を含んでもよい。
【０１６１】
[0175]本発明のいくつかの実施形態によれば、ドキュメントテーブル６１０に格納されうる対応するドキュメントバージョンに対するトークンにおけるいくつかのドキュメントバージョンにおけるトークン属性は、以下に記載するもののサブセット又は上位セットを含む：
・当該トークンがドキュメントバージョンのファイル名の一部であるかどうかを示すデータ、
・当該トークンがドキュメントバージョンにおけるファイル名の拡張子の一部であるかどうかを示すデータ、
・当該トークンがドキュメントバージョンにおけるファイルパスの一部であるかどうかを示すデータ、
・当該トークンがドキュメントバージョンにおけるタイトルの一部であるかどうかを示すデータ、及び／又は、
・当該トークンがドキュメントバージョンにおいて太字さもなければ強調表示されたものであるかどうかを示すデータ。
【０１６２】
[0176]いくつかの実施形態において、ドキュメントテーブル６１０の行に関し、トークンの列ファミリーは、トークンのリスト（例えば、６１２）と、ドキュメントバージョンにおけるトークン属性のリストを格納する。トークンのリストは、ドキュメントバージョンにおけるトークン属性と同じ長さであってもよい。ドキュメントバージョンにおけるトークン属性のリストの位置ｉの要素は、トークンのリストの位置ｉのトークンについてのドキュメントバージョンにおけるトークン属性を含む。或いは、２つのリストの代わりに単一のリストが格納されてもよい。単一のリストの各要素は、トークンと当該トークンのドキュメントバージョンにおけるトークン属性とを含むタプル（tuple）である。
【０１６３】
[0177]ドキュメントテーブル６１０はまた、”メタデータ”の列ファミリーを含む。ドキュメントテーブル６１０の各行において、メタデータの列ファミリーは、対応するドキュメントバージョンの名付けられたドキュメントバージョンにおける属性（例えば、６１３）のセットを格納する。例えば、ドキュメントテーブル６１０において、ドキュメントバージョンにおける属性、名づけられた”リビジョン”は、対応するドキュメントバージョンのドキュメントバージョン識別子である。他のドキュメントバージョンにおける属性も可能である。
【０１６４】
[0178]本発明のいくつかの実施形態によれば、ドキュメントの“リビジョン”に加えて、ドキュメントテーブル６１０に格納されうる対応するドキュメントバージョンに対するいくつかのドキュメントバージョン属性は、以下のドキュメントバージョン属性、又は、サブセット若しくは上位セットを含む：
・ドキュメントバージョンのサイズ（例えば、バイト）、
・ドキュメントバージョンの最新の修正日時、
・ドキュメントバージョンがクラウドデータストレージサービスから削除されたかどうかの情報、
・ドキュメントバージョンの利用可能なテキストコンテンツの全てが完全にトークン化されているかどうかの情報、
・ドキュメントバージョンがクラウドデータストレージサービスによって取得された日時を示すタイムスタンプ、
・ドキュメントバージョンから抽出されたトークンの数、
・ドキュメントバージョンのテキスト概要、
・ドキュメントバージョンのテキストダイジェスト、及び／又は、
・ドキュメントバージョンからのテキスト片。
【０１６５】
[0179]インデクサードキュメントテーブル６２０のスキーマはドキュメントテーブル６１０と同様であってもよい。いくつかの実施形態において、インデクサードキュメントテーブル６２０の行の行キー（例えば、６２１）は、ドキュメントネームスペースのグループ識別子と、ドキュメント識別子を含むが、ドキュメントバージョン識別子を含まない。それらの実施形態において、インデクサードキュメントテーブル６２０の各行は、以下でより詳細に説明するように、インデクサー３２３によって処理されたドキュメントの最後の（最新の）バージョンに対応してもよい。
【０１６６】
[0180]図６の例において、例示の行キー６１１及び６２１が提供される。明示的な例を提供するために、例示の行キー６１１及び６２１は、“ａｂｃｄ”のドキュメントネームスペースのグループ識別子及び“ｄ２”のドキュメント識別子を含む。しかしながら、いくつかの実施形態において、ドキュメントネームスペースのグループ識別子は、ドキュメントネームスペースのグループを固有に識別する６４ビットの固定長の値であり、ドキュメント識別子は、ドキュメントを固有に識別する６４ビットの固定長の値である。いくつかの実施形態において、ドキュメントバージョン識別子は、ドキュメントバージョンを個別に識別し、他のドキュメントバージョンに関してバージョンの順序付けを提供する。例えば、ドキュメントの３つのバージョンにおけるドキュメントバージョン識別子は、それぞれ値”１”、”２”、及び”３”であってもよい。
【０１６７】
[0181]前述したように、インデクサー３２３は、ドキュメントインデクサー３２８のインデクサーデータベースファイル３５１を生成することによってドキュメントインデクサー３２８を構築することと、かつ、ドキュメント３４０が作成、修正、又は削除されると、ドキュメントインデックス３２８へのインデックス変更情報３５２を生成することとの両方を行うことができる。
【０１６８】
[0182]いくつかの実施形態によれば、インデクサー３２３は、複数のパーティション（共有）を含む分散されたドキュメントネームスペースの区分されたインデックスを構築する。各シャードは、サービングシステム３２５の対応するインデックスサーバ上に格納されてもよい。ドキュメントネームスペースは、対応するインデックスシャードに割り当てられる。対応するインデックスシャードは、ドキュメントネームスペースに属するドキュメントにインデックスを付与する。複数のドキュメントネームスペースが、同一のインデックスシャードに割り当てられてもよい。
【０１６９】
[0183]いくつかの実施形態において、ドキュメントネームスペースは、ドキュメントネームスペースのドキュメントネームスペースグループに属する。それらの実施形態において、ドキュメントネームスペースグループにおけるドキュメントネームスペースの全てを含むドキュメントネームスペースグループは、対応するインデックスシャードに割り当てられる。対応するインデックスシャードは、ドキュメントネームスペースグループのドキュメントネームスペースに属するドキュメントにインデックスを付与する。複数のドキュメントネームスペースグループが、同一のインデックスシャードに割り当てられてもよい。
【０１７０】
[0184]いくつかの実施形態によれば、インデクサー３２３は、ドキュメントの大きな集合（例えば、数十億のドキュメント）についてドキュメントインデックス３２８を構築できるように指定される。例示の実施形態において、ドキュメントインデックス３２８は、ドキュメントインデックス３２８の約２百（２００）のインデックスシャードの１つに割り当てられる１万６千（１６，０００）のドキュメントネームスペースグループに属する４億（４００，０００，０００）を超えるドキュメントネームスペースのドキュメントにインデックスを付与する。
【０１７１】
[0185]いくつかの実施形態におけるインデクサー３２３は、トークン格納部３２４の情報からドキュメントネームスペースの区分されたインデックスを構築するために分散コンピューティングにおけるＭａｐＲｅｄｕｃｅの一般構造を適用する。ＭａｐＲｅｄｕｃｅ上の多くの情報は、J. Dean及びS. Ghemawat著の, “MapReduce: Simplified Data Processing on Large Clusters”, Google, Inc., 2004での掲載で見つけられうる。
【０１７２】
[0186]ＭａｐＲｅｄｕｃｅは、広く利用可能なハードウェアコンポーネント（例えば、プロセッサ、メモリ、ディスク）から組み立てられる商品サーバコンピュータ（ノード）のコンピュータクラスタ用に設計される。クラスタは、通常、個人の作業ノードへタスクを割り当てる処理を管理するマスタノードを含む。
＜バルクインデクサー＞
[0187]いくつかの実施形態によれば、種々のMapReduceフェーズ７２０は、図７に示すように、ドキュメントインデックス３２８を構築するためにインデクサー３２３によって実現される。入力データは、ドキュメントテーブル６１０からの行の集合を含む。入力集合は、K個の行グループ（例えば、７１０Ａ、７１０Ｂ、７１０C、．．．７１０N）へ分割される。K個は、種々の要因に基づいて選択されうる。例えば、Kは、マスタノードが作業ノードから均等にかつ効率的にMapReduceタスクを分散できることを保証するように選択されうる。いくつかの実施形態において、Kは、インデックス７３０を構築するドキュメントネームスペースのグループの数に等しい。
【０１７３】
[0188]いくつかの実施形態において、行グループ（例えば、７１０Ｂ）は、特定のドキュメントネームスペースのグループに属する全てのドキュメントの最新のバージョンについてのドキュメントテーブル６１０からの行を含む。ドキュメントの最新のバージョンは、ドキュメントの最新バージョンにおける行の”メタデータ”列ファミリーの”リビジョン”列の値によってドキュメントテーブル６１０で特定されうる。例えば、最新バージョンは、ドキュメントネームスペースのグループのドキュメントの全ての行の中で”リビジョン”列における最高値を有してもよい。
【０１７４】
[0189]いくつかの実施形態において、MapReduceフェーズ７２０の出力は、K個のドキュメントネームスペースのグループインデックス７３０を含み、ここで、Kはインデックス７３０を構築するドキュメントネームスペースのグループの数に等しい。いくつかの実施形態において、ドキュメントネームスペースのグループインデックス（例えば、７３１Ａ）は、”フルテキスト”のインデックスデータベースファイル３５１を含んでもよい。フルテキストのインデックスデータベースファイル３５１は、対応するキーによってソートされる一連のエントリを格納してもよい。いくつかの実施形態において、各キーはインデックスタームを含み、キーに対応するエントリは登録リストを含む。登録リストは、例えば登録リストで特定されるドキュメントについてのドキュメントターム属性などの可能性のある種々の他の情報とともに、インデックスタームが現れるドキュメントネームスペースのグループのドキュメントにおけるドキュメント識別子のリストを含んでもよい。
【０１７５】
[0190]いくつかの実施形態において、フルテキストのインデックスデータベースファイル３５１のサイズを低減するために、フルテキストのインデックスデータベースファイル３５１の登録リストは、実際のドキュメント識別子の代わりにローカルな範囲でのドキュメント識別子を格納する。ローカルな範囲でのドキュメント識別子は、ローカル範囲内のドキュメントを一意的に識別する。ローカル範囲は、例えば１つのドキュメントネームスペースのグループ又は１つのインデックスシャードに対応してもよい。一方、実際のドキュメント識別子は、より大きな範囲内のドキュメントを一意的に識別してもよい。より大きな範囲は、例えば全てのドキュメントネームスペースのグループ又は全てのインデックスシャードに対応してもよい。縮小した範囲のために、ドキュメントのローカル範囲のドキュメント識別子は、ドキュメントの実際のドキュメント識別子よりも、格納するのにより少ないバイトを必要とし、これにより、フルテキストのインデックスデータベースファイル３５１のサイズを低減することができる。ドキュメントネームスペースのグループインデックス（例えば、７３１Ａ）は、ローカルの範囲でのドキュメント識別子から実際のドキュメント識別子に変換するためのキーバリューマッピングを含んでもよい。
【０１７６】
[0191]いくつかの実施形態において、フルテキストのインデックスデータベースファイル３５１の登録リスト内のドキュメントのドキュメント識別子は、当該ドキュメントが属するドキュメントネームスペースのドキュメントネームスペース識別子に関連付けられる。いくつかの実施形態において、ドキュメントネームスペース識別子は、例えば＜ドキュメントネームスペース識別子＞：＜ドキュメント識別子＞などの登録リスト内のドキュメント識別子のプレフィックスであり、＜ドキュメントネームスペース識別子＞はドキュメントネームスペースのローカルな範囲の識別子、又は、より大きな範囲の識別子であり、コロン文字（”：”）はドキュメント識別子からドキュメントネームスペース識別子のプレフィックスを区別するために使用され、＜ドキュメント識別子＞はドキュメントのローカルな範囲の識別子、又はより大きな範囲の識別子である。ドキュメントネームスペースのグループインデックス（例えば、７３１Ａ）は、ローカルの範囲でのドキュメントネームスペース識別子から実際のドキュメントネームスペース識別子に変換するためのキーバリューマッピングを含んでもよい。
【０１７７】
[0192]いくつかの実施形態において、ドキュメント識別子をドキュメントネームスペース識別子の前に付ける代わりに、フルテキストのインデックスデータベースファイル３５１の登録リスト内のドキュメントのドキュメント識別子は、キーバリューマッピングのドキュメントネームスペース識別子に関連付けられる。例えば、ドキュメントネームスペースのグループインデックス（例えば、７３１Ａ）は、所定のドキュメントが属するドキュメントネームスペースのドキュメントネームスペース識別子にドキュメントの所定のドキュメント識別子を変換するためのキーバリューマッピングを含んでもよい。
【０１７８】
[0193]いくつかの実施形態において、ドキュメントネームスペースのグループインデックス（例えば、７３１Ａ）は、”コンプリーション”のインデックスデータベースファイル３５１を含んでもよい。コンプリーションインデックスデータベースファイル３５１は、フルテキストインデックスデータベースファイル３５１と同様のものであってもよい。しかしながら、コンプリーションデータベースファイル３５１のインデックスタームは、当該インデックスタームが現れるドキュメントを含むドキュメントネームスペースのドキュメントネームスペース識別子の前に付けられてもよい。このようにすることで、コンプリーションインデックスデータベースファイル３５１のエントリに対するコンプリーション検索クエリのキーワードについてのインデックス検索スペースはドキュメントネームスペースに制限されうる。
【０１７９】
[0194]いくつかの実施形態において、MapReduceフェーズ７２０は、インデックスデータベースファイル３５１を含み、サービングシステム３２５のインデックスサーバによる取り出し（ダウンロード）に利用可能な分散型ファイルシステムに、インデックス７３０を格納する。
【０１８０】
[0195]本発明の実施形態は、ドキュメント３４０が静的であることを想定していない。代わりに、本発明の実施形態は、ときには既存のドキュメント３４０が修正されうること、新たなドキュメント３４０が作成されること、及び／又は、既存のドキュメント３４０が削除されることを認識している。そのようなイベントは、既存のインデックスタームについてのドキュメントインデックス３２８の登録がアップデートされる必要があること、及び／又は、対応する登録を有する新たなインデックスタームがドキュメントインデックス３２８へ追加されることを意味してもよい。言い換えれば、ドキュメント３４０が変更されると（即ち、新たなドキュメントが追加され、或いは、既存のドキュメントが修正されるか又は削除される）、ドキュメントインデックス３２８は更新する必要があってもよい。
【０１８１】
[0196]いくつかの実施形態において、ドキュメントネームスペースのグループ識別子（例えば、７３１Ａ）は、ドキュメントネームスペースグループのドキュメントネームスペースに属する全てのドキュメントについて上述したバルクインデックス化技術に従って、ドキュメントネームスペースグループ全体を定期的に再構成することによって更新される。例えば、ドキュメントネームスペースグループインデックス（例えば、７３１Ａ）は、１日に１回、又は他の一定間隔で全体的に再構成されてもよい。再構成の前後でドキュメントネームスペースグループによって包含されるドキュメントへの変更の数が小さく、かつ、変更を検索可能にする再構成間隔の最大長の時間遅延が許容範囲である場合に、定期的な再構成のソリューションが受け入れ可能となってもよい。しかしながら、変更が行われるとすぐに、ドキュメント３４０への変更を検索可能にすることが多くのケースで望ましいであろう。例えば、変更を検索するために１日又はそれ以上の待機時間を有することとは対照的に、ドキュメント３４０が変更された後の数分以内に新たなドキュメント３４０及び修正ドキュメント３４０を検索することができると、ユーザは評価するであろう。
【０１８２】
[0197]いくつかの実施形態において、ドキュメントへの変更を素早く検索可能にすることは、ドキュメントネームスペースグループインデックス（例えば、７３１Ａ）あたり２つのインデックスを維持するサービングシステム３２５のインデックスサーバに影響を与える。２つのインデックスの一方は、ドキュメントネームスペースグループインデックスのメインインデックスであり、ここではドキュメントネームスペースグループインデックスの”基本インデックス”として参照され、２つのインデックスの他方は、現在の基本インデックスへ変更のみを格納し、ここではドキュメントネームスペースグループインデックスの”差分インデックス”として参照される。いくつかの実施形態において、インデックスサーバは、インデクサー３２３から受信されるインデックス変更情報３５２に基づいて差分インデックスを更新する。
【０１８３】
[0198]いくつかの実施形態において、基本インデックスは、インデックス変更情報３５２でインデックスサーバによって直接更新されないという意味で不変のものとして取り扱われる。代わりに、差分インデックスのみがインデックス変更情報３５２で更新される。差分インデックスは、当該差分インデックスがディスク又は他の不揮発性のストレージデバイスに格納される場合よりもインデックス変更情報３５２でより効率的に更新されうるインデックスサーバのメモリ（例えば、ＲＡＭ）に格納されてもよい。クエリがインデックサーバで受信されると、インデックスサーバにおけるクエリプロセッサ３２７は、差分インデックス及び基本インデックスの両方に対してクエリを実行してもよく、それらの結果をマージしてもよい。
【０１８４】
[0199]いくつかの実施形態において、インデックス変更情報３５２からの更新により差分インデックスが非常に大きくなることを避けるために、差分インデックス及び基本インデックスは、上述したバルクインデックス化技術に従って生成された最新の基本インデックスを定期的に破棄し、新たなものに置き換えられる。新たな差分インデックスは、その後、次のインデックス変更情報３５２に基づいて新たな基本インデックスに関連して生成されてもよい。
＜差分インデックス及び基本インデックス＞
[0200]サービングシステム３２５のインデックスサーバにおいて、ドキュメントネームスペースグループインデックス（例えば、７３１Ａ）のいくつかの実施形態における可能性のあるライフサイクルを図８に示す。
【０１８５】
[0201]時間Ｔ０において、基本インデックスの初期バージョン８０２Ａがインデックスサーバに格納される。基本インデックス８０２Ａは、ドキュメントネームスペースグループに属するドキュメントネームスペースのドキュメントの全ての中で最新のバージョンについてトークン格納部３２４のドキュメントテーブル６１０内のトークン（例えば、６１２）に基づいて時間Ｔ０より前に生成される１以上のインデックスデータベースファイル３５１を含んでもよい。
【０１８６】
[0202]その後、ドキュメントネームスペースグループのドキュメントへの１以上の変更が行われる。例えば、ユーザはグループ内のドキュメントネームスペースの1つに新たなドキュメントを追加してもよく、グループ内のドキュメントネームスペースの１つにある既存のドキュメントを編集してもよく、或いは、グループ内のドキュメントネームスペースの１つからドキュメントを取り除いてもよい。それらの変更は、１以上のインデックス変更情報３５２をインデックスサーバへ送信するインデクサー３２３にもたらされる。時間Ｔ０後の時間Ｔ１において、インデックスサーバは、受信したインデックス変更情報３５２を、ドキュメントの変更を反映するインデックスサーバにおいて、差分インデックス８０４を作成するために適用する。
【０１８７】
[0203]時間Ｔ１の前（例えば、時間Ｔ０）に、基本インデックス８０２Ａは、ドキュメントネームスペースグループに属するドキュメントネームスペースに対するクエリに回答するために、独立して使用されてもよい。時間Ｔ１後に、基本インデックス８０２Ａ及び差分インデックス８０４は、当該クエリへの回答を生成するためにマージされたインデックスのそれぞれからの結果とともにクエリに回答するために使用されうる。
【０１８８】
[0204]１以上の追加の変更は、ドキュメントネームスペースグループの複数のドキュメントに行われてもよい。追加の変更は、インデクサー３２３からインデックスサーバに送信される１以上の追加のインデックス変更情報３５２に反映されうる。時間Ｔ１後の時間Ｔ２において、インデックスサーバは、追加のインデックス変更情報３５２を、追加のドキュメントの変更を反映するインデックスサーバにおいて、差分インデックス８０４を更新するために適用する。時間Ｔ２後に、基本インデックス８０２Ａ及び更新した差分インデックス８０４は、当該クエリへの回答を生成するためにマージされたインデックスのそれぞれからの結果とともにクエリに回答するために使用されうる。
【０１８９】
[0205]時間Ｔ２後の時間Ｔ３において、基本インデックスの新たなバージョン８０２Ｂがインデックスサーバに格納される。新たな基本インデックス８０２Ｂは、インデックスサーバにおいて、現在の差分インデックス８０４及び現在の基本インデックス８０２Ａを置き換える。言い換えると、インデックスサーバは基本インデックス８０２Ａ及び差分インデックス８０４を破棄し、それを新たな基本インデックス８０２Ｂで置き換える。時間Ｔ３後において、インデックスサーバは、クエリに回答するために基本インデックス８０２Ｂを使用し、クエリへ回答するために、基本インデックス８０２Ａ及び差分インデックス８０４をもはや使用しない。基本インデックス８０２Ｂは、ドキュメントネームスペースグループに属するドキュメントネームスペースのドキュメントの全ての中で最新のバージョンについてトークン格納部３２４のドキュメントテーブル６１０内のトークン（例えば、６１２）に基づいて時間Ｔ３より前でかつ時間Ｔ０後に生成される１以上のインデックスデータベースファイル３５１を含んでもよい。
【０１９０】
[0206]ドキュメントネームスペースのグループインデックスについての基本インデックスの再構築は、多くの種々のイベントによって行われうる。例えば、基本インデックスは、定期的又は周期的な間隔（例えば、夜中に毎日）で再構築されてもよい。他の実施例として、ドキュメントネームスペースグループインデックスの現在の差分インデックスが所定閾値サイズ（例えば、いち（１）ギガバイト）に達する若しくは超えると、又は、現在の基本インデックサイズの所定の割合サイズ（例えば、２５パーセント（２５％））に達する若しくは超えると、基本インデックスが再構築されてもよい。他のイベントが基本インデックスの構築を開始してもよく、本発明は任意の特定のイベント又はイベントのセットに限定されない。
【０１９１】
[0207]ドキュメントネームスペースグループインデックスについての基本インデックスは構築又は再構築されると、所定の時点でのドキュメントネームスペースグループ内の全てのドキュメントへの全ての変更が反映されうる。例えば、基本インデックス８０２Ａは、時間Ｔ０より前の最新のドキュメントネームスペースインデックス７３１Ａのドキュメントネームスペースグループ内の全てのドキュメントへの全ての変更を反映してもよい。同様に、基本インデックス８０２Ｂは、時間Ｔ３より前でかつ時間Ｔ０より後の最新のドキュメントネームスペースインデックス７３１Ａのドキュメントネームスペースグループ内の全てのドキュメントへの全ての変更を反映してもよい。
【０１９２】
[0208]現在の差分インデックス及び現在の基本インデックスを新たな基本インデックスで置き換える周期は、基本インデックスと比較して相対的に小さい差分インデックスのメモリサイズを維持するように継続して繰り返されてもよく、これにより、ドキュメントネームスペースグループインデックスがインデックス変更情報３５２でインデックスサーバにおいてより効率的に（例えば、より素早く）更新されることを許容する。
＜インスタントインデクサー＞
[0209]次に、図９を参照して、本発明のいくつかの実施形態に係るドキュメントインデックス３２８へのインデックス変更情報３５２を生成するインデクサー３２３のブロック図について説明する。
【０１９３】
[0210]動作中において、ドキュメント３４０の新たなバージョンは、ビルドシステム３２１のトークナイザ３２２によって取得される。トークナイザ３２２は、ドキュメントへの変更を検知する他のシステム（不図示）に応じてドキュメント３４０の新たなバージョンを取得する。例えば、検知された変更は、ドキュメントの作成（即ち、ドキュメントの新たなバージョンがドキュメントの第１のバージョンである。）、或いは、ドキュメントの修正（即ち、ドキュメントの新たなバージョンがドキュメントの第２のバージョン又は次のバージョンである。）であってもよい。
【０１９４】
[0211]クラウドデータストレージサービスとの関連において、ドキュメントへの変更は、彼ら自身のエンドユーザコンピュータデバイス（例えば、３１１Ａ）に格納されたドキュメントのコピー（複製）上でユーザによって行われてもよい。例えば、ユーザは、ユーザのエンドユーザコンピューティングデバイスに格納されるワード処理ドキュメントを開き、ワード処理ドキュメントへ変更（例えば、編集）を行い、その後、ワード処理ドキュメントへの変更を保存してもよい。トークナイザ３２２は、変更（又はそれらの差分のエンコード）がユーザのエンドユーザコンピューティングデバイスからクラウドデータストレージサービスへ同期された（複製された）後に、当該変更の通知を受信してもよく、１以上のサーバにドキュメントのコピー（複製）を格納する。例えば、ユーザのエンドユーザコンピューティングデバイスで実行するソフトウェア同期化エージェントは、ワード処理ドキュメントへの変更を検知し、当該変更（又は、それらの差分のエンコード）をクラウドデータストレージサービスへ送信してもよい。
【０１９５】
[0212]ドキュメント３４０の新たなバージョンを取得すると、トークナイザ３２２は、ドキュメント３４０の新たなバージョンをトークン化し、結果としてドキュメント３４０の新たなバージョンについての複数トークンのセットを生成する。トークナイザ３２２は、トークン格納部３２４のドキュメントテーブル６１０に、ドキュメント３４０の新たなバージョンについての複数トークンのセットを格納する。
【０１９６】
[0213]トークン格納部３２４のドキュメントテーブル６１０に、ドキュメント３４０の新たなバージョンについての複数トークンのセットを格納することに加えて、トークナイザ３２２は、”変更ドキュメント”のメッセージを生成して、インスタントインデクサーサーバ９１０（又は、単に略して”インスタントインデクサー９１０”）へメッセージキュー９１５を介して送信する。いくつかの実施形態において、変更ドキュメントメッセージは、トークナイザ３２２がドキュメント３４０の新たなバージョンについてトークン格納部３２４に格納したドキュメントテーブル６１０の複数トークンのセットを特定するための、行キー（例えば、６１１）又は他の情報を含む。
【０１９７】
[0214]インスタントインデクサー９１０は、変更ドキュメントメッセージをメッセージキュー９１５の先頭から連続的に取り出し、変更ドキュメントメッセージを処理する。変更ドキュメントメッセージを処理するために、インスタントインデクサー９１０は、まず、ドキュメントの新たなバージョンが、新たなドキュメント（即ち、ドキュメントの第１のバージョン）又は修正したドキュメント（即ち、ドキュメントの第２又は次のバージョン）における変更ドキュメントメッセージにおいて特定されたかどうかを判定する。
【０１９８】
[0215]変更ドキュメントメッセージが新たなドキュメントについてのものである場合、インスタントインデクサー９１０は、トークナイザ３２２によってドキュメントの新たなバージョンについて格納されたトークン格納部３２４のドキュメントテーブル６１０から複数トークンのセットを読み出す。この複数トークンのセットは、新たなドキュメントにインデックスを付与するために使用される複数トークンのセットである。
【０１９９】
[0216]一方、変更ドキュメントメッセージが修正ドキュメントについてのものである場合、インスタントインデクサー９１０は、トークナイザ３２２によってドキュメントの新たなバージョンについて格納されたトークン格納部３２４のドキュメントテーブル６１０から複数トークンのセットを読み出し、インスタントインデクサー９１０によってドキュメントの現在のバージョンについて以前に格納されたトークン格納部３２４のインデクサードキュメントテーブル６２０から複数トークンのセットを読み出す。インスタントインデクサー９１０は、ドキュメントの新たなバージョンについての複数トークンのセットと、修正ドキュメントのバージョンについての複数トークンのセットとの間の差分を特定する。いくつかの実施形態によれば、インスタントインデクサー９１０は、ドキュメントの現在のバージョンについての複数トークンのセットにはない、ドキュメントの新たなバージョンについての複数トークンのセットにおいて”追加された”トークンを特定し、ドキュメントの新たなバージョンについての複数トークンのセットにはない、ドキュメントの現在のバージョンについての複数トークンのセットの”取り除かれた”トークンを特定する。任意のそのような特定した追加のトークンは修正ドキュメントにインデックスを付与するために使用されるトークンであり、任意のそのような特定された取り除かれたトークンは修正ドキュメントにインデックスを付与するためにもはや使用されないトークンである。
【０２００】
[0217]変更ドキュメントメッセージが新たなドキュメント又は修正ドキュメントについてのものであろうとなかろうと、インスタントインデクサー９１０はその後、インデックス変更情報ジャーナルエントリ（例えば、９３１Ａ）を、変更ドキュメントについてのインデックス変更情報ジャーナル９３０に追加する。変更ドキュメントについてのインデックス変更情報ジャーナルエントリは、インスタントインデクサー９１０によって判定されたジャーナルタイムスタンプ９３２と、変更ドキュメントについてインスタントインデクサー９１０によって生成されたインデックス変更情報３５２とを含む。
【０２０１】
[0218]変更ドキュメントについて判定されたジャーナルタイムスタンプ９３２は、一般的には、ドキュメントが変更された際の日付と時間とを反映する。より詳細には、ジャーナルタイムスタンプ９３２は、ドキュメントが変更された時間と、当該ドキュメントについてのインデックス変更情報ジャーナルエントリがインデックス変更情報ジャーナル９３０に追加された時間との間の任意の時間を反映してもよい。例えば、ジャーナルタイムスタンプ９３２は、ドキュメントが変更された時間と、トークナイザ３２２がドキュメントの新たなバージョンをトークン化した時間、トークナイザ３２２がドキュメントの新たなバージョンについての複数トークンのセットをトークン格納部３２４に格納した時間、トークナイザ３２２が変更ドキュメントについての変更ドキュメントメッセージを、メッセージキュー９１５へ追加した時間、インスタントインデクサー９１０がメッセージキュー９１５から変更ドキュメントについての変更ドキュメントメッセージを取り出した時間、インスタントインデクサー９１０が変更ドキュメントについてのインデックス変更情報３５２を生成した時間、インスタントインデクサー９１０が変更ドキュメントについてのインデックス変更情報ジャーナルエントリをインデックス変更情報ジャーナルへ追加した時間、或いは、ドキュメントが変更された時間と変更ドキュメントについてのインデックス変更情報ジャーナルエントリがインデックス変更情報ジャーナル９３０に追加された時間との間の任意の他の時間を反映してもよい。
【０２０２】
[0219]いくつかのケースにおいて、インスタントインデクサー９１０は、インスタントインデクサー９１０のシステムクロックから変更ドキュメントについてのジャーナルタイムスタンプ９３２を判定してもよい。例えば、インスタントインデクサー９１０は、変更ドキュメントについてのインデックス変更情報ジャーナルエントリをインデックス変更情報ジャーナル９３０に追加する直前に、システムクロックの現在値を判定してもよい。システムクロックの判定した現在値は、インデックス変更情報ジャーナルエントリにおいてジャーナルタイムスタンプ９３２として使用されうる。いくつかのケースにおいて、システムクロック値は、ジャーナルタイムスタンプ９３２として格納する前に特定の時間ゾーン（例えば、ＵＴＣ±０）に正規化され、これにより、システムクロックからの値に基づいて判定されたジャーナルタイムスタンプ９３２は、システムクロックの特定の時間ゾーンについて構成する必要なく直接比較可能となる。
【０２０３】
[0220]いくつかのケースにおいて、インスタントインデクサー９１０は、メッセージキュー９１５から取り出した変更ドキュメントにおける変更ドキュメントメッセージにおいて、タイムスタンプから変更ドキュメントについてのジャーナルタイムスタンプ９３２を判定してもよい。例えば、変更ドキュメントメッセージのタイムスタンプは、ドキュメントが変更された時間を反映してもよい。変更ドキュメントメッセージのタイムスタンプは、変更ドキュメントについてのインデックス変更情報ジャーナルエントリのジャーナルタイムスタンプ９３２として使用されてもよい。いくつかのケースにおいて、タイムスタンプは、ジャーナルタイムスタンプ９３２として格納する前に、特定のタイムゾーン（例えば、ＵＴＣ±０）に正規化されてもよい。
【０２０４】
[0221]変更ドキュメントについて生成されたインデックス変更情報３５２は、ドキュメントネームスペースのグループ識別子、ドキュメントネームスペース識別子、ドキュメント識別子、変更ドキュメントにインデックスを付与するために使用する複数トークンのリスト、及び／又は、変更ドキュメントにインデックスを付与するためにもはや使用しない複数トークンのリストを含む、種々の情報を含んでもよい。ドキュメント識別子は、変更ドキュメントを識別してもよい。ドキュメントネームスペース識別子は、変更ドキュメントが属するドキュメントネームスペースを識別してもよい。ドキュメントネームスペースのグループ識別子は、ドキュメントネームスペースが属するドキュメントネームスペースのグループを識別してもよい。
【０２０５】
[0222]サービングシステム３２５のインデックスサーバ４３０は、ドキュメントインデックス３２８を格納する。ドキュメントインデックス３２８は、各インデックスサーバ（例えば、４３０Ｂ）がドキュメントインデックス３２８のシャード（例えば、３２８Ｂ）を格納するように、複数のインデックスサーバ４３０にわたって共有されてもよい。各インデックスサーバ（例えば、４３０Ａ）はまた、機能的に、クエリプロセッサ３２７と同等のものを備えてもよい。
【０２０６】
[0223]ドキュメントインデックス３２８の各シャード（例えば、３２８Ｂ）は、１以上のドキュメントネームスペースグループのインデックス（例えば、７３１Ａ）を備えてもよい。それぞれのそのようなドキュメントネームスペースグループのインデックスは、上述したように、基本インデックスと差分インデックスとを含んでもよい。
【０２０７】
[0224]インデックスサーバ（例えば、４３０Ａ）は、当該インデックスサーバにおける新たなインデックス変更情報３５２についてインデックス変更情報サーバ９２０に周期的にポーリング（例えば、ネットワーク要求を送信する）してもよい。いくつかの実施形態において、インデックスサーバ（例えば、４３０Ａ）は、新たなインデックス変更情報３５２について５秒から１０秒に１回、インデックス変更情報サーバ９２０にポーリングする。しかしながら、５秒より短くかつ１０秒より長いポーリング間隔を含む、他のポーリング間隔も可能である。
【０２０８】
[0225]インデックス変更情報サーバ９２０にポーリングすると、インデックスサーバ（例えば、４３０Ｂ）は、ドキュメントネームスペースグループのドキュメントネームスペースの１以上のグループ識別子のリストを提供し、また、高ウォーターマークのタイムスタンプを提供する。インデックスサーバの高ウォーターマークのタイムスタンプは、インデックスサーバでのシャード（例えば、３２８Ｂ）がインデックス変更情報ジャーナル９３０のインデックス変更情報に関して最新となる時間を表す。いくつかの実施形態において、高ウォーターマークのタイムスタンプは、特定のタイムゾーン（例えば、UTC±０）に正規化され、これにより、インデックス変更情報ジャーナル９３０のジャーナルタイムスタンプ９３２が直接比較可能となる。
【０２０９】
[0226]インデックスサーバからのポーリング要求を受信することに応じて、インデックス変更情報サーバ９２０は、インデックスサーバの高ウォーターマークのタイムスタンプよりも新しい（より最近の）ジャーナルスタンプ９３２を有し、インデックスサーバからのポーリング要求で特定されるドキュメントネームスペースのグループ識別子を含む、任意の一致するインデックス変更情報ジャーナルエントリ（例えば、９３１Ａ）についてのインデックス変更情報ジャーナル９３０を読み出す。全てのそのような一致するインデックス変更情報ジャーナルエントリのインデックス変更情報３５２は、応答としてインデックスサーバに送信される。
【０２１０】
[0227]インデックスサーバ（例えば、４３０Ｂ）は、インデックス変更情報サーバ９２０から受信したインデックス変更情報３５２を、インデックスサーバでの差分インデックスに適用してもよい。特に、ドキュメントネームスペースのグループ識別子及びドキュメント識別子を特定し、かつ、ドキュメントにインデックスを付与するために使用する複数トークンのリスト及び／又はドキュメントにインデックスを付与するためにもはや使用されない複数トークンのリストを特定する所定のインデックス変更情報３５２に関して、インデックスサーバは、当該インデックス変更情報３５２をドキュメントネームスペースグループについての差分インデックスに適用する。
【０２１１】
[0228]いくつかの実施形態において、ドキュメントにインデックスを付与するために使用される複数トークンのリストの各トークンに関して、まだ差分インデックスのインデックスキーがなければ、当該トークンは差分インデックスのインデックスキーとして追加され、まだ登録リストになければ、ドキュメント識別子がインデックスキーについての差分インデックスの登録リストに追加される。ドキュメント識別子が既に登録リストにあるものの、登録リストから削除されるように当該登録リストにマークされていれば、その後、ドキュメント識別子はマークが外される（即ち、登録リストから削除するようにマークされない）。
【０２１２】
[0229]いくつかの実施形態において、ドキュメントにインデックスを付与するためにもはや使用されない複数トークンのリストの各トークンに関して、まだ差分インデックスのインデックスキーがなければ、当該トークンは差分インデックスのインデックスキーとして追加され、ドキュメント識別子がインデックスキーについての差分インデックスの登録リストに追加され、ドキュメント識別子が、まだ登録リストになければ、登録リストから削除するように登録リストにマークが付けられる。ドキュメント識別子が既に登録リストにあるものの、登録リストに削除されるようにマークされていれば、その後、ドキュメント識別子は登録リストから削除されるように登録リストにマークされる。
【０２１３】
[0230]登録リストのドキュメント識別子は、例えば、登録リストで識別される各ドキュメントについてのビットを含む登録リストあたりの削除ビットベクトルを含む、いくつかの異なる可能性のある追跡手法の１つを用いて、削除されるように、又は、削除されないようにマークされてもよい。２つのビット値の１つが対応するドキュメントに対応するインデックスタームによってインデックが付与されることを示すように使用され、２つのビット値のもう１つが対応するドキュメントに対応するインデックスタームによってもうインデックスが付与されないことを示すように使用される。
【０２１４】
[0231]差分インデックスと基本インデックスとを含むドキュメントネームスペースのグループインデックスに対するクエリを処理する際に、クエリプロセッサ３２７は、差分インデックス及び基本インデックスの両方からクエリキーワードについての登録リストを取り出し、取り出した登録リストをマージする。クエリプロセッサ３２７はその後、クエリ回答からマージされた登録リストに削除されるようにマークされたドキュメントを除去してもよい。
【０２１５】
[0232]インデックスサーバ（例えば、４３０Ａ）がポーリングリクエストに応じてインデックス変更情報サーバ９２０から受信したインデックス変更情報を提供した後に、インデックスサーバは、インデックスサーバのシャード（例えば、３２８Ａ）が適用されたインデックス変更情報３５２に関して最新となるように反映するために、インデックスサーバの高ウォーターマークのタイムスタンプを更新する。例えば、新たな高ウォーターマークのタイムスタンプ値は、ポーリング要求に応じて適用された全てのインデックス変更情報３５２の最新の（より最近の）ジャーナルスタンプ３５２に設定されてもよい。これを容易にするために、インデックス変更情報９２０は、インデックスサーバからのポーリングリクエストに返答する際に、対応するインデックス変更情報３５２とともに、ジャーナルタイムスタンプ９３２を提供してもよい。
【０２１６】
[0233]いくつかの実施形態において、インデックス変更情報ジャーナル９３０は、追記専用の分散型コミットログ（commit log）として実装される。そうすることによって、インスタントインデクサー９１０がインデックス変更情報ジャーナルエントリ（例えば、９３１Ａ）をジャーナル９３０に書き込む際に、ディスク探索が軽減されうる。
【０２１７】
[0234]以降の説明は、プロセッサの制御下でデバイスの動作を行わせる、コンピュータで実行可能な命令を用いて実施されうる方法のステップを示す。コンピュータで実行可能な命令は、ＣＤ、ＤＶＤ、フラッシュメモリ等のコンピュータで読み取り可能な記録媒体に格納されうる。コンピュータで実行可能な命令はまた、例えば、インターネット上の記憶場所（例えば、ウェブサーバ）からダウンロード及びインストールするための、ダウンロード可能で、コンピュータで実行可能な命令のトークンのセットとして格納されうる。
【０２１８】
[0235]方法のステップに対する所定の順序が図及び以降の説明から暗示され得る一方で、文脈が明確に示さない限り、当該方法のステップは示され且つ／又は説明されたものとは異なる順序で実行されうることが理解されるだろう。更に、文脈が明確に示さない限り、方法のステップは、互いに並行して（同時に）実行されうる。
【０２１９】
＜インスタントインデクサーの例示の動作＞
[0236]インスタントインデクサー６１０の例示の動作を説明するために、以下では、図９、図１０Ａ、図１０Ｂ、図１１Ａ、及び図１１Ｂを参照して説明する。図１０Ａ及び図１０Ｂは、本発明のいくつかの実施形態に係る、インスタントインデクサー９１０における例示動作のフローチャートである。図１１Ａ及び図１１Ｂは、本発明のいくつかの実施形態に係る、インスタントインデクサー９１０の例示動作中にトークン格納部３２４の可能性のある種々の状態を示す図である。
【０２２０】
[0237]ステップ１００２で、インスタントインデクサー９１０は、変更ドキュメントのバージョンについての情報を取得する。例えば、インスタントインデクサー９１０は、メッセージキュー９１５から取り出した変更ドキュメントメッセージの情報を取得してもよい。当該情報は、変更ドキュメントのドキュメント識別子と、変更ドキュメントを含むドキュメントネームスペースが属するドキュメントネームスペースグループのドキュメントネームスペースのグループ識別子と、変更ドキュメントのバージョンにおけるドキュメントバージョン識別子とを含んでもよい。例えば、一実施例を説明するためのステップ１００２を想定すると、インスタントインデクサー６１０は、”ａｂｃｄ”のドキュメントネームスペースのグループ識別子と、”ｄ２”のドキュメント識別子と、”２”のドキュメントバージョン識別子を取得する。いくつかの実施形態において、当該情報は、ドキュメントネームスペースのグループ識別子に追加して、又は、代わりに、ドキュメントネームスペース識別子を含む。
【０２２１】
[0238]ステップ１００４で、インスタントインデクサー９１０は、１つが利用可能であれば、インデクサードキュメントテーブル４２０から変更ドキュメントの現在バージョンを取り出す。例えば、図１１Ａは、インデクサードキュメントテーブル６２０の変更ドキュメント”ｄ２”の現在バージョンが、行キー”ａｂｃｄ：ｄ２”によってキーが付与された行の”メタデータ”の列ファミリにおいて”リビジョン”列の値によって示されるように、”１”であることを示す。
【０２２２】
[0239]ステップ１００６で、インスタントインデクサー９１０は、変更ドキュメントのバージョンが新たなドキュメントであるかどうかを判定する。いくつかの実施形態において、インスタントインデクサー９１０は、は、変更ドキュメントの現在のバージョンがステップ１００４で利用可能であったかどうかを判定することによって、当該判定を行う。ステップ１００４で変更ドキュメントの現在のバージョンがインデクサードキュメント４２０で利用可能でなかった場合には、その後、変更ドキュメントのバージョンが新たなドキュメントであると見なされる。さもなければ、変更ドキュメントのバージョンが修正ドキュメントであると見なされる。例えば、変更ドキュメント”ｄ２”の現在のバージョンが図１１Ａのインデクサードキュメント６２０で示されるように利用可能であるため、インスタントインデクサー９１０は、変更ドキュメント”ｄ２”のバージョン”２”が新たなドキュメントでないとステップ１００６で判定するであろう。
【０２２３】
[0240]しかしながら、変更ドキュメントのバージョンが新たなドキュメントであれば、その後、ステップ１００８で、インスタントインデクサー９１０は、トークン格納部３２４のドキュメントテーブル６２０から新たなドキュメントについての複数トークンのセットを取得する。新たなドキュメントについての複数トークンのセットを取り出すために、インスタントインデクサー６１０は、ドキュメントネームスペースのグループ識別子を含む行キーによってキーが付与されたドキュメントテーブル９１０の行から複数トークンのセットを取り出すことができる。
【０２２４】
[0241]また、変更ドキュメントのバージョンが新たなドキュメントであれば、その後、ステップ１０１０において、インスタントインデクサー９１０は、新たなドキュメントについてのステップ１００８で取り出した複数トークンのセットを含むインデックス変更情報３５２を生成する。複数トークンのセットは、ドキュメントにインデックス付与するために使用するトークンとして生成したインデックス変更情報３５２の中で指定されてもよい。生成したインデックス変更情報３５２はまた、例えば、ステップ１００２で取得された、ドキュメント識別子、ドキュメントネームスペース識別子、及び／又はドキュメントネームスペースのグループ識別子などに関連する、ドキュメント、ドキュメントネームスペース、及び／又はドキュメントネームスペースのグループを特定する情報を含んでもよい。追加的に、インスタントインデクサー９１０は、ジャーナルタイムスタンプ９３２を決定し、インデックス変更情報３５２及びジャーナルタイムスタンプ９３２を含むジャーナル９３０に、新たなドキュメントについてのジャーナルエントリ（例えば、９３１Ａ）を追加する。
【０２２５】
[0242]また、変更ドキュメントのバージョンが新たなドキュメントであれば、その後、ステップ１０１２で、新たなドキュメントについてステップ１００８で取り出した複数トークンのセットがインデクサードキュメントテーブル６２０に格納される。変更ドキュメントのバージョンが新たなバージョンであれば、新たなドキュメントについての新たな行が、ステップ１００２で取得したドキュメントグループ識別子とドキュメント識別子を含む行キーを有するインデクサードキュメントテーブル６２０に追加されうる。新たなドキュメントについてステップ１００８で取り出した複数トークンのセットを含むことに加えて、新たな行のメタデータの列ファミリの”リビジョン”列の値が新たなドキュメントの現在のバージョンに設定される。現在のバージョンは例えば”１”であってもよい。ドキュメントの現在のバージョンは、インスタントインデクサー９１０が処理した（例えば、インデックス変更情報３５２を生成した）ドキュメントの最新の（最近の）バージョンを表す。
【０２２６】
[0243]新たな行が新たなドキュメントについてインデクサードキュメントテーブル６２０に追加された後に、インスタントインデクサーによる変更ドキュメントのバージョンへの処理は、その後１０１４で終了してもよい。
【０２２７】
[0244]一方、ステップ１００６に戻り、ステップ１００６で変更ドキュメントのバージョンが新たなドキュメントであると判定されなければ、その後、変更ドキュメントのバージョンは、修正ドキュメントのバージョンであると見なされる。例えば、変更ドキュメント”ｄ２”の現在のバージョン”１”が図１１Ａのインデクサードキュメント６２０で示されるように利用可能であるため、インスタントインデクサー９１０は、変更ドキュメント”ｄ２”のバージョン”２”が修正ドキュメントのバージョンであるとステップ１００６で判定するであろう。
【０２２８】
[0245]ステップ１０１６で、インスタントインデクサー９１０は、修正ドキュメントのバージョンが修正ドキュメントの新たなバージョンであるかどうかを判定する。インスタントインデクサー９１０に修正ドキュメントのバージョンの不一致が通知された場合、修正ドキュメントのバージョンは修正ドキュメントの新たなバージョンでない可能性がある。例えば、インスタントインデクサー９１０は、ドキュメントの旧バージョンについて変更ドキュメントメッセージをメッセージキュー９１５から取り出して処理する前に、ドキュメントのより最近のバージョンについての変更ドキュメントメッセージをメッセージキュー９１５から取り出して処理してもよい。
【０２２９】
[0246]修正ドキュメントのバージョンが修正ドキュメントの新たなバージョンであるかどうかを判定するために、インスタントインデクサー９１０は、ステップ１００２で取得した修正ドキュメントのバージョンについてのドキュメントバージョン識別子を、ステップ１００４でインデクサードキュメントテーブル６２０から取得した修正ドキュメントの現在のバージョンと比較してもよい。ステップ１００２で取得したドキュメントバージョン識別子が現在バージョンより大きければ、その後、修正ドキュメントのバージョンは修正ドキュメントの新たなバージョンとなる。そうでない場合は、修正ドキュメントのバージョンは新たなバージョンではなく、変更ドキュメントのバージョンの処理を１０１８で終了してもよい。例えば、インスタントインデクサー９１０は、ドキュメント”ｄ２”のバージョン”２”がドキュメント”ｄ２”の現在のバージョン”１”よりも大きいため、ドキュメント”ｄ２”のバージョン”２”がドキュメント”ｄ２”の新たなバージョンであると判定してもよい。
【０２３０】
[0247]修正ドキュメントのバージョンが修正ドキュメントの新たなバージョンであれば、その後、ステップ１０２０で、インスタントインデクサー９１０は、修正ドキュメントの新たなバージョンについての複数トークンのセットを取得する。複数トークンのセットは、修正ドキュメントの新たなバージョンをトークン化した際にトークナイザ３２２によってそれらが格納されたトークン格納部３２４のドキュメントテーブル６２０から取得されうる。修正ドキュメントの新たなバージョンについての複数トークンのセットを取り出すために、インスタントインデクサー６１０は、ドキュメントネームスペースのグループ識別子を含む行キーによってキーが付与されたドキュメントテーブル６１０の行から複数トークンのセットを取り出すことができる。例えば、ドキュメント”ｄ２”のバージョン”２”についての複数トークンのセットは、図１１Ｂのドキュメントテーブル６１０の行キー”ａｂｃｄ：ｄ２：２”によってキーが付与された行に示すように、トークン”ｓｏｌｖｅｄ”、”ｔｈｒｅｅ”、及び”ｐｒｏｂｌｅｍｓ”を含む。
【０２３１】
[0248]ステップ１０２４で、インスタントインデクサー９１０は、修正ドキュメントの現在のバージョンについての複数トークンのセットを取得する。当該複数トークンのセットは、ステップ１００４で取得した修正ドキュメントの現在のバージョンと、ステップ１００２で取得したドキュメントネームスペースのグループ識別子及びドキュメント識別子とに基づいて、トークン格納部３２４のインデクサードキュメントテーブル６２０から取得されうる。例えば、ドキュメント”ｄ２”の現在のバージョン”1”についての複数トークンのセットは、図１１Ａのインデクサードキュメントテーブル６１０の行キー”ａｂｃｄ：ｄ２”によってキーが付与された行に示すように、トークン”ｓｏｌｖｅｄ”、”ｔｗｏ”、及び”ｐｒｏｂｌｅｍｓ”を含む。
【０２３２】
[0249]ステップ１０２６で、インスタントインデクサー９１０は、修正ドキュメントの現在のバージョンについての複数トークンのセットと、修正ドキュメントの新たなバージョンについての複数トークンのセットとの間の差分を特定する。特に、インスタントインデクサー９１０は、修正ドキュメントにインデックスを付与するために使用するトークンと、修正ドキュメントにインデックスを付与するためにもはや使用しないトークンとを特定する。修正ドキュメントにインデックスを付与するために使用するトークンは、修正ドキュメントの現在のバージョンについての複数トークンのセットにない、修正ドキュメントの新たなバージョンについての複数トークンのセットにあるトークンから特定されうる。修正ドキュメントにインデックスを付与するためにもはや使用しないトークンは、修正ドキュメントの新たなバージョンについての複数トークンのセットにない、修正ドキュメントの現在のバージョンについての複数トークンのセットにあるトークンから特定されうる。例えば、トークン”ｔｈｒｅｅ”は、図１１Ｂのドキュメントテーブル６１０に示すように、トークン”ｔｈｒｅｅ”がドキュメント”ｄ２”の新たなバージョン”２”についての複数トークンのセットにあるものの、図１１Ａのインデクサードキュメントテーブル６２０に示すように、ドキュメント”ｄ２”の現在のバージョン”１”についての複数トークンのセットにはないことにより、ドキュメント”ｄ２”にインデックスを付与するトークンとして特定されるであろう。また、トークン”ｔｗｏ”は、図１１Ａのインデクサードキュメントテーブル６２０に示すように、トークン”ｔｗｏ”がドキュメント”ｄ２”の現在のバージョン”１”についての複数トークンのセットにあるものの、図１１Ｂのドキュメントテーブル６１０に示すように、ドキュメント”ｄ２”の新たなバージョン”２”についての複数トークンのセットにはないため、ドキュメント”ｄ２”にインデックスを付与するためにもはや使用しないトークンとして特定されるであろう。
【０２３３】
[0250]ステップ１０２８で、インスタントインデクサー９１０は、修正ドキュメントにインデックスを付与するために使用する、ステップ１０２６で判定された任意のトークンと、修正ドキュメントにインデックスを付与するためにもはや使用しない、ステップ１０２６で判定された任意のトークンと、を含む修正ドキュメントの新たなバージョンについてのインデックス変更情報３５２を生成する。当該トークンは、インデックス変更情報３５２などにおいて指定されうる。生成したインデックス変更情報３５２はまた、例えば、ステップ１００２で取得された、ドキュメント識別子、ドキュメントネームスペース識別子、及び／又はドキュメントネームスペースのグループ識別子などに関連する、ドキュメント、ドキュメントネームスペース、及び／又はドキュメントネームスペースのグループを特定する情報を含んでもよい。追加的に、インスタントインデクサー９１０は、ジャーナルタイムスタンプ９３２を決定し、インデックス変更情報３５２及びジャーナルタイムスタンプ９３２を含むジャーナル９３０に、新たなドキュメントについてのジャーナルエントリ（例えば、９３１Ａ）を追加する。例えば、ドキュメント”ｄ２”の新たなバージョン”２”について生成されて格納されたインデックス変更情報３５２は、ドキュメント”ｄ２”にインデックスを付与するために使用するトークンとして指定した（例えば、ラベルで）トークン”ｔｈｒｅｅ”と、ドキュメント”ｄ２”にインデックスを付与するためにもはや使用しないトークンとして指定したトークン”ｔｗｏ”と、ドキュメントネームスペースのグループ識別子”ａｂｃｄ”と、ドキュメント識別子”ｄ２”とを含んでもよい。
【０２３４】
[0251]ステップ１０３０で、インスタントインデクサー９１０が修正ドキュメントの新たなバージョンについてのインデックス変更情報３５２を生成した後に、修正ドキュメントの新たなバージョンについてのステップ１０２０で取り出した複数トークンのセットはインデクサードキュメントテーブル６２０に格納される。そうすることで、修正ドキュメントの現在のバージョンについてのインデクサードキュメントテーブル６２０の行が、複数トークンのセットを含むように、かつ、修正ドキュメントの新たなバージョンに設定されたメタデータの列ファミリの”リビジョン”列についての新たな値を含むように修正されうる。この方法で行を修正することによって、新たなバージョンが修正ドキュメントの新たな現在のバージョンとなる。例えば、ドキュメント”ｄ２”の新たな現在のバージョンは、図１１Ｂのインデクサードキュメントテーブル６２０に示すように、ドキュメント”ｄ２”のバージョン”２”についてのインデックス変更情報を生成した後に、”２”となる。
【０２３５】
[0252]修正ドキュメントについての行が、複数トークンのセットを含む、新たな現在のバージョンを設定するようにインデクサードキュメントテーブル６２０において修正された後に、インスタントインデクサーによる変更ドキュメントのバージョンの処理がその後１０３２で終了しうる。
【０２３６】
＜インスタントインデックス化における処理＞
[0253]次に、図１２Ａ及び図１２Ｂを参照して、本発明のいくつかの実施形態に係る、インスタントインデックス化についてのマルチユーザ検索システムの１以上のサーバによって実行する処理のフローチャートについて説明する。
【０２３７】
[0254]ステップ１２０２で、サーバは、ここで説明するように、ドキュメントの現在のバージョンについての複数トークンのセットの格納を実行する。例えば、インスタントインデクサー９１０は、ドキュメントの現在のバージョンについての複数トークンのセットを含むように、トークン格納部３２４のインデクサードキュメントテーブル６２０においてドキュメントの現在のバージョンについての行を追加するか、又は、修正してもよい。例えば、図１１Ａのインデクサードキュメントテーブル６２０の行が、ドキュメント”ｄ２”の現在のバージョン”１”について追加されうる。例えば、図１１Ｂのインデクサードキュメントテーブル６２０の行が、ドキュメント”ｄ２”の現在のバージョン”２”について追加されうる。
【０２３８】
[0255]ステップ１２０４で、サーバは、ここで説明するように、ドキュメントの新たなバージョンをトークン化することと、ドキュメントの新たなバージョンについて複数トークンのセットを生成することとを実行する。例えば、トークナイザ３２２は、複数トークンのセット”ｓｏｌｖｅｄ”、”ｔｗｏ”、及び”ｐｒｏｂｌｅｍｓ”を生成するように、文字列”ｓｏｌｖｅｄ  ｔｗｏ  ｐｒｏｂｌｅｍｓ”を含むドキュメント”ｄ２”の新たなバージョン”２”をトークン化しうる。
【０２３９】
[0256]ステップ１２０６で、サーバは、ここで説明するように、ドキュメントの新たなバージョンについての複数トークンのセットと、ドキュメントの現在のバージョンについての複数トークンのセットとの間の差分の特定を実行する。例えば、インスタントインデクサー９１０は、ドキュメント”ｄ２”の新たなバージョン”２”についての複数トークンのセットのトークン”ｓｏｌｖｅｄ”、”ｔｈｒｅｅ”、及び”ｐｒｏｂｌｅｍｓ”と、ドキュメント”ｄ２”の現在のバージョン”１”についての複数トークンのセット”ｓｏｌｅｖｅｄ”、”ｔｗｏ”、及び”ｐｒｏｂｌｅｍｓ”との間の差分を特定しうる。
【０２４０】
[0257]ステップ１２０８で、サーバは、ここで説明するように、特定した差分に基づいて、ドキュメントにインデックスを付与するために使用するトークンの判定を実行する。当該判定を行うために、サーバは、ここで説明するように、ドキュメントの現在のバージョンについての複数トークンのセットにはなく、ドキュメントの新たなバージョンについての複数トークンのセットにあるトークンを特定する。例えば、インスタントインデクサー９１０は、ドキュメント”ｄ２”の現在のバージョン”１”についての複数トークンのセットのトークン”ｓｏｌｖｅｄ”、”ｔｗｏ”、及び”ｐｒｏｂｌｅｍｓ”にはなく、ドキュメント”ｄ２”の新たなバージョン”２”についての複数トークンのセット”ｓｏｌｅｖｅｄ”、”ｔｈｒｅｅ”、及び”ｐｒｏｂｌｅｍｓ”にあるトークンの特定に基づくことによって、ドキュメント”ｄ”２にインデックスを付与するためにトークン”ｔｈｒｅｅ”を特定しうる。
【０２４１】
[0258]ステップ１２１０で、サーバは、ここで説明するように、ドキュメントにインデックスを付与するために使用するトークンを含むインデックス変更情報の生成を実行する。例えば、インスタントインデクサー９１０は、ドキュメント”ｄ２”にインデックスを付与するためにトークン”ｔｈｒｅｅ”を含むインデックス変更情報３５２を生成してもよい。
【０２４２】
[0259]ステップ１２１２で、サーバは、ここで説明するように、タイムスタンプに関連した、生成したインデックス変更情報の格納を実行する。例えば、インスタントインデクサー９１０は、ドキュメント”ｄ２”にインデックスを付与するためにトークン”ｔｈｒｅｅ”を含む、生成したインデックス変更情報３５２を、ジャーナルタイムスタンプ９３２に関連してインデックス変更情報ジャーナル９３０に格納してもよい。
【０２４３】
[0260]ステップ１２１４で、サーバは、ここで説明するように、生成したインデックス変更情報に関連付けられたタイムスタンプがインデックサーバによって特定されたタイムスタンプよりも新しい場合には、インデックスサーバへ生成したインデックス変更情報の提供を実行する。例えば、生成したインデックス変更情報は、インデックスサーバからのインデックス変更情報についてのポーリング要求に応じてインデックサーバに提供されてもよい。ポーリング要求は、インデックスサーバについて上述したように高ウォーターマークのタイムスタンプを含んでもよい。生成したインデックス変更情報は、生成したインデックス変更情報に関連付けられたタイムスタンプが高ウォーターマークのタイムスタンプより新しい場合には、インデックスサーバへ提供されてもよい。ステップ１２１４に関し、特定したタイムスタンプより新しい関連付けられたタイムスタンプは、生成したインデックス変更情報をインデックスサーバへ提供するために必要ではあるが十分な条件ではない。例えば、生成したインデックス変更情報に関連付けられるタイムスタンプが特定したタイムスタンプより新しい場合であっても、インデックス変更情報は、インデックス変更情報が異なるインデックスサーバに対してのものであれば当該インデックスサーバには提供されないであろう。
【０２４４】
＜インスタントインデックス化のバイパス化＞
[0261]いくつかの状況において、同様の方法でドキュメントへの全ての変更にインデックスを付与することは効率的でないかもしれない。例えば、いくつかの状況において、ドキュメント３４０の大量のトークンのセットが短い時間（例えば、１秒当たり１万（１０，０００）のドキュメント３４０若しくはそれ以上又は１日当たり１０億のドキュメント３４０若しくはそれ以上）で処理するためにビルドシステム３２１へ提供される場合、インデックスサーバ４３０に対して、インデクサー３２３によって提供されるインスタントインデックス化機能にバイパスすることはより効果的であるかもしれない。この場合、インデックスサーバ４３０の揮発性メモリに格納された差分インデックスは、新たなインデックス変更情報についてのポーリングを行う際に、インデックス変更情報ジャーナル９３０からインデックスサーバ４３０へインデックス変更情報サーバ９２０によって提供される大量のインデックス変更情報３５２の結果として、非常に大きくなってしまう（例えば、数ギガバイト又はそれ以上）。最悪の場合、インデックスサーバ（例えば、４３０Ｂ）へ提供されるインデックス変更情報３５２の数が非常に大きくなり、インデックスサーバのキャッシュがクラッシュするか又は故障する可能性もある。
【０２４５】
[0262]いくつかの実施形態によれば、大量のドキュメントにインデックスを付与する際に、インスタントインデックス化機構にバイパスが付けられる。例えば、ユーザが、あるファイルシステムの位置からその他の位置へ、クラウドデータストレージサービスで同期化されたドキュメントの大量のトークンのセットを含む彼らのエンドユーザコンピューティングデバイスで、フォルダを移動する場合、当該移動により、ビルドシステム３２１が処理する大量のドキュメント変更が生じる可能性がある。例えば、ユーザによるフォルダの移動は、フォルダ内の各ドキュメントにおいて、”削除”のドキュメント変更と、”追加”のドキュメント変更とを引き起こす可能性がある。この場合、フォルダの移動の結果として生じるドキュメント変更について、ビルドシステム３２１のインスタントインデックス化機構にバイパスすることは、インデックスサーバの故障を避けることになりうる。例えば、バイパスすることはまた、例えばジオポテンシャルなどの新たな属性によってドキュメントの大量のトークンのセットにインデックスを再度付与するなど、大量に既存のドキュメントにインデックスを再度付与するのに有用となりうる。
【０２４６】
[0263]ドキュメントのトークンのセットについてインスタントインデックス化機構にバイパスする場合、ドキュメントはトークナイザ３２２によって処理され、抽出されたトークンはトークン格納部３２４に格納される。しかしながら、インスタントインデックス化機構にバイパスしていない”非バイパス”ドキュメントとは異なり、トークナイザ３２２がインスタントインデックス化機構にバイパスするように指定された”バイパス”ドキュメントの新たなバージョンを処理する場合、トークナイザ３２２は、バイパスがドキュメントバージョンについて有効化されたことをインスタントインデクサーサーバ９１０に通知してもよい。例えば、メッセージキュー９１５に追加される変更ドキュメントメッセージは、ドキュメントバージョンがバイパスドキュメントであることを示してもよい。そのような指標は、変更ドキュメントメッセージにおいて、指定されたデータフィールド又はフラグで作成されてもよい。ドキュメントバージョンがバイパスドキュメントバージョン又は非バイパスドキュメントバージョンであるかどうかの指定は、トークナイザ３２２へドキュメントとともに提供されうる。例えば、メタデータは、変更ドキュメントのバージョンがバイパスドキュメントバージョン又は非バイパスドキュメントバージョンであるかどうかを特定するように変更ドキュメントに添付してもよい。
【０２４７】
[0264]メッセージキュー９１５からバイパスドキュメントについての変更ドキュメントメッセージを取り出すと、インスタントインデクサー９１０が非バイパスドキュメントについての変更ドキュメントメッセージを取り出した際に当該インスタントインデクサー９１０が行うように、インスタントインデクサー９１０は、インデックス変更情報３５２を生成し、インデックス変更情報ジャーナル９３０に生成したインデックス変更情報３５２を格納してもよい。しかしながら、バイパスドキュメントへの変更について生成されたインデックス変更情報３５２は、バイパスとしてマークされてもよい。例えば、インデックス変更情報ジャーナルエントリ（例えば、９３１Ａ）は、当該エントリのインデックス変更情報３５２がバイパスドキュメントについてのものであることを示す、ビットフラグを有するか、又は、他のデータを含むことができる。インデックスサーバ（例えば、４３０Ａ）がインデックス変更情報サーバ９２０からの新たなインデックス変更情報３５２を要求すると、インデックス変更情報サーバ９２０は、バイパスとしてインデックス変更情報ジャーナル９３０にマークされた任意のインデックス変更情報３５２をインデックスサーバには送信しない。この方法において、インデックスサーバは、バイパスドキュメントについてインスタントインデクサー９１０によって生成されたインデックス変更情報３５２に圧倒されない。
【０２４８】
[0265]いくつかの実施形態において、バイパスとしてマークされたインデックス変更情報３５２は、インデックス変更情報ジャーナル９３０に格納される一方で、他の実施形態において、バイパスとしてマークされたインデックス変更情報３５２は、インデックス変更情報ジャーナル９３０に格納されない。例えば、インデックス変更情報ジャーナルは、非バイパスのインデックス変更情報３５２のみを格納してもよく、インスタントインデクサー９１０は、インデックス変更情報ジャーナル９３０のバイパスインデックス変更情報を格納することなく、バイパスとしてマークされたインデックス変更情報３５２を破棄してもよい。
【０２４９】
[0266]インスタントインデックス化機構はバイパスドキュメントに対してバイパスするため、バイパスドキュメントが属するドキュメントネームスペースのグループについて静的インデックスの次の構築が終わるまで、バイパスドキュメントへの変更には、ドキュメントインデックス３２８にインデックスが付与されない。
【０２５０】
[0267]バイパスドキュメントに静的インデックスでインデックスが付与されれば、バイパスドキュメントとしてはもう見なされず、非バイパスドキュメントとして見なされうる。つまり、ドキュメントへの次の変更はインスタントインデックス化機構によって処理され、ドキュメントネームスペースのグループについてのインデクサーサーバの差分インデックスへ適用するために、インデックス変更情報３５２がインデックスサーバ（例えば、４３０Ｂ）へ提供されうる。
【０２５１】
[0268]いくつかの実施形態において、そのような変更がインデックス変更情報３５２としてインデックスサーバ４３０に提供されなくとも、バイパスドキュメントへの変更をインスタントインデクサー９１０に通知することは依然として有用でありうる。インスタントインデクサー９１０がトークン格納部３２４に格納されたデータ上で種々の帳簿記入ステップを実行するために、これを行うことは依然として有用でありうる。例えば、インスタントインデクサー９１０は、トークン格納部３２４の古いドキュメントバージョンを削除するように構成されてもよい。しかしながら、トークナイザ３２２がバイパスドキュメントへの変更をインスタントインデクサー９１０に通知しない実装もまた可能である。
【０２５２】
[0269]ビルドシステム３２１にバイパス機構を含むことにより、ビルドシステム３２１は、他のドキュメントへの変更にインデックスを付与することの性能に重大に影響を与えることなく、大量のドキュメントのトークンのセットにインデックスを付与することができる。例えば、ビルドシステム３２１は、ユーザによって最近作成された”バイパス”ドキュメントの大量のトークンのセットについてインスタントインデックス化機構にバイパスすることができるが、同時に、インスタントインデックス化機構は”非バイパス”ドキュメントへの変更を、変更後数分以内に検索可能にすることができる。
【０２５３】
[0270]次に、図１３Ａを参照して、本発明のいくつかの実施形態に係る、変更ドキュメントメッセージ１３０２のブロック図について説明する。トークナイザ３２２が変更ドキュメントについての複数トークンのセットをトークン化して生成し、トークン格納部３２４に生成した複数トークンのセットを格納した後に、変更ドキュメントメッセージは、トークナイザ３２２によってインスタントインデクサー９１０へ送信されうる。例えば、トークナイザ３２２は、変更ドキュメントを処理した後に、変更ドキュメントメッセージ１３０２をメッセージキュー９１５の末尾（最後）に追加する。
【０２５４】
[0271]変更ドキュメントメッセージ１３０２は、ドキュメント識別子１３０４、ドキュメントネームスペースのグループ識別子１３０６、ドキュメントバージョン識別子１３０８、及びバイパスフラグ１３１０を含む。ドキュメント識別子１３０４は、変更ドキュメントの識別子である。ドキュメントネームスペースのグループ識別子１３０６は、変更ドキュメントが属するドキュメントネームスペースを含むドキュメントネームスペースグループの識別子である。いくつかの実施形態において、ドキュメントネームスペースのグループ識別子１３０６に加えて又は代えて、変更ドキュメントメッセージ１３０２は、ドキュメントネームスペースのドキュメントネームスペース識別子を含む。ドキュメントバージョン識別子１３０８は、変更ドキュメントのバージョンを識別する。バイパスフラグ１３１０は、変更ドキュメントのバージョンがインスタントインデックス化機構にバイパスするように指定されているか（即ち、バイパスドキュメントバージョン）、又は、インスタントインデックス化機構にバイパスするように指定されていないか（即ち、非バイパスドキュメントバージョン）を示す。例えば、バイパスフラグ１３１０は、変更ドキュメントのバージョンがバイパスドキュメントバージョン又は非バイパスドキュメントバージョンであるかどうかを示す、ビット値又は他のデータ値であってもよい。変更ドキュメントバージョンがバイパスドキュメントバージョンであれば、変更ドキュメントバージョンについてインスタントインデクサー９１０によって生成されたインデックス変更情報３５２はその後、インデックス変更情報サーバ９２０によってインデックス変更情報ジャーナル９３０からポーリングインデックスサーバ（例えば、４３０Ｃ）へ提供されないであろう。しかしながら、変更ドキュメントバージョンが非バイパスドキュメントバージョンであれば、変更ドキュメントバージョンについてインスタントインデクサー９１０によって生成されたインデックス変更情報３５２はその後、ポーリングインデックスサーバ（例えば、４３０Ｃ）へ提供されうる。
【０２５５】
[0272]次に、図１３Ｂを参照して、本発明のいくつかの実施形態に係る、インデックス変更情報ジャーナルエントリ（例えば、９３１Ａ）のブロック図について説明する。図示するように、インデックス変更情報ジャーナルエントリは、上述したように、ジャーナルタイムスタンプ９３２、バイパスフラグ１３１２、及びインデックス変更情報３５２を含んでもよい。
【０２５６】
[0273]バイパスフラグ１３１２は、ジャーナルエントリのインデックス変更情報がバイパス用に指定されているか（即ち、バイパスインデックス変更情報）、又は、バイパス用に指定されていないか（即ち、非バイパスインデックス変更情報）を示す。例えば、バイパスフラグ１３１２は、インデックス変更情報３５２がバイパスインデックス変更情報又は非バイパスインデックス変更情報であるかどうかを示す、ビット値又は他のデータ値であってもよい。ジャーナルエントリのインデックス変更情報３５２がバイパスインデックス変更情報である場合、インデックス変更情報３５２は、ポーリングインデックスサーバ（例えば、４３０Ｃ）へインデックス変更情報サーバ９２０によって提供されないであろう。しかしながら、ジャーナルエントリのインデックス変更情報３５２が非バイパスインデックス変更情報である場合、インデックス変更情報３５２は、ポーリングインデックスサーバ（例えば、４３０Ｃ）へ提供されうる。
【０２５７】
[0274]いくつかの実施形態において、ジャーナルエントリのインデックス変更情報３５２は、インデックス変更情報３５２が関連するドキュメントのドキュメント識別子と、ドキュメントにインデックスを付与するために使用する複数トークンのセットと、ドキュメントにインデックスを付与するためにもはや使用しない複数トークンのセットとを含む。いくつかの実施形態において、インデックス変更情報３５２は、ドキュメントにインデックスを付与するために使用する複数トークンのセットのみを含み、ドキュメントにインデックスを付与するためにもはや使用しない複数トークンのセットを含まない。いくつかの実施形態において、インデックス変更情報３５２は、ドキュメントにインデックスを付与するためにもはや使用しない複数トークンのセットのみを含み、ドキュメントにインデックスを付与するために使用する複数トークンのセットを含まない。いくつかの実施形態において、インデックス変更情報３５２はまた、ドキュメントが属するドキュメントネームスペースを含むドキュメントネームスペースグループのグループ識別子を含む。いくつかの実施形態において、ドキュメントネームスペースのグループ識別子に加えて又は代えて、インデックス変更情報３５２はまた、ドキュメントネームスペースのドキュメントネームスペース識別子を含む。
【０２５８】
＜拡張及び代替例＞
[0275]本発明を好適な一実施形態や所定の変形例を参照して詳細に説明したが、本発明を特定の実施形態又はそれらの特定の変形例に限定することを意図するものではない。したがって、当業者は、本発明の教示から逸脱することなく、種々の変形が上記好適な実施形態に行われうることを理解するであろう。
【図１】
0006446532.tif 000002
【図２】
0006446532.tif 000003
【図３】
0006446532.tif 000004
【図４】
0006446532.tif 000005
【図５】
0006446532.tif 000006
【図６】
0006446532.tif 000007
【図７】
0006446532.tif 000008
【図８】
0006446532.tif 000009
【図９】
0006446532.tif 000010
【図１０Ａ】
0006446532.tif 000011
【図１０Ｂ】
0006446532.tif 000012
【図１１Ａ】
0006446532.tif 000013
【図１１Ｂ】
0006446532.tif 000014
【図１２Ａ】
0006446532.tif 000015
【図１２Ｂ】
0006446532.tif 000016
【図１３Ａ】
0006446532.tif 000017
【図１３Ｂ】
0006446532.tif 000018