(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)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、を有するデータ構造を各々のノードが保持するノード群のいずれかのノードが、検索対象データを受信し、前記階層型転置ブルームフィルタに応じて、前記データブロック集合内での受信された前記検索対象データの存否を判定し、前記検索対象データの送信元へ前記検索対象データの存否を示す検索結果を送信する、検索プログラム、検索方法、およびノードを用いる。
【発明の効果】
【００１３】
本発明の一態様によれば、データ検索の高速化を図ることができる。また、本発明の一態様によれば管理可能なデータ量の拡大化を図ることができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、実施の形態にかかる検索システムのシステム構成例を示す説明図である。
【図２】図２は、階層型ブルームフィルタの一例を示す説明図である。
【図３】図３は、階層型ブルームフィルタＢＦｉ内の第ｐ段のブルームフィルタ列ＢＦｉ（ｐ）の転置例を示す説明図である。
【図４】図４は、実施の形態にかかるコンピュータのハードウェア構成例を示すブロック図である。
【図５】図５は、送信元コンピュータによる検索通知処理例を示す説明図である。
【図６】図６は、検索リクエストおよびリプライのデータ構造例を示す説明図（その１）である。
【図７】図７は、検索リクエストおよびリプライのデータ構造例を示す説明図（その２）である。
【図８】図８は、ノードＮ２による階層型転置ブルームフィルタｔＢＦ２の検索処理例を示す説明図である。
【図９】図９は、送信元コンピュータによる検索通知処理手順の一例を示すフローチャートである。
【図１０】図１０は、ノードＮｉによる検索・エントリ処理手順を示すフローチャートである。
【図１１】図１１は、図１０で示した検索処理（ステップＳ１００４）の詳細な説明を示すフローチャート（その１）である。
【図１２】図１２は、図１０で示した検索処理（ステップＳ１００４）の詳細な説明を示すフローチャート（その２）である。
【図１３】図１３は、送信元コンピュータによるエントリ通知処理例を示す説明図である。
【図１４】図１４は、エントリリクエストおよびリプライのデータ構造例を示す説明図である。
【図１５】図１５は、ノードＮ２による階層型転置ブルームフィルタｔＢＦ２のエントリ処理例を示す説明図である。
【図１６】図１６は、送信元コンピュータによるエントリ通知処理手順の一例を示すフローチャートである。
【図１７】図１７は、図１０で示したエントリ処理（ステップＳ１００３）の詳細な説明を示すフローチャートである。
【図１８】図１８は、ノードの追加例を示す説明図である。
【図１９】図１９は、管理サーバＭによるノードの追加処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下に添付図面を参照して、本発明にかかる検索プログラム、検索方法、検索装置、およびノードの実施の形態を詳細に説明する。
【００１６】
＜検索システムのシステム構成例＞
図１は、実施の形態にかかる検索システムのシステム構成例を示す説明図である。図１において、検索システム１００は、複数（図１では例として４台）のノードＮ１〜Ｎ４と、管理サーバＭと、一または複数（図１では例として３台）のクライアントＣ１〜Ｃ３と、がネットワークＮＷを介して通信可能に接続されて構成されている。ネットワークＮＷとしては、たとえば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットが挙げられる。
【００１７】
本実施の形態では、ノードＮ１〜Ｎ４がそれぞれ階層型転置ブルームフィルタｔＢＦ１〜ｔＢＦ４を有している。階層型転置ブルームフィルタｔＢＦ１〜ｔＢＦ４とは、それぞれの階層型ブルームフィルタを転置したインデックス情報である。
【００１８】
階層型ブルームフィルタとは、ブルームフィルタを階層構造にしたインデックス情報である。ブルームフィルタとは、所定数のデータブロック内での擬陽性（疑陽性、偽陽性とも称する）または陰性を示すビットが複数配列されたインデックス情報である。ブルームフィルタのビットがＯＮのときは擬陽性を示し、ＯＦＦのときは陰性を示す。なお、ビットの値が１をＯＮとし、０をＯＦＦとしてもよく、逆に、ビットの値が０をＯＮとし、１をＯＦＦとしてもよい。本実施の形態では、ビットの値が１をＯＮ（擬陽性）とし、０をＯＦＦ（陰性）とする。
【００１９】
なお、階層型ブルームフィルタについては、図２を用いて後述する。また、階層型ブルームフィルタと階層型転置ブルームフィルタｔＢＦｉ（ｉ＝１〜４（ｉはノードに付した符号に対応している。））との対応関係については、図３を用いて後述する。また、階層型転置ブルームフィルタｔＢＦ１〜ｔＢＦ４については、それぞれ独立している。階層型転置ブルームフィルタｔＢＦ１〜ｔＢＦ４は階層数（段数）、ビット幅、分割数がすべて同一でもよい。また、階層型転置ブルームフィルタｔＢＦ１〜ｔＢＦ４のすくなくとも２つの階層型転置ブルームフィルタ間で階層数（段数）、ビット幅、分割数のいずれかが異なっていてもよい。
【００２０】
また、図１では、例として階層型転置ブルームフィルタｔＢＦ１の階層数を３とする。したがって、階層型転置ブルームフィルタｔＢＦ１は、１段目（最下段）の転置ブルームフィルタ列ｔＢＦ１（１）、２段目の転置ブルームフィルタ列ｔＢＦ１（２）、３段目（最上段）の転置ブルームフィルタ列ｔＢＦ１（３）を階層化したブルームフィルタである。
【００２１】
また、図１では、例として階層型転置ブルームフィルタｔＢＦ１のビット幅ｓ１を１２８ビットとする。
【００２２】
また、図１では、例として階層型転置ブルームフィルタｔＢＦ２の階層数を３とする。したがって、階層型転置ブルームフィルタｔＢＦ２は、１段目（最下段）の転置ブルームフィルタ列ｔＢＦ２（１）、２段目の転置ブルームフィルタ列ｔＢＦ２（２）、３段目（最上段）の転置ブルームフィルタ列ｔＢＦ２（３）を階層化したブルームフィルタである。
【００２３】
また、図１では、例として階層型転置ブルームフィルタｔＢＦ２のビット幅ｓ２を６４ビットとする。
【００２４】
また、図１では、階層型転置ブルームフィルタｔＢＦ３の階層数を４とする。したがって、階層型転置ブルームフィルタｔＢＦ３は、１段目（最下段）の転置ブルームフィルタ列ｔＢＦ３（１）から４段目（最上段）の転置ブルームフィルタ列ｔＢＦ３（４）を階層化したブルームフィルタである。
【００２５】
また、図１では、例として階層型転置ブルームフィルタｔＢＦ３のビット幅ｓ３を１２８ビットとする。
【００２６】
また、図１では、階層型転置ブルームフィルタｔＢＦ４の階層数を３とする。したがって、階層型転置ブルームフィルタｔＢＦ４は、１段目（最下段）の転置ブルームフィルタ列ｔＢＦ４（１）、２段目の転置ブルームフィルタ列ｔＢＦ４（２）、３段目の転置ブルームフィルタ列ｔＢＦ４（３）を階層化したブルームフィルタである。
【００２７】
また、図１では、例として階層型転置ブルームフィルタｔＢＦ４のビット幅ｓ４を６４ビットとする。
【００２８】
また、階層型転置ブルームフィルタｔＢＦｉにはデータブロック集合ｄｂｉ（ｉ＝１〜４）が対応付けられている。データブロック集合ｄｂｉは、それぞれ階層型転置ブルームフィルタｔＢＦｉのビット幅ｓｉ（ｉ＝１〜４）と同一ビット幅とする。
【００２９】
データブロック集合ｄｂｉは、複数のデータブロックを有しており、各データブロックは、登録されたデータを保持している。なお、個々のデータブロックをｄｂｉ−＃と表記する。＃は数字であり、ブロック番号を示す。ブロック番号＃は、そのデータブロックｄｂｉ−＃のビット位置に対応する。
【００３０】
ハッシュテーブル群ＨＴｉ（ｉ＝１〜４）−ｓｉは、データブロック集合ｄｂｉ内の各データブロックｄｂｉ−＃に対応するハッシュテーブルの集合である。なお、個々のハッシュテーブルをＨＴｉ−＃と表記する。＃は数字であり、データブロックｄｂｉ−＃のブロック番号と一致する。ハッシュテーブルＨＴｉ−＃は、データをある特定のハッシュ関数に与えたときのハッシュ値と、ハッシュ値の生成元となるデータ（データそのものでもデータへのポインタでもよい）を関連付けたテーブルである。
【００３１】
管理サーバＭは、複数のノードＮ１〜Ｎ４を管理するコンピュータである。管理サーバＭは、クライアントリスト１０２と、ノードリスト１０１とを有している。管理サーバＭは、あらたにノードが追加された場合に、ノードリスト１０１を更新したり、クライアントリスト１０２を参照して、ノードの追加をクライアントＣ１〜Ｃ３へ通知したりする。なお、管理サーバＭは、物理マシンでもよいが、いずれかのノードにおいて仮想マシンとして機能させてもよい。
【００３２】
クライアントリスト１０２は、クライアントＩＤ、ＩＰアドレスおよびポート番号項目を有している。それぞれの項目に情報が設定されることで、レコードとして記憶されている。クライアントＩＤ項目には、ネットワークＮＷを介してノードＮ１〜Ｎ４にアクセス可能なクライアントの識別情報が登録される。ＩＰアドレス項目にはクライアントのＩＰアドレス、ポート番号項目にはポート番号が登録される。クライアントリスト１０２は、具体的には、たとえば、図４に示したＲＯＭ４０２、ＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶装置に記憶されている。
【００３３】
ノードリスト１０１は、ノードＩＤ、ＩＰアドレスおよびポート番号項目を有している。それぞれの項目に情報が設定されることで、レコードとして記憶されている。ノードＩＤ項目には、各ノードの識別情報が登録される。図１では、ノードＩＤはノードに付した符号に対応している。ＩＰアドレス項目にはノードのＩＰアドレス、ポート番号項目には各クライアントがネットワークＮＷを介してノードにアクセス可能なポート番号が登録される。ノードリスト１０１は、具体的には、たとえば、図４に示したＲＯＭ４０２、ＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶装置に記憶されている。
【００３４】
クライアントＣ１〜Ｃ３は、複数のノードＮ１〜Ｎ４を利用するコンピュータである。クライアントＣ１〜Ｃ３は、それぞれノードリスト１０１を有している。クライアントＣ１〜Ｃ３は、管理サーバＭを介してノードＮ１〜Ｎ４へデータの登録通知処理、データの検索通知処理を実行してもよいし、管理サーバＭを介さずにノードＮ１〜Ｎ４へデータの登録通知処理、データの検索通知処理を実行してもよい。また、ノードＮ１〜Ｎ４にクライアントリスト１０２を持たせ、管理サーバＭを設けないこととしてもよい。
【００３５】
このような検索システム１００では、検索対象データが与えられると、階層型転置ブルームフィルタｔＢＦｉを参照して、検索対象データが存在するであろうデータブロックｄｂｉ−＃を特定することになる。検索対象データが存在するであろうデータブロックｄｂｉ−＃が特定されなかった場合は、いずれの階層型転置ブルームフィルタｔＢＦｉのデータブロックｄｂｉ−＃にも検索対象データは存在しない（陰性）。逆に、検索対象データが存在するであろうデータブロックｄｂｉ−＃が特定された場合でも、特定されたデータブロックｄｂｉ−＃には、必ずしも検索対象データが存在するとは限らない（擬陽性）。
【００３６】
なお、擬陽性が陽性になるか陰性になるかは、最終的に特定されたデータブロックｄｂｉ−＃に対応するハッシュテーブルＨＴｉ−＃での検索結果に依存する。たとえば、最終的に特定されたデータブロックｄｂｉ−＃に対応するハッシュテーブルＨＴｉ−＃において、検索対象データのハッシュ値がヒットすれば陽性、ヒットしなければ陰性となる。
【００３７】
＜階層型ブルームフィルタ＞
つぎに、図１に示した階層型転置ブルームフィルタｔＢＦｉの転置元となる階層型ブルームフィルタについて説明する。
【００３８】
図２は、階層型ブルームフィルタの一例を示す説明図である。階層型ブルームフィルタＢＦｉは、ｈｉ（ｉ＝１〜４）段×ｓｉビット幅のメモリ領域で構成されている。ｓｉビット幅は、データブロック集合ｄｂｉのビット幅に対応する。また、各段のビット長ｓｉは最上段である第ｈｉ段の分割数ｄｉ（ｉ＝１〜４）に基づいて分割される。分割された各々はブルームフィルタであり、各段においてブルームフィルタ列を構成する。分割数ｄｉは基本的には２以上の整数であるが、最上段である第ｈｉ段を単一のブルームフィルタとする場合は、ｄｉ＝１としてもよい。
【００３９】
任意の段をｐとすると、第ｐ段のブルームフィルタ列ＢＦｉ（ｐ）を構成するブルームフィルタｂｆｉ（ｐ）のビット幅ｍｉは、ｍｉ＝ｓｉ／ｄｉ[hi-(p-1)]となる。図２では、ｄｉ＝２としている。また、第ｐ段のブルームフィルタ列ＢＦｉ（ｐ）のブルームフィルタｂｆｉ（ｐ）の配列数ｎｉは、ｎｉ＝ｄｉ[hi-(p-1)]となる。
【００４０】
したがって、階層型ブルームフィルタＢＦｉでは、段が下がる（ｈｉが小さくなる）につれ、第ｐ段のブルームフィルタ列ＢＦｉ（ｐ）のブルームフィルタｂｆｉ（ｐ）の配列数が増加する。なお、最下段（第１段）のブルームフィルタ列ＢＦｉ（１）のブルームフィルタｂｆｉ（１）の配列数は、データブロックｄｂｉ−＃の個数と同一とする。
【００４１】
これにより、第１段までたどり着いたときにヒットしたブルームフィルタｂｆｉ（１）とデータブロックｄｂｉ−＃とが一対一対応することになる。また、階層型ブルームフィルタＢＦｉの段数ｈｉは基本的には複数段であるが、１段（ｈｉ＝１）としてもよい。ただし、この場合は、ｄｉ≠１とする。
【００４２】
ここで、ブルームフィルタの擬陽性による影響について説明する。ブルームフィルタの擬陽性の発生確率ＦＰＲｉは、ビット長がｍｉのブルームフィルタがｈｉ段ある場合、データ登録数Ｎｉ（Ｎｉ＜ｍｉ）、ハッシュ関数の個数をｋｉ個とすると、ブルームフィルタの性質より、次式（１）のように表すことができる。
【００４３】
ＦＰＲｉ＝｛１−（１−１／ｍｉ）kiNi｝ki≒｛１−ｅ(-kiNi/mi)）｝ki・・・（１）
【００４４】
この場合、ｋｉ，ｍｉ，Ｎｉを変更することにより、擬陽性の発生確率ＦＰＲｉを非常に小さくすることができる。すなわち、ｋｉ，ｍｉ，Ｎｉの設定次第で、擬陽性の発生確率ＦＰＲｉを１よりも非常に小さい値（ほぼ０）に設定することができるようになる。
【００４５】
また、データブロック数Ｎｄｂｉをｄｉhiとすると、高さ段数ｈｉは、次式（２）にて表すことができる。
【００４６】
ｈｉ＝ｌｏｇ（Ｎｄｂｉ）／ｌｏｇ（ｄｉ）＋１・・・（２）
【００４７】
上記式（２）は、ｌｏｇ（Ｎｄｂｉ）／ｌｏｇ（ｄｉ）が割り切れる場合を前提にしたが、そうでない場合、段によりｄｉの値を他の段とは変えることで、ｈｉを決定することができる。
【００４８】
また、検索処理ではハッシュ値の数（ｋｉ回（定数））だけ照合をおこなう必要があり、検索における１段あたりのフィルタリング対象の数は多くてもｄｉ個である。したがって、検索によるメモリアクセス回数ＭＡｉは、最大でも次式（３）で表される程度である。
【００４９】
ＭＡｉ＝ｋｉ×ｄｉ×ｌｏｇ（Ｎｄｂｉ）／ｌｏｇ（ｄｉ）・・・（３）
【００５０】
＜階層型転置ブルームフィルタｔＢＦｉ＞
つぎに、階層型転置ブルームフィルタｔＢＦｉについて説明する。図２に示した階層型ブルームフィルタＢＦｉを転置させることで、階層型ブルームフィルタＢＦｉよりも検索速度をさらに高速化させることができる。
【００５１】
図３は、階層型ブルームフィルタＢＦｉ内の第ｐ段のブルームフィルタ列ＢＦｉ（ｐ）の転置例を示す説明図である。（Ａ）は、ブルームフィルタ列ＢＦｉ（ｐ）を示している。ここでは、ブルームフィルタ列ＢＦｉ（ｐ）は、例として、４分割されたブルームフィルタｂｆｉ（ｐ−１）〜ｂｆｉ（ｐ−４）を示している。すなわち、ブルームフィルタ列ＢＦｉ（ｐ）は、８ビット×４フィルタ数のビット列である。転置する場合は、４ビット×８フィルタ数のビット列となる。すなわち、転置により、配列数とビット幅が入れ替わる。
【００５２】
（Ｂ）は、ブルームフィルタ列ＢＦｉ（ｐ）の転置を示している。転置する場合、各ブルームフィルタｂｆｉ（ｐ−１）〜ｂｆｉ（ｐ−４）の同一位置のビットを集めて、同一位置ごとに集められたビット列を、ビット位置順に配列させる。
【００５３】
具体的には、各ブルームフィルタｂｆｉ（ｐ−１）〜ｂｆｉ（ｐ−４）の各先頭ビットを配列番号順にまとめてビット列｛０１１０｝とする。左から先頭ビット「０」がブルームフィルタｂｆｉ（ｐ−１）の先頭ビット、２番目のビット「１」がブルームフィルタｂｆｉ（ｐ−２）の先頭ビット、３番目のビット「１」がブルームフィルタｂｆｉ（ｐ−３）の先頭ビット、末尾ビット「０」がブルームフィルタｂｆｉ（ｐ−４）の先頭ビットである。
【００５４】
このビット列｛０１１０｝を、転置ブルームフィルタｔｂｆｉ（ｐ−１）と称す。２番目〜末尾のビット位置についても同様にまとめることで、転置ブルームフィルタｔｂｆｉ（ｐ−１）〜ｔｂｆｉ（ｐ−８）を得る。転置ブルームフィルタｔｂｆｉ（ｐ−１）〜ｔｂｆｉ（ｐ−８）がビット位置順に配列されたインデックス情報が、転置ブルームフィルタ列ｔＢＦｉ（ｐ）である。転置ブルームフィルタ列ｔＢＦｉ（ｐ）をすべての段で生成することで、階層型転置ブルームフィルタｔＢＦｉとなる。
【００５５】
（Ｃ）は、ブルームフィルタ列ＢＦｉ（ｐ）と転置ブルームフィルタ列ｔＢＦｉ（ｐ）との検索比較例を示している。ここでは、２種類のハッシュ関数により対象データＤのハッシュ値を２つ求め、ブルームフィルタ列ＢＦｉ（ｐ）を構成するブルームフィルタｂｆｉ（ｐ）のビット幅１０で割り算した余り値を、「４」および「８」とする。
【００５６】
ブルームフィルタ列ＢＦｉ（ｐ）で検索する場合、余り値「４」および「８」となるビット位置「４」および「８」がすべてＯＮになっているブルームフィルタｂｆｉ（ｐ）をブルームフィルタ列ＢＦｉ（ｐ）から探す。この場合、ブルームフィルタｂｆｉ（ｐ−２）が該当する。
【００５７】
一方、転置ブルームフィルタ列ｔＢＦｉ（ｐ）を用いる場合、ブルームフィルタ列ＢＦｉ（ｐ）のように、ビット位置「４」および「８」がすべてＯＮになっているブルームフィルタｂｆｉ（ｐ）を検索せず。代わりに、余り値「４」および「８」と同一配列番号の転置ブルームフィルタｔｂｆｉ（ｐ−４），ｔｂｆｉ（ｐ−８）を抽出する。そして、抽出された転置ブルームフィルタｔｂｆｉ（ｐ−４），ｔｂｆｉ（ｐ−８）をＡＮＤ演算することで、ともにＯＮになっているビット位置「２」を特定する。
【００５８】
ブルームフィルタ列ＢＦｉ（ｐ）の場合は、４個のブルームフィルタｂｆｉ（ｐ−１）〜ｂｆｉ（ｐ−４）内の４ビット目と８ビット目を参照するため、８（＝４×２）のメモリアクセスが必要となる。一方、転置ブルームフィルタ列ｔＢＦｉ（ｐ）は、転置前のブルームフィルタｂｆｉ（ｐ−１）〜ｂｆｉ（ｐ−４）のビット位置ごとに折りたたまれたインデックス情報である。したがって、転置ブルームフィルタｔｂｆｉ（ｐ−４），ｔｂｆｉ（ｐ−８）を抽出するという２回のメモリアクセスとそのＡＮＤ演算により判定することが可能となる。したがって、階層型ブルームフィルタＢＦｉよりもメモリアクセス頻度が低減され、検索速度が高速化することとなる。
【００５９】
＜コンピュータのハードウェア構成例＞
図４は、実施の形態にかかるコンピュータ（ノードＮ１〜Ｎ４、管理サーバＭ、クライアントＣ１〜Ｃ３）のハードウェア構成例を示すブロック図である。図４において、検索装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）４０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）４０３と、磁気ディスクドライブ４０４と、を有している。検索装置は、磁気ディスク４０５と、光ディスクドライブ４０６と、光ディスク４０７と、ディスプレイ４０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）４０９と、キーボード４１０と、マウス４１１と、スキャナ４１２と、プリンタ４１３と、を有している。また、各構成部はバス４００によってそれぞれ接続されている。
【００６０】
ここで、ＣＰＵ４０１は、検索装置の全体の制御を司る。ＲＯＭ４０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ４０３は、ＣＰＵ４０１のワークエリアとして使用される。磁気ディスクドライブ４０４は、ＣＰＵ４０１の制御にしたがって磁気ディスク４０５に対するデータのリード／ライトを制御する。磁気ディスク４０５は、磁気ディスクドライブ４０４の制御で書き込まれたデータを記憶する。
【００６１】
光ディスクドライブ４０６は、ＣＰＵ４０１の制御にしたがって光ディスク４０７に対するデータのリード／ライトを制御する。光ディスク４０７は、光ディスクドライブ４０６の制御で書き込まれたデータを記憶したり、光ディスク４０７に記憶されたデータをコンピュータに読み取らせたりする。
【００６２】
ディスプレイ４０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ４０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００６３】
Ｉ／Ｆ４０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワークＮＷに接続され、このネットワーク４１４を介して他の装置に接続される。そして、Ｉ／Ｆ４０９は、ネットワークＮＷと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ４０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００６４】
キーボード４１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス４１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００６５】
スキャナ４１２は、画像を光学的に読み取り、コンピュータ内に画像データを取り込む。なお、スキャナ４１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ４１３は、画像データや文書データを印刷する。プリンタ４１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００６６】
＜検索通知処理例および検索処理例＞
つぎに、検索通知処理例および検索処理例について説明する。検索通知処理では、検索の対象となるデータ（以下、検索対象データ）をノードＮ１〜Ｎ４に検索させる検索リクエストを通知する処理が実行される。検索処理では、検索リクエストを受け付けたノードにより、検索対象データを検索する処理が実行される。
【００６７】
検索通知処理を実行するコンピュータ（たとえば、管理サーバＭまたはクライアント。以下、単に「送信元コンピュータ」。）は、対象データの検索リクエストをノードＮ１〜Ｎ４のいずれかのノードに送信する。各ノードの宛先については、ノードリスト１０１を参照することで特定することができる。
【００６８】
検索対象データを検索させるノード（検索ノード）を指定する。どのノードから検索するかは、たとえば、送信元コンピュータの利用者が任意に指定してもよい。また、たとえば、送信元コンピュータがノードＩＤの順に指定してもよい。また、たとえば、現検索通知処理の１つ前に検索通知処理が実行された際に検索が成功したノードを、検索対象データを検索させるノードに指定してもよい。また、たとえば、送信元コンピュータがすべてのノードに検索通知を行ってもよい。
【００６９】
図５は、送信元コンピュータによる検索通知処理例を示す説明図である。たとえば、検索成功ノードＩＤが１であるとする。送信元コンピュータ（図５では、クライアントＣ１）が、ノード群から検索成功ノードＩＤに基づきノードＮ１を選択する。送信元コンピュータが、（１）検索リクエスト６０１をノードＮ１に送信し、ノードＮ１からのリプライ６０２を待つ。送信元コンピュータが、（２）ノードＮ１からのリプライ６０２を受信すると、検索結果が「陽性」であるか否かを判断する。送信元コンピュータが、検索結果が「陽性」でないと判断した場合、（３）ノードＩＤ順に検索リクエスト７０１をノードＮ２に送信し、ノードＮ２からのリプライ７０２を待つ。
【００７０】
送信元コンピュータが、（４）ノードＮ２からのリプライ７０２を受信すると、検索結果が「陽性」であるか否かを判断する。送信元コンピュータが、検索結果が「陽性」であると判断した場合、検索結果を出力して検索通知処理を終了する。
【００７１】
図６および図７は、検索リクエストおよびリプライのデータ構造例を示す説明図である。図６，７において、（Ａ）は検索リクエスト６０１，７０１、（Ｂ）はリプライ６０２，７０２を示す。（Ａ）の検索リクエスト６０１，７０１のヘッダは、検索リクエスト６０１，７０１の送信元アドレスおよび送信元ポート番号と宛先アドレスおよび宛先ポート番号とを保持する。図６，７では、コンピュータに割り当てた符号Ｃ１，Ｎ１，Ｎ２をＩＰアドレスおよびポート番号の代わりに表記している。
【００７２】
また、（Ａ）の検索リクエスト６０１，７０１のペイロードは、種類項目、検索対象データ項目に対しそれぞれの情報が保持されている。たとえば、種類項目には、「検索」、検索対象データ項目には、「Ｄｘ」が保持されている。
【００７３】
また、（Ｂ）のリプライ６０２，７０２のヘッダは、それぞれ検索リクエスト６０１，７０１の送信元アドレスおよび送信元ポート番号と宛先アドレスおよび宛先ポート番号とが入れ替わった送信元アドレスと宛先アドレスとを保持する。（Ｂ）のリプライ６０２，７０２のペイロードは、検索結果項目に対する情報が保持されている。（Ｂ）のリプライ６０２，７０２のペイロードには、図６の場合は、ノードＮ１での検索結果（Ｄｘなし）、すなわち、陰性である旨が保持されており、図７の場合は、ノードＮ２での検索結果（Ｄｘあり）が保持されている。つぎに、送信元コンピュータがノードＮ２に検索リクエストを送信した場合のノードＮ２による検索処理例を示す。
【００７４】
図８は、ノードＮ２による階層型転置ブルームフィルタｔＢＦ２の検索処理例を示す説明図である。図８では、説明上、全ビット幅ｓ２＝６４ビット、段数ｈ２＝３段、第ｈ２段での分割数ｄ２＝２とする。
【００７５】
最下段である第１段のブルームフィルタ列ＢＦ２（１）を構成するブルームフィルタのビット幅は、８（＝ｓ２／ｄ２h2＝６４／２3）ビットであるため、最下段である第１段の転置ブルームフィルタ列ｔＢＦ２（１）は、８（＝ｓ２／ｄ２h2＝６４／２3）個の転置ブルームフィルタｔｂｆ２（１−１）〜ｔｂｆ２（１−８）により構成される。
【００７６】
また、第２段の転置ブルームフィルタ列ｔＢＦ２（２）を構成するブルームフィルタのビット幅は、１６（＝ｓ２／ｄ２h2＝６４／２2）ビットであるため、第２段の転置ブルームフィルタ列ｔＢＦ２（２）は、１６（＝ｓ２／ｄ２h2＝６４／２2）個の転置ブルームフィルタｔｂｆ２（２−１）〜ｔｂｆ２（２−１６）により構成される。
【００７７】
また、最上段である第３段のブルームフィルタ列ＢＦ２（３）を構成するブルームフィルタのビット幅は、３２（＝ｓ２／ｄ２h2＝６４／２1）ビットであるため、最上段である第３段の転置ブルームフィルタ列ｔＢＦ２（３）は、３２（＝ｓ２／ｄ２h2＝６４／２1）個の転置ブルームフィルタｔｂｆ２（３−１）〜ｔｂｆ２（３−３２）により構成される。
【００７８】
なお、図８では、説明上、比較のため、転置ブルームフィルタ列ｔＢＦ２（１）〜ｔＢＦ２（３）とともに、転置前のブルームフィルタ列ＢＦ２（１）〜ＢＦ２（３）を併記しておく。
【００７９】
まず、ノードＮ２は、検索対象データＤｘについてのハッシュ関数Ｈ１（）〜Ｈ３（）での３個のハッシュ値を、第３段の転置ブルームフィルタ数３２で割り算したときの余り値「２」、「１９」、「２７」を求める。
【００８０】
つぎに、ノードＮ２は、フィルタリング対象となる転置ブルームフィルタを第３段の転置ブルームフィルタ列ｔＢＦ２（３）から特定する。具体的には、ノードＮ２は、余り値と同一ビット位置（余り値が０の場合は末尾位置）となる転置ブルームフィルタｔｂｆ２（３−２），ｔｂｆ２（３−１９），ｔｂｆ２（３−２７）を特定する。そして、ノードＮ２は、特定された転置ブルームフィルタｔｂｆ２（３−２），ｔｂｆ２（３−１９），ｔｂｆ２（３−２７）の各ビット列｛１０｝，｛１１｝，｛１０｝のＡＮＤ演算をおこなう。そのＡＮＤ結果は、｛１０｝となる。
【００８１】
ＡＮＤ結果に「１」が含まれていない場合は、ノードＮ２はデータブロック集合ｄｂ２には検索対象データＤｘが存在しないと判定する。一方、ＡＮＤ結果に「１」が含まれている場合、検索対象データＤｘを登録したかもしれないため、１つ下の段に移る。
【００８２】
第２段においても、まず、ノードＮ２は、検索対象データＤｘについての３個のハッシュ値を、第２段の転置ブルームフィルタ数１６で割り算したときの余り値「８」、「１１」、「１３」を求める。
【００８３】
つぎに、ノードＮ２は、フィルタリング対象となる転置ブルームフィルタを第２段の転置ブルームフィルタ列ｔＢＦ２（２）から特定する。具体的には、ノードＮ２は、余り値と同一ビット位置（余り値が０の場合は末尾位置）となる転置ブルームフィルタｔｂｆ２（２−８），ｔｂｆ２（２−１１），ｔｂｆ２（２−１３）を特定する。そして、ノードＮ２は、特定された転置ブルームフィルタｔｂｆ２（２−８），ｔｂｆ２（２−１１），ｔｂｆ２（２−１３）の各ビット列｛０１１０｝，｛０１００｝，｛０１１０｝のＡＮＤ演算をおこなう。そのＡＮＤ結果は、｛０１００｝となる。
【００８４】
ノードＮ２は、ＡＮＤ結果に「１」が含まれていない場合は、データブロック集合ｄｂ２には検索対象データＤｘが存在しないと判定する。一方、ＡＮＤ結果に「１」が含まれている場合、検索対象データＤｘを登録したかもしれないため、１つ下の段に移る。
【００８５】
最下段である第１段においても、まず、ノードＮ２は、検索対象データＤｘについての３個のハッシュ値を、第１段の転置ブルームフィルタ数８で割り算したときの余り値「２」、「５」、「７」を求める。
【００８６】
つぎに、ノードＮ２は、フィルタリング対象となる転置ブルームフィルタを第１段の転置ブルームフィルタ列ｔＢＦ２（１）から特定する。具体的には、ノードＮ２は、余り値と同一ビット位置（余り値が０の場合は末尾位置）となる転置ブルームフィルタｔｂｆ２（１−２），ｔｂｆ２（１−５），ｔｂｆ２（１−７）を特定する。そして、ノードＮ２は、特定された転置ブルームフィルタｔｂｆ２（１−２），ｔｂｆ２（１−５），ｔｂｆ２（１−７）の各ビット列｛００１１０１１０｝，｛１００１１０１０｝，｛００１１０１１１｝のＡＮＤ演算をおこなう。そのＡＮＤ結果は、｛０００１００１０｝となる。
【００８７】
これ以上下の段は存在しないため、擬陽性により、ＡＮＤ結果｛０００１００１０｝が「１」のビット位置４，７に対応するデータブロックｄｂ２−４，ｄｂ２−７に検索対象データＤｘが存在する可能性がある。
【００８８】
この場合、ハッシュテーブルＨＴ２−４，ＨＴ２−７に対しハッシュ関数Ｈ１（）でのハッシュ値をキーにして検索することで、データブロックｄｂ２−４がヒットし、データブロックｄｂ２−７はヒットしなかったものとする。これにより、検索対象データＤｘは、データブロックｄｂ２−４に登録されていることが判明する。そして、ノードＮ２は、検索結果（陽性）のリプライ７０２を送信する。これにより、検索処理を終了する。
【００８９】
このような手順により、ノードＮｉは、階層型転置ブルームフィルタｔＢＦｉを利用することで、階層型ブルームフィルタＢＦｉに比べてもより高速に対象データを検索することができる。
【００９０】
＜送信元コンピュータによる検索通知処理手順＞
図９は、送信元コンピュータによる検索通知処理手順の一例を示すフローチャートである。送信元コンピュータが、検索対象データを受け付けたか否かを判断する（ステップＳ９０１）。検索対象データがない場合（ステップＳ９０１：Ｎｏ）、送信元コンピュータが、ステップＳ９０１へ戻る。検索対象データがある場合（ステップＳ９０１：Ｙｅｓ）、送信元コンピュータが、ｊ＝直前の検索成功ノードＩＤとする（ステップＳ９０２）。これにより、ノード群のうち、現検索の１つ前の検索において検索が成功したノードから優先して検索をおこなうことができる。
【００９１】
そして、送信元コンピュータが、ノードＮｊに検索リクエストを未送信か否かを判断する（ステップＳ９０３）。ノードＮｊに検査リクエストを未送信であるか否かを判断することにより、ノード群から、未選択なノードを選択することができる。ノードＮｊに未送信の場合（ステップＳ９０３：Ｙｅｓ）、送信元コンピュータが、ノードＮｊに検索リクエストを送信し（ステップＳ９０４）、リプライを受信したか否かを判断する（ステップＳ９０５）。
【００９２】
リプライが受信されていない場合（ステップＳ９０５：Ｎｏ）、送信元コンピュータが、検索リクエストの送信から所定時間経過したか否かを判断する（ステップＳ９０６）。所定時間経過していない場合（ステップＳ９０６：Ｎｏ）、送信元コンピュータが、ステップＳ９０５に戻る。一方、所定時間経過した場合（ステップＳ９０６：Ｙｅｓ）、送信元コンピュータが、エラー出力をおこなう（ステップＳ９０７）。たとえば、ディスプレイ４０８に、ノードＮｊで検索できなかった旨の表示をおこなう。
【００９３】
送信元コンピュータが、ｊ≧全ノード数であるか否かを判断する（ステップＳ９０８）。ｊ≧全ノード数である場合（ステップＳ９０８：Ｙｅｓ）、送信元コンピュータが、ｊ＝１とし（ステップＳ９０９）、ステップＳ９０３へ戻る。ｊ≧全ノード数でない場合（ステップＳ９０８：Ｎｏ）、送信元コンピュータが、ｊ＝ｊ＋１とし（ステップＳ９１０）、ステップＳ９０３へ戻る。
【００９４】
リプライが受信された場合（ステップＳ９０５：Ｙｅｓ）、送信元コンピュータが、検索結果が陽性か否かを判断する（ステップＳ９１１）。検索結果が陽性の場合（ステップＳ９１１：Ｙｅｓ）、送信元コンピュータが、ノードＮｊと検索結果（陽性）を関連付けて出力し（ステップＳ９１２）、検索成功ノードＩＤ＝ｊとし（ステップＳ９１３）、一連の検索通知処理を終了する。たとえば、ディスプレイ４０８に、ノードＮｊとブロック番号を関連付けた結果の表示をおこなってもよい。たとえば、ノードＮｊを直前のデータが追加されたノードＩＤとして、ＲＯＭ４０２、ＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶装置に記憶させる。検索結果が陰性の場合（ステップＳ９１１：Ｎｏ）、送信元コンピュータが、ステップＳ９０８へ移行する。
【００９５】
ノードＮｊに未送信でない場合（ステップＳ９０３：Ｎｏ）、送信元コンピュータが、検索結果（陰性）を出力し（ステップＳ９１４）、一連の検索通知処理を終了する。たとえば、ディスプレイ４０８に、いずれのノードであっても検索できなかった旨の表示をおこなう。
【００９６】
直前の検索成功ノードＩＤに優先して検索リクエストを送信することにより、対象データの追加と同じ順番で読み込まれる場合が多いというヒューリスティックスを用いることができ、検索の高速化を図ることができる。
【００９７】
＜ノードＮｉによる検索・エントリ処理手順＞
図１０は、ノードＮｉによる検索・エントリ処理手順を示すフローチャートである。図１０の処理手順は、複数のノード（ノードＮ１〜Ｎ４）の各ノードで実行される処理手順である。
【００９８】
まず、ノードＮｉは、リクエストを受信したか否かを判断する（ステップＳ１００１）。リクエストが受信されていない場合（ステップＳ１００１：Ｎｏ）、ノードＮｉは、ステップＳ１００１へ戻る。一方、リクエストが受信された場合（ステップＳ１００１：Ｙｅｓ）、ノードＮｉは、リクエストの種類を判断する（ステップＳ１００２）。
【００９９】
リクエストの種類がエントリの場合（ステップＳ１００２：エントリ）、ノードＮｉは、エントリ処理を実行し（ステップＳ１００３）、一連の処理を終了する。リクエストの種類が検索の場合（ステップＳ１００２：検索）、ノードＮｉは、検索処理を実行し（ステップＳ１００４）、一連の処理を終了する。
【０１００】
＜ノードＮｉによる検索処理手順＞
図１１および図１２は、図１０で示した検索処理（ステップＳ１００４）の詳細な説明を示すフローチャートである。なお、ノードＮｉにより利用されるブルームフィルタは、すでに一括転置済みの階層型転置ブルームフィルタｔＢＦｉでもよく、階層型ブルームフィルタＢＦｉでもよい。階層型ブルームフィルタＢＦｉを用いる場合は、未転置のブルームフィルタが特定される都度転置処理をおこなう。
【０１０１】
すなわち、検索しながら階層型転置ブルームフィルタｔＢＦｉを構築していく。図１１および図１２では、検索しながら階層型転置ブルームフィルタｔＢＦｉを構築していく場合の処理手順について説明する。なお、一括転置済みの場合は、転置済みか否かの判断（ステップＳ１１０３）と転置処理（ステップＳ１１０４）を省略するだけでよい。
【０１０２】
まず、図１１において、ノードＮｉは、検索対象データＤｘをｋｉ種類のハッシュ関数に与えてｋｉ個のハッシュ値を算出する（ステップＳ１１０１）。そして、ノードＮｉは、ｐ＝ｈｉ、すなわち、段数ｐを最大段数ｈｉに設定し（ステップＳ１１０２）、ｐ段目のブルームフィルタ列ＢＦｉ（ｐ）が転置済みであるか否かを判断する（ステップＳ１１０３）。転置済みである場合（ステップＳ１１０３：Ｙｅｓ）、ステップＳ１１０５に移行する。一方、未転置である場合（ステップＳ１１０３：Ｎｏ）、ノードＮｉは、ｐ段目のブルームフィルタ列ＢＦｉ（ｐ）を転置して（ステップＳ１１０４）、ステップＳ１１０５に移行する。
【０１０３】
ステップＳ１１０５では、ノードＮｉは、ｋｉ個のハッシュ値を転置ブルームフィルタｔｂｆｉ（ｐ）の配列数で除算して、ｋｉ個の余り値を算出する（ステップＳ１１０５）。そして、ノードＮｉは、ｐ段目の転置ブルームフィルタ列ｔＢＦｉ（ｐ）から、ｋｉ個の余り値に対応するｋｉ個の転置ブルームフィルタｔｂｆｉ（ｐ）ｒを特定する（ステップＳ１１０６）。
【０１０４】
そして、ノードＮｉは、ｋｉ個の転置ブルームフィルタｔｂｆｉ（ｐ）ｒをＡＮＤ演算し（ステップＳ１１０７）、図１２のステップＳ１２０１に移行する。
【０１０５】
図１２において、ノードＮｉは、ＡＮＤ結果の先頭ビットを対象ビットに設定し（ステップＳ１２０１）、対象ビットがＯＮであるか否かを判断する（ステップＳ１２０２）。ＯＮでない場合（ステップＳ１２０２：Ｎｏ）、ノードＮｉは、対象ビットがシフト可能か否かを判断する（ステップＳ１２０３）。具体的には、対象ビットが末尾ビットであるか否かを判断する。
【０１０６】
シフト可能である場合（ステップＳ１２０３：Ｙｅｓ）、ノードＮｉは、対象ビットを１ビット末尾方向へシフトし（ステップＳ１２０４）、ステップＳ１２０２に戻る。一方、ステップＳ１２０３において、シフト可能でない場合（ステップＳ１２０３：Ｎｏ）、ノードＮｉは、検索結果（陰性）と判定し、検索結果（陰性）をリプライ送信する（ステップＳ１２０５）。これにより、検索結果が陰性である場合の処理手順を終了する。
【０１０７】
一方、ステップＳ１２０２において、対象ビットがＯＮであった場合（ステップＳ１２０２：Ｙｅｓ）、ノードＮｉは、現在の段数ｐがｐ＝１であるか否かを判断する（ステップＳ１２０６）。ｐ＝１でない場合（ステップＳ１２０６：Ｎｏ）、ノードＮｉは、ｐをデクリメントして（ステップＳ１２０７）、ステップＳ１１０３に戻る。
【０１０８】
一方、ｐ＝１である場合（ステップＳ１２０６：Ｙｅｓ）、ノードＮｉは、対象ビットのビット位置に対応するハッシュテーブルを検索する（ステップＳ１２０８）。そして、ノードＮｉは、検索対象データＤｘが存在するか否かを判断する（ステップＳ１２０９）。
【０１０９】
検索対象データが存在しない場合（ステップＳ１２０９：Ｎｏ）、ノードＮｉは、ステップＳ１２０３に戻り、対象ビットがシフト可能か否かを判断することとなる。一方、検索対象データが存在する場合（ステップＳ１２０９：Ｙｅｓ）、ノードＮｉは、検索結果（陽性）をリプライ送信する（ステップＳ１２１０）。ノードＮｉは、必要に応じて関連するデータを抽出して検索結果として送信元コンピュータへリプライする。これにより、検索結果が陽性である場合の処理手順を終了する。
【０１１０】
＜エントリ通知処理例およびエントリ処理例＞
つぎに、エントリ通知処理とエントリ処理について説明する。エントリ通知処理では、エントリの対象となるデータ（以下、対象データ）をノードＮ１〜Ｎ４のいずれかのノードに登録させるエントリリクエストを通知する処理が実行される。エントリ処理では、エントリリクエストを受け付けたノードにより、対象データを登録するエントリ処理と、該ノードが有する階層型転置ブルームフィルタｔＢＦへのエントリ処理と、が実行される。
【０１１１】
エントリ通知処理を実行するコンピュータ（たとえば、管理サーバＭまたはクライアント。以下、単に「送信元コンピュータ」。）は、対象データのエントリリクエストをノードＮ１〜Ｎ４のいずれかのノードに送信する。各ノードの宛先については、ノードリスト１０１を参照することで特定することができる。エントリリクエストの例は後述する。対象データをエントリさせるノード（登録先ノード）を指定する。登録先ノードはノードＮ１〜Ｎ４のいずれのノードであってもよい。どのノードにエントリするかは、たとえば、送信元コンピュータの利用者が任意に指定することができる。また、あらかじめ各ノードの空き容量に応じて、エントリさせるノードを指定することとしてもよい。各ノードの空き容量は、各ノードが管理サーバＭに対して定期的にまたは管理サーバＭからの要求に応じて通知されるものとし、管理サーバＭがクライアントに対してブロードキャストして通知されるものとする。
【０１１２】
図１３は、送信元コンピュータによるエントリ通知処理例を示す説明図である。送信元コンピュータ（図１３では、クライアントＣ１）が、（１）ノードＮ２に対象データのエントリリクエスト１４０１を送信し、ノードＮ２からのリプライ１４０２を待つ。送信元コンピュータが、（２）ノードＮ２からのリプライ１４０２を受信すると、対象データのエントリが成功したか否かを判断する。送信元コンピュータが、対象データのエントリが成功したと判断した場合、エントリ通知処理を終了する。
【０１１３】
図１４は、エントリリクエストおよびリプライのデータ構造例を示す説明図である。図１４において、（Ａ）はエントリリクエスト１４０１、（Ｂ）はリプライ１４０２を示す。（Ａ）のエントリリクエスト１４０１のヘッダは、エントリリクエスト１４０１の送信元アドレスおよび送信元ポート番号と宛先アドレスおよび宛先ポート番号とを保持する。図１４では、コンピュータに割り当てた符号Ｃ１，Ｎ２をＩＰアドレスおよびポート番号の代わりに表記している。
【０１１４】
また、（Ａ）のエントリリクエスト１４０１のペイロードは、種類項目、登録データ項目に対しそれぞれの情報が保持されている。たとえば、種類項目には、「登録」、登録データ項目には、「Ｄｘ」が保持されている。
【０１１５】
また、（Ｂ）のリプライ１４０２のヘッダは、エントリリクエスト１４０１の送信元アドレスおよび送信元ポート番号と宛先アドレスおよび宛先ポート番号とが入れ替わった送信元アドレスと宛先アドレスとを保持する。（Ｂ）のリプライ１４０２のペイロードは、ブロック番号項目に対する情報が保持されている。たとえば、ブロック番号項目には、「４」が保持されている。すなわち、階層型転置ブルームフィルタｔＢＦ２のデータブロックｄｂ２−４に「Ｄｘ」が登録されたことを示している。つぎに、エントリリクエスト１４０１を受信したノードＮ２によるエントリ処理例について説明する。
【０１１６】
図１５は、ノードＮ２による階層型転置ブルームフィルタｔＢＦ２のエントリ処理例を示す説明図である。ノードＮ２が送信元コンピュータからエントリリクエストを受信する。階層型転置ブルームフィルタｔＢＦ２では、登録される対象データＤが与えられるハッシュ関数の種類数ｋ２をｋ２＝３とする。ここでは、ハッシュ関数Ｈ１（），Ｈ２（），Ｈ３（）を用いることとする。また、ハッシュテーブルの登録対象となるハッシュ関数をＨ１（）とする。
【０１１７】
まず、データブロック集合ｄｂ２のうちデータブロックｄｂ２−４に対象データＤｘが登録されたものとする。対象データＤｘを各ハッシュ関数Ｈ１（），Ｈ２（），Ｈ３（）に与えたときのハッシュ値は、例として以下の値とする。
Ｈ１（Ｄｘ）＝ｘ１
Ｈ２（Ｄｘ）＝ｘ２
Ｈ３（Ｄｘ）＝ｘ３
【０１１８】
また、階層型転置ブルームフィルタｔＢＦのエントリ処理では、更新対象となる転置ブルームフィルタｔｂｆ２（ｐ）内の特定のビットをＯＮにするが、その特定のビットがすでにＯＮになっている場合はそのままとする。
【０１１９】
ここで、ノードＮ２は、登録先のデータブロックｄｂ２−４のブロック番号４のハッシュテーブルＨＴ２−４に対するハッシュテーブルエントリＥ２−４を作成する。そして、ノードＮ２は、作成されたハッシュテーブルエントリＥ２−４を、ハッシュテーブルＨＴ２−４に追加登録する。
【０１２０】
そして、第１段のエントリ処理に移る。ノードＮ２は、更新対象となる転置ブルームフィルタｔｂｆ２（１）を、第１段の転置ブルームフィルタ列ｔＢＦ２（１）の中から特定する。具体的には、ノードＮ２は、各ハッシュ値ｘ１〜ｘ３を、第１段の転置ブルームフィルタ列ｔＢＦ２（１）の配列個数である８で割り算し、余り値を算出する。ハッシュ値ｘ１の余り値は「２」、ハッシュ値ｘ２の余り値は「５」、ハッシュ値ｘ３の余り値は「７」になったものとする。したがって、第１段での更新対象となる転置ブルームフィルタｔｂｆ２（１）は、転置ブルームフィルタｔｂｆ２（１−２），ｔｂｆ２（１−５），ｔｂｆ２（１−７）となる。
【０１２１】
また、最下段では、登録先のデータブロックｄｂ２−４のブロック番号４に対応するビット位置を更新対象ビットとする。したがってノードＮ２は、更新対象となる転置ブルームフィルタの先頭から４ビット目のビットをＯＮにする。これにより、第１段の転置ブルームフィルタ列ｔＢＦ２（１）のエントリ処理を終了する。
【０１２２】
つぎに、第２段のエントリ処理に移る。ノードＮ２は、更新対象となる転置ブルームフィルタｔｂｆ２（２）を、第２段の転置ブルームフィルタ列ｔＢＦ２（２）の中から特定する。具体的には、ノードＮ２は、各ハッシュ値ｘ１〜ｘ３を、第２段の転置ブルームフィルタ列ｔＢＦ２（２）の配列個数である１６で割り算し、余り値を算出する。ハッシュ値ｘ１の余り値は「８」、ハッシュ値ｘ２の余り値は「１１」、ハッシュ値ｘ３の余り値は「１３」になったものとする。したがって、第２段での更新対象となる転置ブルームフィルタｔｂｆ２（２）は、転置ブルームフィルタｔｂｆ２（２−８），ｔｂｆ２（２−１１），ｔｂｆ２（２−１３）となる。
【０１２３】
つぎに、転置ブルームフィルタｔｂｆ２（２−８），ｔｂｆ２（２−１１），ｔｂｆ２（２−１３）内のどのビット位置のビットをＯＮにするかについて説明する。転置前の階層型ブルームフィルタＢＦ２では、分割数をｄ２として、各ブルームフィルタ列ＢＦ２（ｐ）をｎ２（＝ｄ２[h2-(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)]、第ｐ段のブルームフィルタの配列数ｎ＝ｄ[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)]である階層型ブルームフィルタを、段ごとにブルームフィルタ列を構成する各ブルームフィルタ内の同一位置のビットどうしでまとめることで転置した階層型転置ブルームフィルタと、前記階層型ブルームフィルタの第１段のブルームフィルタ列に対応するデータブロック集合と、を有するデータ構造を各々のノードが保持するノード群で構成される検索システムであって、
前記ノード群のうちのいずれかのノードが、
検索対象データを受信する処理部と、
前記階層型転置ブルームフィルタに応じて、前記データブロック集合内での受信された前記検索対象データの存否を判定する処理部と、
前記検索対象データの送信元へ前記検索対象データの存否を示す検索結果を送信する処理部と、
を備えることを特徴とする検索システム。
【符号の説明】
【０１７３】
Ｎ１〜Ｎ５  ノード
Ｃ１〜Ｃ３  クライアント
Ｍ  管理サーバ
ｔＢＦ１〜ｔＢＦ４  階層型転置ブルームフィルタ
ｄｂ１〜ｄｂ４  データブロック集合
【図１】
0005664467.tif 000002
【図２】
0005664467.tif 000003
【図３】
0005664467.tif 000004
【図４】
0005664467.tif 000005
【図５】
0005664467.tif 000006
【図６】
0005664467.tif 000007
【図７】
0005664467.tif 000008
【図８】
0005664467.tif 000009
【図９】
0005664467.tif 000010
【図１０】
0005664467.tif 000011
【図１１】
0005664467.tif 000012
【図１２】
0005664467.tif 000013
【図１３】
0005664467.tif 000014
【図１４】
0005664467.tif 000015
【図１５】
0005664467.tif 000016
【図１６】
0005664467.tif 000017
【図１７】
0005664467.tif 000018
【図１８】
0005664467.tif 000019
【図１９】
0005664467.tif 000020