(57)【特許請求の範囲】
【請求項１】
段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群にアクセス可能なコンピュータに、
複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、前記第ｐ段の転置ブルームフィルタ列における転置ブルームフィルタの配列位置をあらわす位置情報に変換し、
前記第ｐ段の転置ブルームフィルタ列の中から、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを位置情報ごとに特定し、
特定された前記第ｐ段の転置ブルームフィルタを保持するノードから、特定された前記第ｐ段の転置ブルームフィルタを取得し、
取得された前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断し、
同一であると判断された場合、第ｐ段が第１段であるか否かを判断し、
第１段であると判断された場合、擬陽性を示すビットのビット位置に応じた特定のデータブロックを有するノードから、前記特定のデータブロック内での前記検索対象データの存否を示す検索結果を取得する、
処理を実行させることを特徴とする検索プログラム。
【請求項２】
前記ビット幅ｓのうち前記所定ビット幅に応じた前記分割データ構造のビット範囲と前記ノード群の各ノードとを対応付けた対応テーブルを参照することで、特定された前記第ｐ段の転置ブルームフィルタを保持するノードを特定する処理を前記コンピュータに実行させ、
前記第ｐ段の転置ブルームフィルタを取得する処理では、
特定先ノードから、特定された前記第ｐ段の転置ブルームフィルタを取得することを特徴とする請求項１に記載の検索プログラム。
【請求項３】
前記第ｐ段の転置ブルームフィルタを取得する処理では、
特定された前記第ｐ段の転置ブルームフィルタが複数存在する特定先ノードから前記第ｐ段の転置ブルームフィルタの論理積を取得し、
擬陽性を示すビットのビット位置が同一であるか否かを判断する処理では、
取得された論理積に基づいて、前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断することを特徴とする請求項２に記載の検索プログラム。
【請求項４】
第ｐ段が第１段であると判断された場合、前記対応テーブルを参照することで、前記特定のデータブロックを有するノードを特定する処理を前記コンピュータに実行させることを特徴とする請求項２または３に記載の検索プログラム。
【請求項５】
段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群のいずれかのノードに、
前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記第ｐ段の転置ブルームフィルタ列における転置ブルームフィルタの配列位置をあらわす位置情報を受信し、
前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信し、
前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信し、
前記いずれかのノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索し、
検索結果を前記コンピュータに送信する、
処理を実行させることを特徴とする検索プログラム。
【請求項６】
段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群にアクセス可能なコンピュータが、
複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、前記第ｐ段の転置ブルームフィルタ列における転置ブルームフィルタの配列位置をあらわす位置情報に変換し、
前記第ｐ段の転置ブルームフィルタ列の中から、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを位置情報ごとに特定し、
特定された前記第ｐ段の転置ブルームフィルタを保持するノードから、特定された前記第ｐ段の転置ブルームフィルタを取得し、
取得された前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断し、
同一であると判断された場合、第ｐ段が第１段であるか否かを判断し、
第１段であると判断された場合、擬陽性を示すビットのビット位置に応じた特定のデータブロックを有するノードから、前記特定のデータブロック内での前記検索対象データの存否を示す検索結果を取得する、
処理を実行することを特徴とする検索方法。
【請求項７】
段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群のいずれかのノードが、
前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記第ｐ段の転置ブルームフィルタ列における転置ブルームフィルタの配列位置をあらわす位置情報を受信し、
前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信し、
前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信し、
前記いずれかのノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索し、
検索結果を前記コンピュータに送信する、
処理を実行することを特徴とする検索方法。
【請求項８】
段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群にアクセス可能な検索装置であって、
複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、前記第ｐ段の転置ブルームフィルタ列における転置ブルームフィルタの配列位置をあらわす位置情報に変換する処理部と、
前記第ｐ段の転置ブルームフィルタ列の中から、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを位置情報ごとに特定する処理部と、
特定された前記第ｐ段の転置ブルームフィルタを保持するノードから、特定された前記第ｐ段の転置ブルームフィルタを取得する処理部と、
取得された前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断する処理部と、
同一であると判断された場合、第ｐ段が第１段であるか否かを判断する処理部と、
第１段であると判断された場合、擬陽性を示すビットのビット位置に応じた特定のデータブロックを有するノードから、前記特定のデータブロック内での前記検索対象データの存否を示す検索結果を取得する処理部と、
を備えることを特徴とする検索装置。
【請求項９】
段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群のいずれかのノードであって、
前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記第ｐ段の転置ブルームフィルタ列における転置ブルームフィルタの配列位置をあらわす位置情報を受信する処理部と、
前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信する処理部と、
前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信する処理部と、
前記いずれかのノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索する処理部と、
検索結果を前記コンピュータに送信する処理部と、
を備えることを特徴とするノード。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データを検索する検索プログラム、検索方法、検索装置、ノードおよび検索システムに関する。
【背景技術】
【０００２】
従来、大規模なデータを木構造で管理する場合、Ｂ木（Ｂｔｒｅｅ）と呼ばれるデータ構造での管理が比較的多く行われていた。Ｂ木は、単純な２分木に比べて、一つのブロックに複数のデータエントリを格納するので、データエントリの追加があっても木構造の形の変化が波及する範囲を狭くできるという利点がある。このため、Ｂ木はハードディスクなどのディスク向けのデータ管理方法として利用されることが多い。
【０００３】
しかしながら、ディスク上において木構造で管理されたデータを検索する場合、複数のデータブロックを実際に読み込む必要がある。また、一般に、ディスクに対するＩ／Ｏ（ｉｎｐｕｔ／ｏｕｔｐｕｔ）は、メモリアクセスに比べると遅いことから、ディスク上でのデータ検索には手間と時間を要するおそれがある。
【０００４】
このため、最近では、ディスクＩ／Ｏによる検索の遅延を避けるためには、メモリ中に木構造をもつなどの対応も考えられている。しかるに、Ｂ木では、データエントリ数が多くなると、それに応じて必要なメモリ量が増えてしまうおそれがある。このため、木構造のうち最も良く読みこまれる部分のみをメモリ中に格納する方法（キャッシュ）を利用することも考えられている。
【０００５】
これに対し、最近では、ブルームフィルタ（Ｂｌｏｏｍ  Ｆｉｌｔｅｒ）と呼ばれるデータ構造も知られてきている。ブルームフィルタは、あるエントリが既存の集合に属するかどうかを効率的に調べる方法である。また、電子交換機のダイヤルパルス処理で、ダイヤルパルスにパルス速度ビットと偶数／奇数ビットの２つを設けておき、そのビットを取り込む群処理も開示されている。
【０００６】
また、複数のデータの索引情報を階層型に構成し、分散して配置するデータ検索技術も開示されている。また、データの属性とエントリ情報を分散させてデータを分割してそれぞれに索引を作り、複数の処理装置と記憶装置に分散して格納し、各ノードで並列に検索させるデータベース検索方式も開示されている。また、同じデータがすでに格納されているかどうかをチェックするために、データから識別子としてハッシュ値を求め、同じ識別子がみつからない場合は同じデータは存在しないとしてデータを格納するストレージシステムも開示されている。
【０００７】
また、検索キーをもとにブルームフィルタのビットベクトルを求め、値の特定のセットを含む少なくとも一つのネットワークメッセージを生成しデータソースに伝送する、複数のノードを有するネットワークデータベースも開示されている。また、格納データ集合ごとに複数のハッシュ値を求め、その値をビット位置とした第３の表（ブルームフィルタ）を作り、入力値からハッシュ値を求め、符号化した値が表中に存在するかどうかで集合内に存在するかどうかを判定する情報検索も開示されている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００７−５２６９８号公報
【特許文献２】特開平４−１８８９５号公報
【特許文献３】特開２００１−１０１０４７号公報
【特許文献４】特開平０２−２９７６７０号公報
【特許文献５】特開２０１０−１８２３０２号公報
【特許文献６】特表２００６−５０３３４２号公報
【特許文献７】特表２００７−５２４９４６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
上述したように、Ｂ木は多量のデータを扱うことができるため、キャッシュを適切に実装すれば、ディスクＩ／Ｏを減らすことは可能である。しかしながら、その回数をある一定以上減らすことはできない。また、データエントリの追加により木構造が変化すると、木構造管理のためのＩ／Ｏが必要になることもある。また、ブルームフィルタは、データエントリの存在だけがわかるものであるため、そのままではデータ管理に使うことはできない。
【００１０】
また、ブルームフィルタは、管理可能なデータ量に比例したサイズのメモリを占有する。したがって、重複除去ストレージシステムに適用した場合、当該システム全体の容量がノードに搭載できるメモリ量によって決まってしまうという問題があった。したがって、重複データを広い範囲で検索できないという問題があった。
【００１１】
１つの側面では、本発明は、データ検索の高速化又は管理可能なデータ量の拡大化を図ることができる検索プログラム、検索方法、検索装置、ノードおよび検索システムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明の一側面では、段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群にアクセス可能なコンピュータが、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、前記転置ブルームフィルタの配列位置をあらわす位置情報に変換し、前記第ｐ段の転置ブルームフィルタ列の中から、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを位置情報ごとに特定し、特定された前記第ｐ段の転置ブルームフィルタを保持するノードから、特定された前記第ｐ段の転置ブルームフィルタを取得し、取得された前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断し、同一であると判断された場合、第ｐ段が第１段であるか否かを判断し、第１段であると判断された場合、擬陽性を示すビットのビット位置に応じた特定のデータブロックを有するノードから、前記特定のデータブロック内での前記検索対象データの存否を示す検索結果を取得する、検索プログラム、検索方法、および検索装置を用いる。
【００１３】
本発明の他の側面では、段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群で検索システムが構成される場合、前記ノード群内の各ノードが、前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記転置ブルームフィルタの配列位置をあらわす位置情報を受信し、前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信し、前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信し、前記いずれかのノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索し、検索結果を前記コンピュータに送信する、検索プログラム、検索方法、検索装置、ノードおよび検索システムを用いる。
【発明の効果】
【００１４】
一態様によれば、データ検索の高速化を図ることができる。また、一態様によれば、管理可能なデータ量の拡大化を図ることができる。
【図面の簡単な説明】
【００１５】
【図１】図１は、実施の形態にかかる検索システムのシステム構成例を示す説明図である。
【図２】図２は、階層型ブルームフィルタの一例を示す説明図である。
【図３】図３は、階層型ブルームフィルタＢＦ内の第ｐ段のブルームフィルタ列ＢＦ（ｐ）の転置例を示す説明図である。
【図４】図４は、実施の形態にかかるコンピュータ（ノードＮ１〜Ｎ４、管理サーバＭ、クライアントＣ１〜Ｃ３）のハードウェア構成例を示すブロック図である。
【図５】図５は、エントリ処理の一例を示す説明図である。
【図６】図６は、実施の形態にかかる登録元コンピュータによるエントリ処理手順例を示すフローチャートである。
【図７】図７は、図６に示したデータエントリ処理の詳細な処理手順例を示すフローチャートである。
【図８】図８は、データエントリリクエスト８０１およびリプライのデータ構造例を示す説明図である。
【図９】図９は、図６に示したフィルタエントリ処理の詳細な処理手順例を示すフローチャートである。
【図１０】図１０は、フィルタエントリリクエストのデータ構造例を示す説明図である。
【図１１】図１１は、実施の形態にかかるノードによるエントリ処理の詳細な処理手順例を示すフローチャートである。
【図１２】図１２は、検索処理例を示す説明図（その１）である。
【図１３】図１３は、検索処理例を示す説明図（その２）である。
【図１４】図１４は、検索処理例を示す説明図（その３）である。
【図１５】図１５は、実施の形態にかかる検索元コンピュータによる検索処理手順例を示すフローチャート（前半）である。
【図１６】図１６は、ＡＮＤ演算要求のリクエストおよびリプライのデータ構造例を示す説明図である。
【図１７】図１７は、実施の形態にかかる検索元コンピュータによる検索処理手順例を示すフローチャート（後半）である。
【図１８】図１８は、ハッシュテーブル検索のリクエストおよびリプライのデータ構造例を示す説明図（その１）である。
【図１９】図１９は、ハッシュテーブル検索のリクエストおよびリプライのデータ構造例を示す説明図（その２）である。
【発明を実施するための形態】
【００１６】
以下に添付図面を参照して、本発明にかかる検索プログラム、検索方法、検索装置、ノードおよび検索システムの実施の形態を詳細に説明する。
【００１７】
＜検索システムのシステム構成例＞
図１は、実施の形態にかかる検索システムのシステム構成例を示す説明図である。図１において、検索システム１００は、複数（図１では例として４台）のノードＮ１〜Ｎ４と、管理サーバＭと、一または複数（図１では例として３台）のクライアントＣ１〜Ｃ３と、がネットワークＮＷを介して通信可能に接続されて構成されている。ネットワークＮＷとしては、たとえば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットが挙げられる。
【００１８】
本実施の形態では、階層型転置ブルームフィルタｔＢＦをノード数で分割して、階層型分割転置ブルームフィルタを各ノードに持たせておく。階層型転置ブルームフィルタｔＢＦとは、階層型ブルームフィルタを転置したインデックス情報である。
【００１９】
階層型ブルームフィルタとは、ブルームフィルタを階層構造にしたインデックス情報である。ブルームフィルタとは、所定数のデータブロック内での擬陽性（疑陽性、偽陽性ともいう）または陰性を示すビットが複数配列されたインデックス情報である。ブルームフィルタのビットがＯＮのときは擬陽性を示し、ＯＦＦのときは陰性を示す。なお、ビットの値が１をＯＮとし、０をＯＦＦとしてもよく、逆に、ビットの値が０をＯＮとし、１をＯＦＦとしてもよい。本実施の形態では、ビットの値が１をＯＮ（擬陽性）とし、０をＯＦＦ（陰性）とする。
【００２０】
なお、階層型ブルームフィルタについては、図２を用いて後述する。また、階層型ブルームフィルタと階層型転置ブルームフィルタｔＢＦとの対応関係については、図３を用いて後述する。
【００２１】
また、図１では、例として階層型転置ブルームフィルタｔＢＦの階層数を３とする。したがって、階層型転置ブルームフィルタｔＢＦは、１段目（最下段）の転置ブルームフィルタ列ｔＢＦ（１）、２段目の転置ブルームフィルタ列ｔＢＦ（２）、３段目（最上段）の転置ブルームフィルタ列ｔＢＦ（３）を階層化したブルームフィルタである。
【００２２】
また、図１では、例として階層型転置ブルームフィルタｔＢＦのビット幅ｓを６４ビットとする。また、図１では、例として４台のノードで階層型転置ブルームフィルタｔＢＦを１６ビットのビット幅で分割するものとする。たとえば、ノードＮ１に割り当てられる階層型分割転置ブルームフィルタｔＢＦ１は、階層型転置ブルームフィルタｔＢＦの１ビット目から１６ビット目までのインデックス範囲となる。ノードＮ２〜Ｎ４についても同様に、図１に示したようにインデックス範囲が決まる。
【００２３】
また、階層型転置ブルームフィルタｔＢＦにはデータブロック集合ｄｂが対応付けられている。データブロック集合ｄｂは、階層型転置ブルームフィルタｔＢＦのビット幅ｓと同一ビット幅とする。したがって、データブロック集合ｄｂは、階層型転置ブルームフィルタｔＢＦと同じインデックス範囲で分割される。たとえば、分割データブロック集合ｄｄｂ１は、階層型分割転置ブルームフィルタｔＢＦ１とともにノードＮ１に割り当てられることとなる。分割データブロック集合ｄｄｂ２〜ｄｂｂ４についても同様に、図１に示したように割り当てられる。
【００２４】
また、各ノードＮ１〜Ｎ４は、ハッシュテーブルＨＴ１〜ＨＴ８を有している。ハッシュテーブルＨＴ１〜ＨＴ８とは、データと、当該データを各ノードに共通のハッシュ関数（たとえば、ＳＨＡ−１）に与えたときのハッシュ値と、を関連付けたテーブルである。ハッシュテーブルＨＴ１〜ＨＴ８は、データブロックごとに用意されている。たとえば、ハッシュテーブルＨＴ１はデータブロックｄｂ１に対応する。
【００２５】
また、ハッシュテーブルＨＴ１〜ＨＴ８のポインタで指定されるデータは、そのハッシュテーブルＨＴ１〜ＨＴ８に対応するデータブロックｄｂ１〜ｄｂ８に格納されている。たとえば、ハッシュテーブルＨＴ１のポインタで指定されるデータＤ１１，Ｄ１２は、データブロックｄｂ１に格納されている。
【００２６】
なお、図１の例では、分割データブロック集合ｄｄｂ１〜ｄｄｂ４内の数字＃はデータブロックの番号＃を示しており、たとえば、分割データブロック集合ｄｄｂ１内の「１」はデータブロックｄｂ１、分割データブロック集合ｄｄｂ１内の「２」はデータブロックｄｂ２となる。
【００２７】
このように、階層型転置ブルームフィルタｔＢＦおよびデータブロック集合ｄｂを複数のノードに分散させることにより、重複除去ストレージのスケーラビリティの向上を図ることができる。また、階層型転置ブルームフィルタｔＢＦを分散させておくことで、検索速度の高速化も図ることができる。
【００２８】
管理サーバＭは、複数のノードＮ１〜Ｎ４を管理するコンピュータである。管理サーバＭは、対応テーブルＴを有している。対応テーブルＴとは、階層型分割転置ブルームフィルタのインデックス範囲と当該インデックス範囲を担当するノードとを関連付けたテーブルである。管理サーバＭは、対応テーブルＴを参照することで、複数のノードＮ１〜Ｎ４のいずれかのノードにデータエントリ処理やフィルタエントリ処理を実行したり、複数のノードＮ１〜Ｎ４からデータの検索処理を実行したりする。なお、管理サーバＭは、物理マシンでもよいが、いずれかのノードにおいて仮想マシンとして機能させてもよい。
【００２９】
クライアントＣ１〜Ｃ３は、複数のノードＮ１〜Ｎ４を利用するコンピュータである。クライアントＣ１〜Ｃ３は、対応テーブルＴを有していない場合は、管理サーバＭを介してデータエントリ処理やフィルタエントリ処理、データの検索処理を実行する。クライアントＣ１〜Ｃ３は、対応テーブルＴを有している場合は、管理サーバＭを介さずにデータエントリ処理やフィルタエントリ処理、データの検索処理を実行する。クライアントＣ１〜Ｃ３に対応テーブルＴを持たせた場合は、必ずしも管理サーバＭは必要ではない。
【００３０】
また、クライアントＣ１〜Ｃ３が対応テーブルＴを有している場合でも、たとえば、管理サーバＭはデータエントリ処理やフィルタエントリ処理をおこない、クライアントＣ１〜Ｃ３はデータの検索処理をおこなうなど、担当する処理を分けて実行することとしてもよい。なお、データエントリ処理やフィルタエントリ処理を実行するコンピュータは、フィルタエントリ処理に必要な各段の転置ブルームフィルタ列ｔＢＦ（ｐ）の配列数やビット幅ｓを記憶しているものとする。
【００３１】
このような検索システム１００では、検索対象データが与えられると、階層型分割転置ブルームフィルタｔＢＦ１〜ｔＢＦ４を参照して、検索対象データが存在するであろうデータブロックｄｂ＃を特定することになる。検索対象データが存在するであろうデータブロックｄｂ＃が特定されなかった場合は、いずれのデータブロックｄｂ＃にも検索対象データは存在しない（陰性）。逆に、検索対象データが存在するであろうデータブロックｄｂ＃が特定された場合でも、特定されたデータブロックｄｂ＃には、必ずしも検索対象データが存在するとは限らない（擬陽性）。
【００３２】
なお、擬陽性が陽性になるか陰性になるかは、最終的に特定されたデータブロックｄｂ＃に対応するハッシュテーブルＨＴ＃での検索結果に依存する。たとえば、最終的に特定されたデータブロックｄｂ＃に対応するハッシュテーブルＨＴ＃において、検索対象データのハッシュ値がヒットすれば陽性、ヒットしなければ陰性となる。
【００３３】
＜階層型ブルームフィルタ＞
つぎに、図１に示した階層型転置ブルームフィルタｔＢＦの転置元となる階層型ブルームフィルタについて説明する。
【００３４】
図２は、階層型ブルームフィルタの一例を示す説明図である。階層型ブルームフィルタＢＦは、ｈ段×ｓビット幅のメモリ領域で構成されている。ｓビット幅は、データブロック集合ｄｂのビット幅に対応する。また、各段のビット長ｓは最上段である第ｈ段の分割数ｄに基づいて分割される。分割された各々はブルームフィルタであり、各段においてブルームフィルタ列を構成する。分割数ｄは基本的には２以上の整数であるが、最上段である第ｈ段を単一のブルームフィルタとする場合は、ｄ＝１としてもよい。
【００３５】
任意の段をｐとすると、第ｐ段のブルームフィルタ列ＢＦ（ｐ）を構成するブルームフィルタｂｆ（ｐ）のビット幅ｍは、ｍ＝ｓ／ｄ[h-(p-1)]となる。図２では、ｄ＝２としている。また、第ｐ段のブルームフィルタ列ＢＦ（ｐ）のブルームフィルタｂｆ（ｐ）の配列数ｎは、ｎ＝ｄ[h-(p-1)]となる。
【００３６】
したがって、階層型ブルームフィルタＢＦでは、段が下がる（ｈが小さくなる）につれ、第ｐ段のブルームフィルタ列ＢＦ（ｐ）のブルームフィルタｂｆ（ｐ）の配列数が増加する。なお、最下段（第１段）のブルームフィルタ列ＢＦ（１）のブルームフィルタｂｆ（１）の配列数は、データブロックｄｂ＃の個数と同一とする。
【００３７】
これにより、第１段までたどり着いたときにヒットしたブルームフィルタｂｆ（１）とデータブロックｄｂ＃とが一対一対応することになる。また、階層型ブルームフィルタＢＦの段数ｈは基本的には複数段であるが、１段（ｈ＝１）としてもよい。ただし、この場合は、ｄ≠１とする。
【００３８】
ここで、ブルームフィルタの擬陽性による影響について説明する。ブルームフィルタの擬陽性の発生確率ＦＰＲは、ビット長がｍのブルームフィルタがｈ段ある場合、データ登録数Ｎ（Ｎ＜ｍ）、ハッシュ関数の個数をｋ個とすると、ブルームフィルタの性質より、次式（１）のように表すことができる。
【００３９】
ＦＰＲ＝｛１−（１−１／ｍ）kN｝k≒｛１−ｅ(-kN/m)）｝k・・・（１）
【００４０】
この場合、ｋ，ｍ，Ｎを変更することにより、擬陽性の発生確率ＦＰＲを非常に小さくすることができる。すなわち、ｋ，ｍ，Ｎの設定次第で、擬陽性の発生確率ＦＰＲを１よりも非常に小さい値（ほぼ０）に設定することができるようになる。
【００４１】
また、データブロック数Ｎｄｂをｄhとすると、高さ段数ｈは、次式（２）にて表すことができる。
【００４２】
ｈ＝ｌｏｇ（Ｎｄｂ）／ｌｏｇ（ｄ）＋１・・・（２）
【００４３】
上記式（２）は、ｌｏｇ（Ｎｄｂ）／ｌｏｇ（ｄ）が割り切れる場合を前提にしたが、そうでない場合、段によりｄの値を他の段とは変えることで、ｈを決定することができる。
【００４４】
また、検索処理ではハッシュ値の数（ｋ回（定数））だけ照合を行う必要があり、検索における１段あたりのフィルタリング対象の数は多くてもｄ個である。したがって、検索によるメモリアクセス回数ＭＡは、最大でも次式（３）で表される程度である。
【００４５】
ＭＡ＝ｋ×ｄ×ｌｏｇ（Ｎｄｂ）／ｌｏｇ（ｄ）・・・（３）
【００４６】
すなわち、段数ｈ（＝メモリ量）は、分割数ｄを増やすことにより小さくすることができ、その一方で、検索回数は分割数ｄの増加とともに大きくなるというトレードオフの関係にある。したがって、この関係を考慮することで、適切なメモリの運用が可能となる。
【００４７】
＜階層型転置ブルームフィルタｔＢＦ＞
つぎに、階層型転置ブルームフィルタｔＢＦについて説明する。図２に示した階層型ブルームフィルタＢＦを転置させることで、階層型ブルームフィルタＢＦよりも検索速度をさらに高速化させることができる。
【００４８】
図３は、階層型ブルームフィルタＢＦ内の第ｐ段のブルームフィルタ列ＢＦ（ｐ）の転置例を示す説明図である。（Ａ）は、ブルームフィルタ列ＢＦ（ｐ）を示している。ここでは、ブルームフィルタ列ＢＦ（ｐ）は、例として、４分割されたブルームフィルタｂｆ（ｐ−１）〜ｂｆ（ｐ−４）を示している。すなわち、ブルームフィルタ列ＢＦ（ｐ）は、８ビット×４フィルタ数のビット列である。転置する場合は、４ビット×８フィルタ数のビット列となる。すなわち、転置により、配列数とビット幅が入れ替わる。
【００４９】
（Ｂ）は、ブルームフィルタ列ＢＦ（ｐ）の転置を示している。転置する場合、各ブルームフィルタｂｆ（ｐ−１）〜ｂｆ（ｐ−４）の同一位置のビットを集めて、同一位置ごとに集められたビット列を、ビット位置順に配列させる。
【００５０】
具体的には、各ブルームフィルタｂｆ（ｐ−１）〜ｂｆ（ｐ−４）の各先頭ビットを配列番号順にまとめてビット列｛０１１０｝とする。左から先頭ビット「０」がブルームフィルタｂｆ（ｐ−１）の先頭ビット、２番目のビット「１」がブルームフィルタｂｆ（ｐ−２）の先頭ビット、３番目のビット「１」がブルームフィルタｂｆ（ｐ−３）の先頭ビット、末尾ビット「０」がブルームフィルタｂｆ（ｐ−４）の先頭ビットである。
【００５１】
このビット列｛０１１０｝を、転置ブルームフィルタｔｂｆ（ｐ−１）と称す。２番目〜末尾のビット位置についても同様にまとめることで、転置ブルームフィルタｔｂｆ（ｐ−１）〜ｔｂｆ（ｐ−８）を得る。転置ブルームフィルタｔｂｆ（ｐ−１）〜ｔｂｆ（ｐ−８）がビット位置順に配列されたインデックス情報が、転置ブルームフィルタ列ｔＢＦ（ｐ）である。転置ブルームフィルタ列ｔＢＦ（ｐ）をすべての段で生成することで、階層型転置ブルームフィルタｔＢＦとなる。
【００５２】
（Ｃ）は、ブルームフィルタ列ＢＦ（ｐ）と転置ブルームフィルタ列ｔＢＦ（ｐ）との検索比較例を示している。ここでは、２種類のハッシュ関数により対象データＤのハッシュ値を２つ求め、ブルームフィルタ列ＢＦ（ｐ）を構成するブルームフィルタｂｆ（ｐ）のビット幅１０で割り算した余り値を、「４」および「８」とする。
【００５３】
ブルームフィルタ列ＢＦ（ｐ）で検索する場合、余り値「４」および「８」となるビット位置「４」および「８」がすべてＯＮになっているブルームフィルタｂｆ（ｐ）をブルームフィルタ列ＢＦ（ｐ）から探す。この場合、ブルームフィルタｂｆ（ｐ−２）が該当する。
【００５４】
一方、転置ブルームフィルタ列ｔＢＦ（ｐ）を用いる場合、ブルームフィルタ列ＢＦ（ｐ）のように、ビット位置「４」および「８」がすべてＯＮになっているブルームフィルタｂｆ（ｐ）を検索せず、余り値「４」および「８」と同一配列番号の転置ブルームフィルタｔｂｆ（ｐ−４），ｔｂｆ（ｐ−８）を抽出する。そして、抽出された転置ブルームフィルタｔｂｆ（ｐ−４），ｔｂｆ（ｐ−８）をＡＮＤ演算することで、ともにＯＮになっているビット位置「２」を特定する。
【００５５】
ブルームフィルタ列ＢＦ（ｐ）の場合は、４個のブルームフィルタｂｆ（ｐ−１）〜ｂｆ（ｐ−４）内の４ビット目と８ビット目を参照するため、８（＝４×２）のメモリアクセスが必要となる。一方、転置ブルームフィルタ列ｔＢＦ（ｐ）は、転置前のブルームフィルタｂｆ（ｐ−１）〜ｂｆ（ｐ−４）のビット位置ごとに折りたたまれたインデックス情報である。したがって、転置ブルームフィルタｔｂｆ（ｐ−４），ｔｂｆ（ｐ−８）を抽出するという２回のメモリアクセスとそのＡＮＤ演算により判定することが可能となる。したがって、階層型ブルームフィルタＢＦよりもメモリアクセス頻度が低減され、検索速度が高速化することとなる。
【００５６】
このようにして得られた階層型転置ブルームフィルタｔＢＦをインデックス範囲で分割してノードに割り当てることで、各ノードでの検索処理において、メモリアクセス頻度が低減され、検索速度が高速化することとなる。また、複数のノードに分散されているため、単ノードに比べて、複数のノード全体でのインデックス範囲を広くとることができる。このように、管理可能なデータ量の拡大を図ることで、重複データを広い範囲で検索をおこなうことができ、検索対象データを見つけやすくすることができる。
【００５７】
＜コンピュータのハードウェア構成例＞
図４は、実施の形態にかかるコンピュータ（ノードＮ１〜Ｎ４、管理サーバＭ、クライアントＣ１〜Ｃ３）のハードウェア構成例を示すブロック図である。図４において、検索装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）４０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）４０３と、磁気ディスクドライブ４０４と、磁気ディスク４０５と、光ディスクドライブ４０６と、光ディスク４０７と、ディスプレイ４０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）４０９と、キーボード１４０と、マウス４１１と、スキャナ４１２と、プリンタ４１３と、を備えている。また、各構成部はバス４００によってそれぞれ接続されている。
【００５８】
ここで、ＣＰＵ４０１は、コンピュータの全体の制御を司る。ＲＯＭ４０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ４０３は、ＣＰＵ４０１のワークエリアとして使用される。磁気ディスクドライブ４０４は、ＣＰＵ４０１の制御にしたがって磁気ディスク４０５に対するデータのリード／ライトを制御する。磁気ディスク４０５は、磁気ディスクドライブ４０４の制御で書き込まれたデータを記憶する。
【００５９】
光ディスクドライブ４０６は、ＣＰＵ４０１の制御にしたがって光ディスク４０７に対するデータのリード／ライトを制御する。光ディスク４０７は、光ディスクドライブ４０６の制御で書き込まれたデータを記憶したり、光ディスク４０７に記憶されたデータをコンピュータに読み取らせたりする。
【００６０】
ディスプレイ４０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ４０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００６１】
インターフェース（以下、「Ｉ／Ｆ」と略する。）４０９は、通信回線を通じてネットワークＮＷに接続され、このネットワークＮＷを介して他の装置に接続される。そして、Ｉ／Ｆ４０９は、ネットワークＮＷと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ４０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００６２】
キーボード４１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス４１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００６３】
スキャナ４１２は、画像を光学的に読み取り、コンピュータ内に画像データを取り込む。なお、スキャナ４１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ４１３は、画像データや文書データを印刷する。プリンタ４１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００６４】
＜エントリ処理例＞
つぎに、エントリ処理について説明する。エントリ処理では、エントリの対象となるデータ（以下、対象データ）を登録するデータエントリ処理と、階層型分割転置ブルームフィルタ群へのフィルタエントリ処理とが実行される。以下、図５を用いて説明する。
【００６５】
図５は、エントリ処理の一例を示す説明図である。ここでは、図１に示した階層型分割転置ブルームフィルタ群（ｔＢＦ１〜ｔＢＦ４）を例にあげて説明する。図５では、対象データＤｘがデータブロック集合ｄｂにまだエントリされていないものとする。また、エントリ処理を実行するコンピュータは、管理サーバＭまたはクライアントＣ１〜Ｃ３となるが、ここでは一例として管理サーバＭとする。
【００６６】
（データエントリ処理例）
まず、データエントリ処理例について説明する。登録される対象データＤｘが与えられるハッシュ関数の種類数ｋをｋ＝３とする。ここでは、ハッシュ関数Ｈ１（），Ｈ２（），Ｈ３（）を用いることとする。また、ハッシュテーブルＨＴ１〜ＨＴ８の登録対象となるハッシュ関数をＨ１（）とする。
【００６７】
まず、管理サーバＭでは、対象データをエントリさせるノード（登録先ノード）を指定する。どのノードにエントリするかは、管理サーバＭの利用者が任意に指定することができる。また、あらかじめ各ノードの空き容量に応じて、エントリさせるノードを指定することとしてもよい。各ノードの空き容量は、各ノードが管理サーバＭに対して定期的にまたは管理サーバＭからの要求に応じて通知されるものとする。図５では、ノードＮ２が指定されたものとする。
【００６８】
また、対象データＤｘを各ハッシュ関数Ｈ１（），Ｈ２（），Ｈ３（）に与えたときのハッシュ値は、例として以下の値とする。
Ｈ１（Ｄｘ）＝ｘ１
Ｈ２（Ｄｘ）＝ｘ２
Ｈ３（Ｄｘ）＝ｘ３
【００６９】
また、エントリ処理では、更新対象となる転置ブルームフィルタｔｂｆ（ｐ）内の特定のビットをＯＮにするが、その特定のビットがすでにＯＮになっている場合はそのままとする。
【００７０】
ここで、管理サーバＭは、対象データＤｘについてのハッシュテーブルエントリＥｘを作成する。そして、管理サーバＭは、作成されたハッシュテーブルエントリＥｘを、登録先ノードとなるノードＮ２に送信する。なお、図５の例では、ノードＮ２は、分割データブロック集合ｄｄｂ２内のデータブロックｄｂ４に、対象データＤｘを登録したものとする。
【００７１】
この場合、ハッシュテーブルエントリＥｘは、ノードＮ２のハッシュテーブルＨＴ４に追加される。なお、実際には、対象データＤｘは、データブロックｄｂ４に格納されており、ハッシュテーブルＨＴ４では、ハッシュ値ｘ１とデータブロックｄｂ４に格納された対象データＤｘへのポインタとが関連付けられることになる。
【００７２】
ノードＮ２は、ハッシュテーブルＨＴ４へのエントリが完了すると、管理サーバＭにリプライを返す。リプライには、登録先のデータブロックのブロック番号が含まれている。この場合は、登録先のデータブロックｄｂ４のブロック番号４が含まれている。
【００７３】
（フィルタエントリ処理例）
つぎに、フィルタエントリ処理例について説明する。まずは、第１段のフィルタエントリ処理が実行される。管理サーバＭは、更新対象となる転置ブルームフィルタｔｂｆ（１）を、第１段の転置ブルームフィルタ列ｔＢＦ（１）の中から特定する。具体的には、管理サーバＭは、各ハッシュ値ｘ１〜ｘ３を、第１段の転置ブルームフィルタ列ｔＢＦ（１）の配列数である「８」で割り算し、余り値を算出する。余り値は、転置ブルームフィルタの配列位置をあらわす位置情報となる。
【００７４】
ここでは、ハッシュ値ｘ１の余り値は「２」、ハッシュ値ｘ２の余り値は「５」、ハッシュ値ｘ３の余り値は「７」になったものとする。したがって、第１段での更新対象となる転置ブルームフィルタｔｂｆ（１）は、転置ブルームフィルタｔｂｆ（１−２），ｔｂｆ（１−５），ｔｂｆ（１−７）となる。
【００７５】
また、第１段（最下段）では、リプライで特定される登録先のデータブロックｄｂ４のブロック番号４に対応するビット位置を更新対象ビットとする。そして、管理サーバＭは、第１段での更新対象となる転置ブルームフィルタｔｂｆ（１−２），ｔｂｆ（１−５），ｔｂｆ（１−７）のインデックス範囲を特定する。
【００７６】
たとえば、第１段の転置ブルームフィルタｔｂｆ（１）のビット幅は８ビットであるため、先頭から２番目の転置ブルームフィルタｔｂｆ（１−２）のインデックス範囲は、９ビット目から１６ビット目となる。このインデックス範囲は、対応テーブルＴを参照することで、ノードＮ１のインデックス範囲であると特定される。したがって、転置ブルームフィルタｔｂｆ（１−２）はノードＮ１に属していることが判明する。転置ブルームフィルタｔｂｆ（１−５），ｔｂｆ（１−７）についても同様に、それぞれノードＮ３，Ｎ４に属していることが判明する。そして、管理サーバＭは、ノードＮ１，Ｎ３，Ｎ４に更新対象ビット位置を通知する。
【００７７】
通知を受けたノードＮ１，Ｎ３，Ｎ４は、更新対象となる転置ブルームフィルタｔｂｆ（１）の先頭から４ビット目のビットをＯＮにする。これにより、第１段の転置ブルームフィルタ列ｔＢＦ（１）のフィルタエントリ処理を終了する。
【００７８】
つぎに、第２段のフィルタエントリ処理が実行される。管理サーバＭは、更新対象となる転置ブルームフィルタｔｂｆ（２）を、第２段の転置ブルームフィルタ列ｔＢＦ（２）の中から特定する。具体的には、管理サーバＭは、各ハッシュ値ｘ１〜ｘ３を、第２段の転置ブルームフィルタ列ｔＢＦ（２）の配列数である「１６」で割り算し、余り値を算出する。
【００７９】
ここでは、ハッシュ値ｘ１の余り値は「８」、ハッシュ値ｘ２の余り値は「１１」、ハッシュ値ｘ３の余り値は「１３」になったものとする。したがって、第２段での更新対象となる転置ブルームフィルタｔｂｆ（２）は、転置ブルームフィルタｔｂｆ（２−８），ｔｂｆ（２−１１），ｔｂｆ（２−１３）となる。
【００８０】
つぎに、転置ブルームフィルタｔｂｆ（２−８），ｔｂｆ（２−１１），ｔｂｆ（２−１３）内のどのビット位置のビットをＯＮにするかについて説明する。転置前の階層型ブルームフィルタＢＦでは、分割数をｄとして、各ブルームフィルタ列ＢＦ（ｐ）をｎ（＝ｄ[h-(p-1)]）個に分割した。そして、これにより、各ブルームフィルタ列ＢＦ（ｐ）のビット幅は、ｍ（＝ｓ／ｎ）ビットになった。
【００８１】
このため、階層型ブルームフィルタＢＦでは、第（ｐ−１）段での更新対象のブルームフィルタｂｆ（（ｐ−１）−＃）のビット位置を包含するブルームフィルタｂｆ（ｐ）を、第ｐ段のブルームフィルタ列ＢＦ（ｐ）の中から特定していた。
【００８２】
これに対し、階層型転置ブルームフィルタｔＢＦでは、配列数ｎとビット幅ｍが入れ替わっているため、第（ｐ−１）段の更新対象のブルームフィルタｂｆ（（ｐ−１）−＃）の配列番号＃ではなく、第（ｐ−１）段での更新対象ビット位置を分割数ｄで割り算し、端数を切り上げる。分割数ｄは転置後では最上段ｈの転置ブルームフィルタｔｂｆ（ｈ）のビット幅となる。
【００８３】
第２段の場合、前段である第１段での更新対象ビットは、先頭から４ビット目のビットであり、転置ブルームフィルタｔｂｆ（１−２），ｔｂｆ（１−５），ｔｂｆ（１−７）の４ビット目がＯＮにされた。したがって、第２段の更新対象ビットは、ｄ＝２であるため、先頭から４／ｄ＝２ビット目のビットを更新対象ビットとする。
【００８４】
本例では、転置ブルームフィルタｔｂｆ（２−８），ｔｂｆ（２−１１），ｔｂｆ（２−１３）の先頭から２ビット目が更新対象ビット位置となる。そして、管理サーバＭは、第１段と同様、転置ブルームフィルタｔｂｆのビット幅（第２段は４ビット）と対応テーブルＴを用いることで、第２段での更新対象となる転置ブルームフィルタｔｂｆ（２−８），ｔｂｆ（２−１１），ｔｂｆ（２−１３）を有するノードＮ２〜Ｎ４を特定する。そして、管理サーバＭは、ノードＮ２〜Ｎ４に更新対象ビット位置を通知する。
【００８５】
通知を受けたノードＮ２〜Ｎ４は、更新対象となる転置ブルームフィルタｔｂｆ（２）の先頭から２ビット目のビットをＯＮにする。これにより、第２段の転置ブルームフィルタ列ｔＢＦ（２）のフィルタエントリ処理を終了する。
【００８６】
つぎに、第３段（最上段）のフィルタエントリ処理が実行される。管理サーバＭは、更新対象となる転置ブルームフィルタｔｂｆ（３）を、第３段の転置ブルームフィルタ列ｔＢＦ（３）の中から特定する。具体的には、管理サーバＭは、各ハッシュ値ｘ１〜ｘ３を、第３段の転置ブルームフィルタ列ｔＢＦ（３）の配列数である３２で割り算し、余り値を算出する。
【００８７】
ハッシュ値ｘ１の余り値は「２」、ハッシュ値ｘ２の余り値は「１９」、ハッシュ値ｘ３の余り値は「２７」になったものとする。したがって、第３段での更新対象となる転置ブルームフィルタｔｂｆ（３）は、転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−１９），ｔｂｆ（３−２７）となる。
【００８８】
つぎに、転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−１９），ｔｂｆ（３−２７）内の更新対象ビット位置を決める。第２段と同様、第（ｐ−１）段の更新対象のブルームフィルタｂｆ（（ｐ−１）−＃）の配列番号＃ではなく、第（ｐ−１）段での更新対象ビット位置を分割数ｄで割り算し、端数を切り上げる。
【００８９】
第３段の場合、前段である第２段での更新対象ビットは、先頭から２ビット目のビットであり、転置ブルームフィルタｔｂｆ（２−８），ｔｂｆ（２−１１），ｔｂｆ（２−１３）の２ビット目がＯＮにされた。したがって、第３段の更新対象ビットは、ｄ＝２であるため、先頭から２／ｄ＝１ビット目を更新対象ビット位置とする。
【００９０】
本例では、転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−１９），ｔｂｆ（３−２７）の先頭から１ビット目が更新対象ビット位置となる。そして、管理サーバＭは、第１段、第２段と同様、転置ブルームフィルタｔｂｆのビット幅（第３段は２ビット）と対応テーブルＴを用いることで、第３段での更新対象となる転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−１９），ｔｂｆ（３−２７）を有するノードＮ１，Ｎ３，Ｎ４を特定する。そして、管理サーバＭは、ノードＮ１，Ｎ３，Ｎ４に更新対象ビット位置を通知する。
【００９１】
通知を受けたノードＮ１，Ｎ３，Ｎ４は、更新対象となる転置ブルームフィルタｔｂｆ（３）の先頭から１ビット目のビットをＯＮにする。これにより、第３段の転置ブルームフィルタ列ｔＢＦ（３）のフィルタエントリ処理を終了する。
【００９２】
（登録元コンピュータによるエントリ処理手順）
図６は、実施の形態にかかる登録元コンピュータによるエントリ処理手順例を示すフローチャートである。エントリ処理を実行するコンピュータ（たとえば、管理サーバＭまたはクライアント。以下、単に「登録元コンピュータ」。）は、登録したい対象データ（たとえば、図５に示した対象データＤｘ）があるか否かを判断する（ステップＳ６０１）。対象データＤｘがある場合（ステップＳ６０１：Ｙｅｓ）、登録元コンピュータは、ｋ種類のハッシュ関数（Ｈ１（）を含む）のそれぞれに対象データを与えてｋ個のハッシュ値を算出する（ステップＳ６０２）。そして、登録元コンピュータは、段数ｐをｐ＝１に設定し（ステップＳ６０３）、データエントリ処理（ステップＳ６０４）およびフィルタエントリ処理（ステップＳ６０５）を実行する。
【００９３】
その後、ステップＳ６０１に戻る。そして、コンピュータは、登録したい対象データがない場合（ステップＳ６０１：Ｎｏ）、エントリ処理を終了する。これにより、図５に示したように、対象データＤｘについてデータエントリ処理とフィルタエントリ処理が実行され、対象データＤｘについて検索可能状態となる。
【００９４】
（データエントリ処理手順）
図７は、図６に示したデータエントリ処理の詳細な処理手順例を示すフローチャートである。図７において、まず、登録元コンピュータは、対象データＤｘのハッシュテーブルエントリを生成する（ステップＳ７０１）。たとえば、登録元コンピュータは、図５に示したように、ハッシュテーブルエントリＥｘを生成する。
【００９５】
つぎに、登録元コンピュータは、登録先ノードを指定する（ステップＳ７０２）。具体的には、たとえば、管理サーバＭの利用者が入力装置を操作することで任意に指定することができる。また、あらかじめ各ノードの空き容量に応じて、エントリさせるノードを指定することとしてもよい。図５に示した例では、ノードＮ２が指定されている。
【００９６】
そして、登録元コンピュータは、登録先ノードにデータエントリリクエスト８０１を送信し（ステップＳ７０３）、データエントリリクエスト８０１に対する登録先ノードからのリプライを待ち受ける（ステップＳ７０４）。
【００９７】
図８は、データエントリリクエスト８０１およびリプライのデータ構造例を示す説明図である。図８において、（Ａ）はデータエントリリクエスト８０１、（Ｂ）はリプライ８０２を示す。図８のデータ構造例は、図５のデータエントリ処理例に対応している。（Ａ）のデータエントリリクエスト８０１のヘッダは、データエントリリクエスト８０１の送信元アドレスと宛先アドレスとを保持する。図８では、コンピュータに割り当てた符号Ｍ，Ｎ２をアドレスの代わりに表記している。
【００９８】
また、（Ａ）のデータエントリリクエスト８０１のペイロードは、種類項目、属性項目、ハッシュ値項目、登録データ項目に対しそれぞれの情報が保持されている。たとえば、種類項目には、「登録」、属性項目には「データエントリ」、ハッシュ値項目には「ｘ１」、登録データ項目には、「Ｄｘ」が保持されている。
【００９９】
また、（Ｂ）のリプライ８０２のヘッダは、データエントリリクエスト８０１の送信元アドレスと宛先アドレスとが入れ替わった送信元アドレスと宛先アドレスとを保持する。（Ｂ）のリプライ８０２のペイロードは、登録データである対象データＤｘが登録されたデータブロックｄｂ４のブロック番号「４」が保持されている。
【０１００】
図７に戻り、リプライ８０２が受信されていない場合（ステップＳ７０４：Ｎｏ）、登録元コンピュータは、データエントリリクエスト８０１の送信から所定時間経過したか否かを判断する（ステップＳ７０５）。所定時間経過していない場合（ステップＳ７０５：Ｎｏ）、ステップＳ７０４に戻る。一方、所定時間経過した場合（ステップＳ７０５：Ｙｅｓ）、登録元コンピュータは、エラー出力をおこなう（ステップＳ７０６）。たとえば、ディスプレイ４０８に、データエントリできなかった旨の表示をおこなう。
【０１０１】
一方、リプライ８０２が受信された場合（ステップＳ７０４：Ｙｅｓ）、フィルタエントリ処理（ステップＳ６０５）を実行することとなる。このデータエントリ処理（ステップＳ６０４）により、対象データＤｘが、指定された登録先ノードに、対象データＤｘのハッシュ値と関連付けられて登録されることとなる。
【０１０２】
（フィルタエントリ処理）
図９は、図６に示したフィルタエントリ処理の詳細な処理手順例を示すフローチャートである。図９において、まず、登録元コンピュータは、図７のステップＳ７０４で受信したリプライ８０２から登録先データブロックのブロック番号を抽出する（ステップＳ９０１）。図８の（Ｂ）に示した例では、「４」が抽出される。
【０１０３】
つぎに、登録元コンピュータは、ｐ＞ｈ（ｈは階層型分割転置ブルームフィルタ群の最上段）であるか否かを判断する（ステップＳ９０２）。ｐ＞ｈでない場合（ステップＳ９０２：Ｎｏ）、登録元コンピュータは、ｋ個のハッシュ値を第ｐ段の転置ブルームフィルタｔｂｆ（ｐ）の配列数で除算して、ｋ個の余り値を算出する（ステップＳ９０３）。なお、階層型転置ブルームフィルタｔＢＦのビット幅ｓと段ごとの転置ブルームフィルタの配列数については登録元コンピュータに保持されているものとする。
【０１０４】
そして、登録元コンピュータは、ｋ個の余り値と同一配列番号のｋ個の転置ブルームフィルタｔｂｆ（ｐ）を特定する（ステップＳ９０４）。このあと、ｐ＝１であるか否かを判断し（ステップＳ９０５）、ｐ＝１である場合（ステップＳ９０５：Ｙｅｓ）、登録元コンピュータは、ステップＳ９０１で抽出された登録先データブロックのブロック番号を、エントリすべきブロック番号として特定する（ステップＳ９０６）。図５の例では、ブロック番号は「４」であるため、エントリすべきブロック番号は「４」である。
【０１０５】
一方、ｐ≠１である場合（ステップＳ９０５：Ｎｏ）、登録元コンピュータは、特定されたｋ個の転置ブルームフィルタｔｂｆ（ｐ）に、対象データＤｘの第（ｐ−１）段での更新対象ビット位置（エントリ番号ｅ（ｐ−１））を分割数ｄで除算した商（端数切り上げ）を、エントリすべきブロック番号として特定する（ステップＳ９０７）。図５の例において、第２段の場合、第１段での更新対象ビット位置である「４」を、転置前の最上段の分割数＝２で除算した商「２」がエントリすべきブロック番号となる。
【０１０６】
ステップＳ９０６またはＳ９０７のあと、登録元コンピュータは、転置ブルームフィルタｔｂｆ（ｐ）を有するノードを特定する（ステップＳ９０８）。第１段を例に挙げると、第１段の転置ブルームフィルタｔｂｆのビット幅は８ビットであるため、先頭から２番目の転置ブルームフィルタｔｂｆ（１−２）のインデックス範囲は、９ビット目から１６ビット目となる。このインデックス範囲は、対応テーブルＴを参照することで、ノードＮ１のインデックス範囲であると特定される。
【０１０７】
そして、登録元コンピュータは、ステップＳ９０８での特定先ノードに対し、フィルタエントリリクエストを配信し（ステップＳ９０９）、リプライ８０２（ＡＣＫ）を待ち受ける（ステップＳ９１０）。
【０１０８】
図１０は、フィルタエントリリクエストのデータ構造例を示す説明図である。図１０のデータ構造例は、図５の第１段でのデータエントリ処理例に対応している。フィルタエントリリクエスト１０００のヘッダは、フィルタエントリリクエスト１０００の送信元アドレスと宛先アドレスとを保持する。図１０では、コンピュータに割り当てた符号Ｍ，Ｎ１をアドレスの代わりに表記している。
【０１０９】
また、フィルタエントリリクエスト１０００のペイロードは、種類項目、属性項目、特定先転置ブルームフィルタ項目、特定先ブロック番号項目に対しそれぞれの情報が保持されている。たとえば、種類項目には、「登録」、属性項目には「フィルタエントリ」、転置ブルームフィルタ項目には特定された転置ブルームフィルタの識別子「ｔｂｆ（１−２）」（特定先ノード（宛先）がＮ１のため）、特定先ブロック番号項目には、「４」が保持されている。
【０１１０】
転置ブルームフィルタ項目において、特定された転置ブルームフィルタの識別子としては、特定された転置ブルームフィルタのビット位置を示すインデックス範囲が挙げられる。たとえば、ｔｂｆ（１−２）の場合は、９ビット目〜１６ビット目となる。
【０１１１】
図９に戻り、リプライが受信されていない場合（ステップＳ９１０：Ｎｏ）、登録元コンピュータは、フィルタエントリリクエスト１０００の送信から所定時間経過したか否かを判断する（ステップＳ９１１）。所定時間経過していない場合（ステップＳ９１１：Ｎｏ）、ステップＳ９１０に戻る。一方、所定時間経過した場合（ステップＳ９１１：Ｙｅｓ）、登録元コンピュータは、エラー出力をおこなう（ステップＳ９１２）。たとえば、ディスプレイに、フィルタエントリできなかった旨の表示をおこなう。
【０１１２】
一方、リプライが受信された場合（ステップＳ９１０：Ｙｅｓ）、登録元コンピュータは、段数ｐを１つインクリメントし（ステップＳ９１３）、ステップＳ９０２に戻る。そして、登録元コンピュータは、ｐ＞ｈと判断した場合（ステップＳ９０２：Ｙｅｓ）、ステップＳ６０１に戻ることで、フィルタエントリ処理（ステップＳ６０５）を終了する。このフィルタエントリ処理（ステップＳ６０５）により、対象データを検索するためのフィルタが設定されることとなる。
【０１１３】
（ノードによるエントリ処理）
図１１は、実施の形態にかかるノードによるエントリ処理の詳細な処理手順例を示すフローチャートである。図１１の処理手順は、複数のノード（ノードＮ１〜Ｎ４）のいずれのノードでも実行される処理手順である。
【０１１４】
まず、ノードは、リクエストの受信を待ち受ける（ステップＳ１１０１：Ｎｏ）。リクエストが受信された場合（ステップＳ１１０１：Ｙｅｓ）、ノードは、リクエストの種類を特定する（ステップＳ１１０２）。具体的には、リクエスト内の種類項目が「登録」または「検索」であるかを特定する。
【０１１５】
「登録」である場合（ステップＳ１１０２：登録）、ノードは、属性を特定する（ステップＳ１１０３）。具体的には、リクエスト内の属性項目が「データエントリ」または「フィルタエントリ」であるかを特定する。「データエントリ」の場合（ステップＳ１１０３：データエントリ）、受信したリクエストがデータエントリリクエスト８０１であると判明する。この場合、ノードは、データエントリリクエスト８０１の登録データ項目内のデータを、保持しているいずれかのデータブロックに登録する（ステップＳ１１０４）。
【０１１６】
また、ノードは、データエントリリクエスト８０１のハッシュ値項目内のハッシュ値をハッシュテーブルに登録し、ステップＳ１１０４で登録されたデータおよびハッシュ値を関連付ける（ステップＳ１１０５）。このあと、ノードは、登録先データブロックのブロック番号を含むリプライ８０２を、データエントリリクエスト８０１の送信元に返す（ステップＳ１１０６）。これにより、ノードによるデータエントリ処理が終了する。
【０１１７】
一方、ステップＳ１１０３において、属性が「フィルタエントリ」である場合（ステップＳ１１０３：フィルタエントリ）、受信したリクエストがフィルタエントリリクエスト１０００であると判明する。この場合、ノードは、転置ブルームフィルタｔｂｆ（ｐ）の特定先ブロック番号をエントリする（ステップＳ１１０７）。具体的には、ノードは、フィルタエントリリクエスト１０００の転置ブルームフィルタ項目で特定される転置ブルームフィルタｔｂｆ（ｐ）において、特定先ブロック番号が更新対象ビット位置であるとして、更新対象ビット位置のビットをＯＮにする。
【０１１８】
このあと、ノードは、エントリした旨のリプライを、フィルタエントリリクエスト１０００の送信元に返す（ステップＳ１１０８）。これにより、ノードによるフィルタエントリ処理が終了する。なお、「検索」の場合（ステップＳ１１０２：検索）以降の処理手順Ｓ１１０９〜Ｓ１１１５については後述する。
【０１１９】
＜検索処理例＞
つぎに、検索処理について説明する。検索処理では、検索対象データが与えられると、階層型分割転置ブルームフィルタ群で絞り込むことで、検索対象データがノード群に存在するか否かを特定する処理である。以下、図１２〜図１４を用いて説明する。図１２〜図１４では、図１に示した階層型転置ブルームフィルタ群（ｔＢＦ１〜ｔＢＦ４）を例にあげて説明する。また、検索処理を実行する検索元コンピュータは、管理サーバＭまたはいずれかのクライアントＣ１〜Ｃ３となるが、ここでは一例としてクライアントＣ１とする。
【０１２０】
図１２〜図１４は、検索処理例を示す説明図である。図１２〜図１４では、説明上、図１に示したように、全ビット幅ｓ＝６４ビット、段数ｈ＝３段、転置前の第ｈ段での分割数ｄ＝２とする。
【０１２１】
図１２において、最上段である第３段のブルームフィルタ列ＢＦ（３）を構成するブルームフィルタのビット幅は、３２（＝ｓ／ｄh＝６４／２1）ビットである。このため、最上段である第３段の転置ブルームフィルタ列ｔＢＦ（３）は、３２（＝ｓ／ｄh＝６４／２1）個の転置ブルームフィルタｔｂｆ（３−１）〜ｔｂｆ（３−３２）により構成される。
【０１２２】
図１３において、第２段の転置ブルームフィルタ列ｔＢＦ（２）を構成するブルームフィルタのビット幅は、１６（＝ｓ／ｄh＝６４／２2）ビットである。このため、第２段の転置ブルームフィルタ列ｔＢＦ（２）は、１６（＝ｓ／ｄh＝６４／２2）個の転置ブルームフィルタｔｂｆ（２−１）〜ｔｂｆ（２−１６）により構成される。
【０１２３】
図１４において、最下段である第１段のブルームフィルタ列ＢＦ（１）を構成するブルームフィルタのビット幅は、８（＝ｓ／ｄh＝６４／２3）ビットである。このため、最下段である第１段の転置ブルームフィルタ列ｔＢＦ（１）は、８（＝ｓ／ｄh＝６４／２3）個の転置ブルームフィルタｔｂｆ（１−１）〜ｔｂｆ（１−８）により構成される。
【０１２４】
なお、図１２〜図１４では、説明上、比較のため、転置ブルームフィルタ列ｔＢＦ（１）〜ｔＢＦ（３）とともに、転置前のブルームフィルタ列ＢＦ（１）〜ＢＦ（３）を併記しておく。
【０１２５】
まず、図１２において、クライアントＣ１は、検索対象データＤｘについてのハッシュ関数Ｈ１（）〜Ｈ３（）での３個のハッシュ値を、第３段の転置ブルームフィルタ数３２で割り算したときの余り値「２」、「５」、「２２」を求める。
【０１２６】
つぎに、クライアントＣ１は、フィルタリング対象となる転置ブルームフィルタを第３段の転置ブルームフィルタ列ｔＢＦ（３）から特定する。具体的には、余り値と同一ビット位置（余り値が０の場合は末尾位置）となる転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−５），ｔｂｆ（３−２２）を特定する。
【０１２７】
第３段の転置ブルームフィルタｔｂｆ（３−１）〜ｔｂｆ（３−３２）は、３２個であるため、全ビット幅ｓ＝６４ビットを３２個で割ることで、第３段の転置ブルームフィルタ１個あたりのビット幅は２ビットである。このことから、クライアントＣ１は、先頭から２番目の転置ブルームフィルタｔｂｆ（３−２）のインデックス範囲を、３ビット目〜４ビット目であることを割り出す。
【０１２８】
これにより、クライアントＣ１は、対応テーブルＴを参照することで、転置ブルームフィルタｔｂｆ（３−２）がノードＮ１に所属することが判明する。転置ブルームフィルタｔｂｆ（３−５），ｔｂｆ（３−２２）についても同様に処理することで、転置ブルームフィルタｔｂｆ（３−５）はノードＮ１に所属することが判明し、転置ブルームフィルタｔｂｆ（３−２２）は、ノードＮ３に所属することが判明する。
【０１２９】
そして、クライアントＣ１は、特定された転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−５），ｔｂｆ（３−２２）が所属するノードＮ１，Ｎ３に対し、ＡＮＤ演算要求のリクエストを配信する。当該リクエストを受けたノードＮ１，Ｎ３は、特定された転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−５），ｔｂｆ（３−２２）のＡＮＤ演算を実行する。
【０１３０】
具体的には、たとえば、ノードＮ１は、所属する転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−５）のＡＮＤ演算を実行する。図１２の場合、ＡＮＤ結果ｒ３−１は、ｒ３−１＝｛１０｝となる。ノードＮ１は、ＡＮＤ結果ｒ３−１をクライアントＣ１に返す。同様に、ノードＮ３の特定された所属転置ブルームフィルタはｔｂｆ（３−２２）だけなので、ＡＮＤ結果ｒ３−３は、ｒ３−３＝ｔｂｆ（３−２２）＝｛１０｝となる。ノードＮ３は、ＡＮＤ結果ｒ３−３をクライアントＣ１に返す。このように、必要なノードのみＡＮＤ演算が実行されるため、検索処理の効率化を図ることができる。
【０１３１】
また、クライアントＣ１では、ノードＮ１，Ｎ３から返ってきたＡＮＤ結果ｒ３−１，ｒ３−３のＡＮＤ演算を実行し、ＡＮＤ結果Ｒ３＝｛１０｝を得る。クライアントＣ１は、ＡＮＤ結果Ｒ３に「１」が含まれていない場合は、いずれのデータブロックｄｂ１〜ｄｂ８にも検索対象データＤｘが存在しないと判定する。一方、ＡＮＤ結果Ｒ３に「１」が含まれている場合、検索対象データＤｘを登録したかもしれないため、１つ下の段に移る。図１２の場合、ＡＮＤ結果Ｒ３にはビット位置が１ビット目において「１」が存在するため、１つ下の第２段（図１３を参照）に移行する。
【０１３２】
つぎに、図１３において、第２段においても、まず、クライアントＣ１は、検索対象データＤｘについての３個のハッシュ値を、第２段の転置ブルームフィルタ数１６で割り算したときの余り値「６」、「８」、「１３」を求める。
【０１３３】
つぎに、クライアントＣ１は、フィルタリング対象となる転置ブルームフィルタを第２段の転置ブルームフィルタ列ｔＢＦ（２）から特定する。具体的には、余り値と同一ビット位置（余り値が０の場合は末尾位置）となる転置ブルームフィルタｔｂｆ（２−６），ｔｂｆ（２−８），ｔｂｆ（２−１３）を特定する。
【０１３４】
第２段の転置ブルームフィルタｔｂｆ（２−１）〜ｔｂｆ（２−１６）は、１６個であるため、全ビット幅ｓ＝６４ビットを１６個で割ることで、第２段の転置ブルームフィルタ１個あたりのビット幅は４ビットである。このことから、クライアントＣ１は、先頭から６番目の転置ブルームフィルタｔｂｆ（２−６）のインデックス範囲を、２１ビット目〜２４ビット目であることを割り出す。
【０１３５】
これにより、クライアントＣ１は、対応テーブルＴを参照することで、転置ブルームフィルタｔｂｆ（２−６）がノードＮ２に所属することが判明する。転置ブルームフィルタｔｂｆ（２−８），ｔｂｆ（２−１３）についても同様に処理することで、転置ブルームフィルタｔｂｆ（２−８）はノードＮ２に所属することが判明し、転置ブルームフィルタｔｂｆ（２−１３）は、ノードＮ４に所属することが判明する。
【０１３６】
そして、クライアントＣ１は、特定された転置ブルームフィルタｔｂｆ（２−６），ｔｂｆ（２−８），ｔｂｆ（２−１３）が所属するノードＮ２，Ｎ４に対し、ＡＮＤ演算要求のリクエストを配信する。当該リクエストを受けたノードＮ２，Ｎ４は、特定された転置ブルームフィルタｔｂｆ（２−６），ｔｂｆ（２−８），ｔｂｆ（２−１３）のＡＮＤ演算を実行する。
【０１３７】
具体的には、たとえば、ノードＮ２は、所属する転置ブルームフィルタｔｂｆ（２−６），ｔｂｆ（２−８）のＡＮＤ演算を実行する。図１３の場合、ＡＮＤ結果ｒ２−２は、ｒ２−２＝｛０１００｝となる。ノードＮ２は、ＡＮＤ結果ｒ２−２をクライアントＣ１に返す。同様に、ノードＮ４の特定された所属転置ブルームフィルタはｔｂｆ（２−１３）だけなので、ＡＮＤ結果ｒ２−４は、ｒ２−４＝ｔｂｆ（２−１３）＝｛０１００｝となる。ノードＮ４は、ＡＮＤ結果ｒ２−４をクライアントＣ１に返す。このように、必要なノードのみＡＮＤ演算が実行されるため、検索処理の効率化を図ることができる。
【０１３８】
また、クライアントＣ１では、ノードＮ２，Ｎ４から返ってきたＡＮＤ結果ｒ２−２，ｒ２−４のＡＮＤ演算を実行し、ＡＮＤ結果Ｒ２＝｛０１００｝を得る。クライアントＣ１は、ＡＮＤ結果Ｒ２に「１」が含まれていない場合は、いずれのデータブロックｄｂ１〜ｄｂ８にも検索対象データＤｘが存在しないと判定する。一方、ＡＮＤ結果Ｒ２に「１」が含まれている場合、検索対象データＤｘを登録したかもしれないため、１つ下の段に移る。図１３の場合、ＡＮＤ結果Ｒ２にはビット位置が２ビット目において「１」が存在するため、１つ下の第１段（図１４を参照）に移行する。
【０１３９】
つぎに、図１４において、第１段においても、まず、クライアントＣ１は、検索対象データＤｘについての３個のハッシュ値を、第１段の転置ブルームフィルタ数８で割り算したときの余り値「１」、「２」、「７」を求める。
【０１４０】
つぎに、クライアントＣ１は、フィルタリング対象となる転置ブルームフィルタを第１段の転置ブルームフィルタ列ｔＢＦ（１）から特定する。具体的には、余り値と同一ビット位置（余り値が０の場合は末尾位置）となる転置ブルームフィルタｔｂｆ（１−１），ｔｂｆ（１−２），ｔｂｆ（１−７）を特定する。
【０１４１】
第１段の転置ブルームフィルタｔｂｆ（１−１）〜ｔｂｆ（１−８）は、８個であるため、全ビット幅ｓ＝６４ビットを８個で割ることで、第１段の転置ブルームフィルタ１個あたりのビット幅は８ビットである。このことから、クライアントＣ１は、先頭から１番目の転置ブルームフィルタｔｂｆ（１−１）のインデックス範囲を、１ビット目〜８ビット目であることを割り出す。
【０１４２】
これにより、クライアントＣ１は、対応テーブルＴを参照することで、転置ブルームフィルタｔｂｆ（１−１）がノードＮ１に所属することが判明する。転置ブルームフィルタｔｂｆ（１−２），ｔｂｆ（１−７）についても同様に処理することで、転置ブルームフィルタｔｂｆ（１−２）はノードＮ１に所属することが判明し、転置ブルームフィルタｔｂｆ（１−７）は、ノードＮ４に所属することが判明する。
【０１４３】
そして、クライアントＣ１は、特定された転置ブルームフィルタｔｂｆ（１−１），ｔｂｆ（１−２），ｔｂｆ（１−７）が所属するノードＮ１，Ｎ４に対し、ＡＮＤ演算要求のリクエストを配信する。当該リクエストを受けたノードＮ１，Ｎ４は、特定された転置ブルームフィルタｔｂｆ（１−１），ｔｂｆ（１−２），ｔｂｆ（１−７）のＡＮＤ演算を実行する。
【０１４４】
具体的には、たとえば、ノードＮ１は、所属する転置ブルームフィルタｔｂｆ（１−１），ｔｂｆ（１−２）のＡＮＤ演算を実行する。図１４の場合、ＡＮＤ結果ｒ１−１は、ｒ１−１＝｛００１１００１０｝となる。ノードＮ１は、ＡＮＤ結果ｒ１−１をクライアントＣ１に返す。同様に、ノードＮ４の特定された所属転置ブルームフィルタはｔｂｆ（１−７）だけなので、ＡＮＤ結果ｒ１−４は、ｒ１−４＝ｔｂｆ（１−７）＝｛０００１００１０｝となる。ノードＮ４は、ＡＮＤ結果ｒ１−４をクライアントＣ１に返す。このように、必要なノードのみＡＮＤ演算が実行されるため、検索処理の効率化を図ることができる。
【０１４５】
また、クライアントＣ１では、ノードＮ１，Ｎ４から返ってきたＡＮＤ結果ｒ１−１，ｒ１−４のＡＮＤ演算を実行し、ＡＮＤ結果Ｒ１＝｛０００１００１０｝を得る。クライアントＣ１は、ＡＮＤ結果Ｒ１に「１」が含まれていない場合は、いずれのデータブロックｄｂ１〜ｄｂ８にも検索対象データＤｘが存在しないと判定する。一方、ＡＮＤ結果Ｒ１に「１」が含まれている場合、検索対象データＤｘを登録したかもしれないため、１つ下の段に移る。図１４の場合、ＡＮＤ結果Ｒ１にはビット位置が４ビット目および７ビット目において「１」が存在する。
【０１４６】
この場合、これ以上下の段は存在しないため、擬陽性により、ＡＮＤ結果Ｒ１＝｛０００１００１０｝が「１」のビット位置４，７に対応するデータブロックｄｂ４，ｄｂ７に検索対象データＤｘが存在する可能性がある。
【０１４７】
データブロックｄｂ４，ｄｂ７のインデックス範囲は、第１段の転置ブルームフィルタｔｂｆ（１−４），ｔｂｆ（１−７）と同一である。したがって、クライアントＣ１は、先頭から４番目の転置ブルームフィルタｔｂｆ（１−４）のインデックス範囲を、２５ビット目〜３２ビット目であることを割り出す。同様に、クライアントＣ１は、転置ブルームフィルタｔｂｆ（１−７）のインデックス範囲を、４９ビット目〜５６ビット目であることを割り出す。
【０１４８】
これにより、データブロックｄｂ４がノードＮ２に所属し、データブロックｄｂ７がノードＮ４に所属することが判明する。したがって、クライアントＣ１は、ノードＮ２，Ｎ４に対しハッシュテーブル検索のリクエストを配信する。当該リクエストを受けたノードＮ２，Ｎ４は、それぞれ該当するハッシュテーブルＨＴ４，ＨＴ７を検索して、リクエストに含まれているＨ１（）のハッシュ値に対応するデータを検索する。
【０１４９】
図１４の例では、ノードＮ２のデータブロックｄｂ４に検索対象データＤｘが記憶されているため、ノードＮ２は、検索対象データＤｘが存在する旨をクライアントＣ１に返す。たとえば、検索対象データＤｘが辞書の見出し語である場合は、検索対象データＤｘに関連付けて記憶されている解説文データも読み出して検索結果としてクライアントＣ１に返してもよい。
【０１５０】
一方、ノードＮ４のデータブロックｄｂ７に検索対象データＤｘが記憶されていないため、ノードＮ４は、検索対象データＤｘが存在しない旨をクライアントＣ１に返す。なお、クライアントＣ１がデータブロックｄｂ４について先にリクエストを送った場合、検索対象データＤｘが存在する旨の検索結果が得られるため、ノードＮ４に対してリクエストを送信しなくてもよい。これにより、検索処理の高速化を実現することができる。このような手順により、クライアントＣ１は、階層型分割転置ブルームフィルタ群を利用することで、より高速かつ広範囲で対象データを検索することができる。
【０１５１】
（検索元コンピュータによるエントリ処理手順）
図１５は、実施の形態にかかる検索元コンピュータによる検索処理手順例を示すフローチャート（前半）である。検索処理を実行するコンピュータ（たとえば、管理サーバＭまたはクライアント。以下、単に「検索元コンピュータ」。）は、検索対象データＤｘを待ち受け（ステップＳ１５０１：Ｎｏ）、検索対象データＤｘが受け付けられた場合（ステップＳ１５０１：Ｙｅｓ）、検索元コンピュータは、検索対象データＤｘをｋ種類のハッシュ関数に与えてｋ個のハッシュ値を算出する（ステップＳ１５０２）。
【０１５２】
そして、検索元コンピュータは、ｐ＝ｈ、すなわち、段数ｐを最大段数ｈに設定し（ステップＳ１５０３）、検索元コンピュータは、ｋ個のハッシュ値をｐ段目の転置ブルームフィルタｔｂｆ（ｐ）の配列数で除算して、ｋ個の余り値を算出する（ステップＳ１５０４）。そして、検索元コンピュータは、ｐ段目の転置ブルームフィルタ列ｔＢＦ（ｐ）から、ｋ個の余り値に対応するｋ個の転置ブルームフィルタｔｂｆ（ｐ）を特定する（ステップＳ１５０５）。
【０１５３】
そして、検索元コンピュータは、ｋ個の転置ブルームフィルタｔｂｆ（ｐ）が所属するノードを、対応テーブルＴを参照することで特定する（ステップＳ１５０６）。このあと、検索元コンピュータは、ステップＳ１５０６での特定先ノードに対し、ＡＮＤ演算要求のリクエストを配信し（ステップＳ１５０７）、特定先ノードからのリプライを待ち受ける（ステップＳ１５０８）。
【０１５４】
図１６は、ＡＮＤ演算要求のリクエストおよびリプライのデータ構造例を示す説明図である。図１６において、（Ａ）はＡＮＤ演算要求のリクエスト１６０１、（Ｂ）はリプライ１６０２を示す。図１６のデータ構造例は、図１２〜図１４の検索処理例に対応している。（Ａ）のＡＮＤ演算要求のリクエスト１６０１のヘッダは、ＡＮＤ演算要求のリクエスト１６０１の送信元アドレスと宛先アドレスとを保持する。図１６では、コンピュータに割り当てた符号Ｃ１，Ｎ１をアドレスの代わりに表記している。
【０１５５】
また、（Ａ）のＡＮＤ演算要求のリクエスト１６０１のペイロードは、種類項目、属性項目、特定先転置ブルームフィルタ項目に対しそれぞれの情報が保持されている。たとえば、種類項目には、「検索」、属性項目には「ＡＮＤ演算要求」、特定先転置ブルームフィルタ項目には、特定された転置ブルームフィルタの識別子「ｔｂｆ（３−２），ｔｂｆ（３−５）」が保持されている。特定された転置ブルームフィルタの識別子としては、特定された転置ブルームフィルタのビット位置を示すインデックス範囲が挙げられる。たとえば、ｔｂｆ（３−２）の場合は、３ビット目〜４ビット目となる。
【０１５６】
また、（Ｂ）のリプライ１６０２のヘッダは、ＡＮＤ演算要求のリクエスト１６０１の送信元アドレスと宛先アドレスとが入れ替わった送信元アドレスと宛先アドレスとを保持する。（Ｂ）のリプライ１６０２のペイロードには、特定先ノードＮ１でのＡＮＤ結果ｒ３−１＝｛１０｝が保持されている。
【０１５７】
図１５に戻り、リプライ１６０２が受信されていない場合（ステップＳ１５０８：Ｎｏ）、検索元コンピュータは、ＡＮＤ演算要求のリクエスト１６０１の送信から所定時間経過したか否かを判断する（ステップＳ１５０９）。所定時間経過していない場合（ステップＳ１５０９：Ｎｏ）、ステップＳ１５０８に戻る。一方、所定時間経過した場合（ステップＳ１５０９：Ｙｅｓ）、検索元コンピュータは、エラー出力をおこなう（ステップＳ１５１０）。たとえば、ディスプレイ４０８に、ＡＮＤ演算要求できなかった旨の表示をおこなう。
【０１５８】
一方、リプライ１６０２が受信された場合（ステップＳ１５０８：Ｙｅｓ）、検索元コンピュータは、各リプライ１６０２に含まれているＡＮＤ結果についてＡＮＤ演算を実行する（ステップＳ１５１１）。たとえば、図１６に示したように、ノードＮ１からのリプライ１６０２に含まれているＡＮＤ結果ｒ３−１とノードＮ３からのリプライ（不図示）に含まれているＡＮＤ結果ｒ３−３のＡＮＤ演算を実行してＡＮＤ結果Ｒ３を得る。このあと、図１７のステップＳ１７０１に移行する。
【０１５９】
図１７は、実施の形態にかかる検索元コンピュータによる検索処理手順例を示すフローチャート（後半）である。検索元コンピュータは、ステップＳ１５１１のＡＮＤ演算のあと、当該ＡＮＤ結果の先頭ビットを対象ビットに設定する（ステップＳ１７０１）。たとえば、上述のＡＮＤ結果Ｒ３＝｛１０｝の場合、先頭ビット「１」を対象ビットに設定する。
【０１６０】
つぎに、検索元コンピュータは、対象ビットがＯＮ（＝１）であるか否かを判断する（ステップＳ１７０２）。ＯＮでない（対象ビット＝０）場合（ステップＳ１７０２：Ｎｏ）、検索元コンピュータは、後続ビットへシフト可能か否かを判断する（ステップＳ１７０３）。具体的には、対象ビットが末尾ビットであるか否かを判断する。上述のＡＮＤ結果Ｒ３＝｛１０｝の場合、対象ビットが先頭ビット「１」である場合、シフト可能となり、対象ビットが末尾ビット「０」である場合、シフト不可能と判断する。
【０１６１】
シフト可能である場合（ステップＳ１７０３：Ｙｅｓ）、検索元コンピュータは、対象ビットを１ビット末尾方向へシフトし（ステップＳ１７０４）、ステップＳ１７０２に戻る。一方、ステップＳ１７０３においてシフト可能でない場合（ステップＳ１７０３：Ｎｏ）、検索元コンピュータは、検索結果（陰性）と判定し、その旨を出力する（ステップＳ１７０５）。検索結果（陰性）である場合、検索対象データＤｘは、ノード群には存在しないデータであることがわかる。これにより、検索結果が陰性である場合の処理手順を終了する。
【０１６２】
一方、ステップＳ１７０２において、対象ビットがＯＮであった場合（ステップＳ１７０２：Ｙｅｓ）、検索元コンピュータは、現在の段数ｐがｐ＝１であるか否かを判断する（ステップＳ１７０６）。ｐ＝１でない場合（ステップＳ１７０６：Ｎｏ）、ｐを１つデクリメントして（ステップＳ１７０７）、図１５のステップＳ１５０４に戻る。これにより、第１段になるまで、ステップＳ１５０４〜Ｓ１５１１、Ｓ１７０１〜Ｓ１７０５が繰り返し実行（ただし、図１５および図１７でＥＮＤになればその時点で終了）されることになる。
【０１６３】
一方、ｐ＝１である場合（ステップＳ１７０６：Ｙｅｓ）、検索元コンピュータは、登録先ノード候補を特定する（ステップＳ１７０８）。具体的には、たとえば、図１４に示したように、クライアントＣ１が第１段でのＡＮＤ結果Ｒ１においてステップＳ１７０２でＯＮになったビット位置「４」で指定されるデータブロックｄｂ４の所属ノードＮ２を、登録先ノード候補として特定する。
【０１６４】
より具体的には、データブロックｄｂ４に対応する転置ブルームフィルタｔｂｆ（１−４）のインデックス範囲（２５ビット目〜３２ビット目）から、対応テーブルＴを参照することで、登録先ノード候補であるノードＮ２を割り出すことになる。そして、検索元コンピュータは、登録先ノード候補に、ハッシュテーブル検索のリクエストを送信し（ステップＳ１７０９）、リプライを待ち受ける（ステップＳ１７１０）。
【０１６５】
図１８および図１９は、ハッシュテーブル検索のリクエストおよびリプライのデータ構造例を示す説明図である。図１８および図１９において、（Ａ）はハッシュテーブル検索のリクエスト１８０１，１９０１、（Ｂ）はリプライ１８０２，１９０２を示す。図１８および図１９のデータ構造例は、図１２〜図１４の検索処理例に対応している。なお、図１８は登録先ノード候補がノードＮ２の場合であり、図１９は登録先ノード候補がノードＮ４の場合である。
【０１６６】
図１８および図１９において、（Ａ）のハッシュテーブル検索のリクエスト１８０１，１９０１のヘッダは、ハッシュテーブル検索のリクエスト１８０１，１９０１の送信元アドレスと宛先アドレスとを保持する。図１８および図１９では、コンピュータに割り当てた符号Ｃ１，Ｎ２，Ｎ４をアドレスの代わりに表記している。
【０１６７】
また、（Ａ）のハッシュテーブル検索のリクエスト１８０１，１９０１のペイロードは、種類項目、属性項目、特定先転置ブルームフィルタ項目に対しそれぞれの情報が保持されている。たとえば、種類項目には、「検索」、属性項目には「ハッシュテーブル検索」、ハッシュ値項目には、検索対象データＤｘのハッシュ関数Ｈ１（）でのハッシュ値「ｘ１」が保持されている。
【０１６８】
また、（Ｂ）のリプライ１８０２，１９０２のヘッダは、ハッシュテーブル検索のリクエスト１８０１，１９０１の送信元アドレスと宛先アドレスとが入れ替わった送信元アドレスと宛先アドレスとを保持する。（Ｂ）のリプライ１８０２，１９０２のペイロードには、図１８の場合は、登録先ノード候補であるノードＮ２での検索結果（Ｄｘあり）、すなわち、陰性である旨が保持されており、図１９の場合は、登録先ノード候補であるノードＮ４での検索結果（Ｄｘなし）が保持されている。
【０１６９】
図１７に戻り、リプライ（たとえば１８０２）が受信されていない場合（ステップＳ１７１０：Ｎｏ）、検索元コンピュータは、ハッシュテーブル検索のリクエスト（たとえば１８０１）の送信から所定時間経過したか否かを判断する（ステップＳ１７１１）。所定時間経過していない場合（ステップＳ１７１１：Ｎｏ）、ステップＳ１７１０に戻る。一方、所定時間経過した場合（ステップＳ１７１１：Ｙｅｓ）、検索元コンピュータは、エラー出力をおこなう（ステップＳ１７１２）。たとえば、ディスプレイ４０８に、ハッシュテーブル検索できなかった旨の表示をおこなう。
【０１７０】
一方、リプライが受信された場合（ステップＳ１７１０：Ｙｅｓ）、検索元コンピュータは、リプライに検索対象データＤｘが存在するか否かを判断する（ステップＳ１７１３）。検索対象データＤｘが存在しない場合（ステップＳ１７１３：Ｎｏ）、ステップＳ１７０３に戻り、対象ビットがシフト可能か否かを判断することとなる。一方、検索対象データＤｘが存在する場合（ステップＳ１７１３：Ｙｅｓ）、検索元コンピュータは、検索結果（陽性）を出力する（ステップＳ１７１４）。なお、検索元コンピュータは、必要に応じてより関連するデータを抽出して検索結果として出力する。これにより、検索結果が陰性である場合の処理手順を終了する。
【０１７１】
（ノードによる検索処理手順）
つぎに、ノードによる検索処理手順について図１１を用いて説明する。図１１において、ノードは、リクエストの受信を待ち受ける（ステップＳ１１０１：Ｎｏ）。リクエストが受信された場合（ステップＳ１１０１：Ｙｅｓ）、ノードは、リクエストの種類を特定する（ステップＳ１１０２）。具体的には、リクエスト内の種類項目が「登録」または「検索」であるかを特定する。
【０１７２】
「検索」である場合（ステップＳ１１０２：検索）、ノードは、属性を特定する（ステップＳ１１０９）。具体的には、リクエスト内の属性項目が「ＡＮＤ演算要求」または「ハッシュテーブル検索」であるかを特定する。「ＡＮＤ演算要求」の場合（ステップＳ１１０９：ＡＮＤ演算要求）、受信したリクエストがＡＮＤ演算要求のリクエスト１６０１であると判明する。この場合、ノードは、ＡＮＤ演算要求のリクエスト１６０１の転置ブルームフィルタ項目内の転置ブルームフィルタの識別子を抽出する（ステップＳ１１１０）。たとえば、図１６の（Ａ）の場合、転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−５）のインデックス範囲をＡＮＤ演算要求のリクエスト１６０１から抽出する。
【０１７３】
そして、ノードは、抽出されたインデックス範囲から所属する転置ブルームフィルタを特定し、ＡＮＤ演算を実行する（ステップＳ１１１１）。上記の例では、転置ブルームフィルタｔｂｆ（３−２），ｔｂｆ（３−５）が特定されるため、ノードＮ１では、ｔｂｆ（３−２）＝｛１０｝と，ｔｂｆ（３−５）＝｛１１｝のＡＮＤ演算を実行し、ＡＮＤ結果ｒ３−１＝｛１０｝を得る。
【０１７４】
このあと、ノードは、ステップＳ１１１１でのＡＮＤ演算によるＡＮＤ結果を含むリプライを、検索元コンピュータに送信して（ステップＳ１１１２）、ノードによる検索処理を終了する。上記の例では、図１６の（Ｂ）に示したように、ノードＮ１は、ＡＮＤ結果ｒ３−１＝｛１０｝を含むリプライ１６０２を返すことになる。
【０１７５】
また、ステップＳ１１０９において、属性が「ハッシュテーブル検索」である場合（ステップＳ１１０９：ハッシュテーブル検索）、受信したリクエストがハッシュテーブル検索のリクエスト１８０１，１９０１であると判明する。この場合、ノードは、ハッシュテーブル検索のリクエスト１８０１，１９０１に含まれているハッシュ関数による検索対象データのハッシュ値を、ハッシュテーブル検索のリクエスト１８０１，１９０１から抽出する（ステップＳ１１１３）。
【０１７６】
たとえば、図１８の（Ａ）の場合、ハッシュテーブル検索のリクエスト１８０１，１９０１に含まれているハッシュ関数Ｈ１（）による検索対象データＤｘのハッシュ値ｘ１を、ハッシュテーブル検索のリクエスト１８０１，１９０１から抽出する。
【０１７７】
そして、ノードは、保持しているハッシュテーブルを参照して、抽出されたハッシュ値に関連付けられているデータを検索し（ステップＳ１１１４）、検索結果をリプライ１８０２，１９０２として、検索元コンピュータに送信する（ステップＳ１１１５）。たとえば、上記の例では、図１８の（Ｂ）に示したように、ノードＮ１は、検索結果（陰性）、すなわち、検索対象データＤｘを含むリプライ１８０２を返すことになる。これにより、ノードによる検索処理を終了する。
【０１７８】
なお、図１１において、リクエストの属性がＡＮＤ演算要求の場合、ステップＳ１１１１において、転置ブルームフィルタｔｂｆ（ｐ）が複数あると、ノードがＡＮＤ演算を実行する内容としたが、各転置ブルームフィルタｔｂｆ（ｐ）（のビット列）をそのままリプライとして検索元コンピュータに返してもよい。これにより、ノードでＡＮＤ演算を実行する必要がなくなり、ノードの負荷低減を図ることができる。
【０１７９】
このように、上述した検索処理では、階層型分割転置ブルームフィルタ群を利用することで、より高速かつ広範囲で対象データを検索することができる。
【０１８０】
以上説明したように、本実施の形態によれば、ブルームフィルタ列ＢＦ（ｐ）を転置して転置ブルームフィルタ列ｔＢＦ（ｐ）とすることで、メモリアクセスが低減され、検索速度が高速化するという効果を奏する。特に、階層型転置ブルームフィルタｔＢＦとすることで、段ごとのメモリアクセスが低減されるため、より高速に検索をおこなうことができる。また、階層型転置ブルームフィルタｔＢＦをビット幅方向に分割して、複数のノードに割り当てているため、管理可能なデータ量の増大化を図ることができる。また、階層型分割転置ブルームフィルタ群を利用することで、より高速かつ広範囲で対象データを検索することができる。
【０１８１】
また、対応テーブルＴを参照することで、検索元コンピュータでは、第ｐ段の転置ブルームフィルタを保持するノードやデータブロックを有するノードを特定することができる。したがって、ノード群以外のコンピュータからでもノード群に対し検索をおこなうことができる。
【０１８２】
また、特定先ノードにおいて、第ｐ段の転置ブルームフィルタが複数存在する場合、ＡＮＤ演算をおこなってＡＮＤ結果を検索元コンピュータにリプライとして返している。このように、ノードにおいて複数の転置ブルームフィルタをＡＮＤ演算することで、ＡＮＤ結果という１個のビット列に圧縮できるため、検索元コンピュータでの演算負荷の低減化を図ることができる。
【０１８３】
これに対し、特定先ノードにおいて、第ｐ段の転置ブルームフィルタが複数存在する場合、ＡＮＤ演算をおこなわずに、複数の転置ブルームフィルタのビット列の各々をリプライとして検索元コンピュータに返してもよい。この場合は、ノードの計算負荷の低減化を図ることができる。
【０１８４】
また、上述した各フローチャートで示したステップは、具体的には、たとえば、図４に示したＲＯＭ４０２、ＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶装置に記憶された検索プログラムをＣＰＵ４０１に実行させた処理である。また、実行させた実行結果は、その都度、記憶装置に書き込まれ、他の処理で必要に応じて読み出される。
【０１８５】
これにより、本実施の形態で説明した検索方法は、検索プログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本検索プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行されることになる。
【０１８６】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１８７】
（付記１）段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群にアクセス可能なコンピュータに、
複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、前記転置ブルームフィルタの配列位置をあらわす位置情報に変換し、
前記第ｐ段の転置ブルームフィルタ列の中から、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを位置情報ごとに特定し、
特定された前記第ｐ段の転置ブルームフィルタを保持するノードから、特定された前記第ｐ段の転置ブルームフィルタを取得し、
取得された前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断し、
同一であると判断された場合、第ｐ段が第１段であるか否かを判断し、
第１段であると判断された場合、擬陽性を示すビットのビット位置に応じた特定のデータブロックを有するノードから、前記特定のデータブロック内での前記検索対象データの存否を示す検索結果を取得する、
処理を実行させることを特徴とする検索プログラム。
【０１８８】
（付記２）前記ビット幅ｓのうち前記所定ビット幅に応じた前記分割データ構造のビット範囲と前記ノード群の各ノードとを対応付けた対応テーブルを参照することで、特定された前記第ｐ段の転置ブルームフィルタを保持するノードを特定する処理を前記コンピュータに実行させ、
前記第ｐ段の転置ブルームフィルタを取得する処理では、
特定先ノードから、特定された前記第ｐ段の転置ブルームフィルタを取得することを特徴とする付記１に記載の検索プログラム。
【０１８９】
（付記３）前記第ｐ段の転置ブルームフィルタを取得する処理では、
特定された前記第ｐ段の転置ブルームフィルタが複数存在する特定先ノードから前記第ｐ段の転置ブルームフィルタの論理積を取得し、
擬陽性を示すビットのビット位置が同一であるか否かを判断する処理では、
取得された論理積に基づいて、前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断することを特徴とする付記２に記載の検索プログラム。
【０１９０】
（付記４）第ｐ段が第１段であると判断された場合、前記対応テーブルを参照することで、前記特定のデータブロックを有するノードを特定する処理を、前記コンピュータに実行させることを特徴とする付記１〜３のいずれか一つに記載の検索プログラム。
【０１９１】
（付記５）第ｐ段が第１段ではないと判断された場合、第ｐ段の１つ下の段をあらたに第ｐ段として前記コンピュータに実行させることを特徴とする付記１〜４のいずれか一つに記載の検索プログラム。
【０１９２】
（付記６）段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群のいずれかのノードに、
前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記転置ブルームフィルタの配列位置をあらわす位置情報を受信し、
前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信し、
前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信し、
前記いずれかのノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索し、
検索結果を前記コンピュータに送信する、
処理を実行させることを特徴とする検索プログラム。
【０１９３】
（付記７）段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群にアクセス可能なコンピュータが、
複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、前記転置ブルームフィルタの配列位置をあらわす位置情報に変換し、
前記第ｐ段の転置ブルームフィルタ列の中から、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを位置情報ごとに特定し、
特定された前記第ｐ段の転置ブルームフィルタを保持するノードから、特定された前記第ｐ段の転置ブルームフィルタを取得し、
取得された前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断し、
同一であると判断された場合、第ｐ段が第１段であるか否かを判断し、
第１段であると判断された場合、擬陽性を示すビットのビット位置に応じた特定のデータブロックを有するノードから、前記特定のデータブロック内での前記検索対象データの存否を示す検索結果を取得する、
処理を実行することを特徴とする検索方法。
【０１９４】
（付記８）段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群のいずれかのノードが、
前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記転置ブルームフィルタの配列位置をあらわす位置情報を受信し、
前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信し、
前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信し、
前記いずれかのノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索し、
検索結果を前記コンピュータに送信する、
処理を実行することを特徴とする検索方法。
【０１９５】
（付記９）段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群にアクセス可能な検索装置であって、
複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、前記転置ブルームフィルタの配列位置をあらわす位置情報に変換する処理部と、
前記第ｐ段の転置ブルームフィルタ列の中から、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを位置情報ごとに特定する処理部と、
特定された前記第ｐ段の転置ブルームフィルタを保持するノードから、特定された前記第ｐ段の転置ブルームフィルタを取得する処理部と、
取得された前記第ｐ段の転置ブルームフィルタで擬陽性を示すビットのビット位置が同一であるか否かを判断する処理部と、
同一であると判断された場合、第ｐ段が第１段であるか否かを判断する処理部と、
第１段であると判断された場合、擬陽性を示すビットのビット位置に応じた特定のデータブロックを有するノードから、前記特定のデータブロック内での前記検索対象データの存否を示す検索結果を取得する処理部と、
を備えることを特徴とする検索装置。
【０１９６】
（付記１０）段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群のいずれかのノードであって、
前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記転置ブルームフィルタの配列位置をあらわす位置情報を受信する処理部と、
前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信する処理部と、
前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信する処理部と、
前記いずれかのノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索する処理部と、
検索結果を前記コンピュータに送信する処理部と、
を備えることを特徴とするノード。
【０１９７】
（付記１１）段数ｈ、ビット幅ｓ、擬陽性または陰性を示すビットが配列された第ｈ段の分割数ｄ、第ｐ（１≦ｐ≦ｈ）段のブルームフィルタのビット幅ｍ＝ｓ／ｄ[h-(p-1)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[h-(p-1)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、からなるデータ構造が、所定ビット幅で分割されており、前記所定ビット幅で分割された各分割データ構造を保持するノード群で構成される検索システムであって、
前記ノード群内の各ノードが、
前記ノード群にアクセス可能なコンピュータから、複数種類のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データから変換された前記転置ブルームフィルタの配列位置をあらわす位置情報を受信する処理部と、
前記位置情報が受信された場合、前記第ｐ段の転置ブルームフィルタ列の中から位置情報ごとに特定された、前記位置情報に対応する前記第ｐ段の転置ブルームフィルタを前記コンピュータに送信する処理部と、
前記コンピュータから前記複数種類のハッシュ関数の中の特定のハッシュ関数に前記検索対象データを与えたときのハッシュ値を受信する処理部と、
自ノードに対応するデータブロックに記憶されているデータと当該データを前記特定のハッシュ関数に与えたときのハッシュ値とを関連付けたハッシュテーブルを参照することにより、受信されたハッシュ値に関連付けられているデータを、前記いずれかのノードに対応するデータブロックの中から検索する処理部と、
検索結果を前記コンピュータに送信する処理部と、
を備えることを特徴とする検索システム。
【符号の説明】
【０１９８】
１００  検索システム
Ｃ１〜Ｃ３  クライアント
Ｎ１〜Ｎ４  ノード
Ｍ  管理サーバ
Ｔ  対応テーブル
ｔＢＦ  階層型転置ブルームフィルタ
ｔＢＦ１〜ｔＢＦ４  階層型分割転置ブルームフィルタ
【図１】
0005716554.tif 000002
【図２】
0005716554.tif 000003
【図３】
0005716554.tif 000004
【図４】
0005716554.tif 000005
【図５】
0005716554.tif 000006
【図６】
0005716554.tif 000007
【図７】
0005716554.tif 000008
【図８】
0005716554.tif 000009
【図９】
0005716554.tif 000010
【図１０】
0005716554.tif 000011
【図１１】
0005716554.tif 000012
【図１２】
0005716554.tif 000013
【図１３】
0005716554.tif 000014
【図１４】
0005716554.tif 000015
【図１５】
0005716554.tif 000016
【図１６】
0005716554.tif 000017
【図１７】
0005716554.tif 000018
【図１８】
0005716554.tif 000019
【図１９】
0005716554.tif 000020