以下に添付図面を参照して、本発明にかかる検索プログラム、検索装置、および検索方法の実施の形態を詳細に説明する。まず、本実施の形態にかかる管理装置の構成例について説明する。
<管理装置のハードウェア構成例>
図1は、実施の形態にかかる管理装置のハードウェア構成例を示すブロック図である。図1において、検索装置は、CPU(Central Processing Unit)101と、ROM(Read Only Memory)102と、RAM(Random Access Memory)103と、磁気ディスクドライブ104と、磁気ディスク105と、光ディスクドライブ106と、光ディスク107と、ディスプレイ108と、I/F(Interface)109と、キーボード110と、マウス111と、スキャナ112と、プリンタ113と、を備えている。また、各構成部はバス100によってそれぞれ接続されている。
ここで、CPU101は、管理装置の全体の制御を司る。ROM102は、ブートプログラムなどのプログラムを記憶している。RAM103は、CPU101のワークエリアとして使用される。磁気ディスクドライブ104は、CPU101の制御にしたがって磁気ディスク105に対するデータのリード/ライトを制御する。磁気ディスク105は、磁気ディスクドライブ104の制御で書き込まれたデータを記憶する。
光ディスクドライブ106は、CPU101の制御にしたがって光ディスク107に対するデータのリード/ライトを制御する。光ディスク107は、光ディスクドライブ106の制御で書き込まれたデータを記憶したり、光ディスク107に記憶されたデータをコンピュータに読み取らせたりする。
ディスプレイ108は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ108は、たとえば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
インターフェース(以下、「I/F」と略する。)109は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク114に接続され、このネットワーク114を介して他の装置に接続される。そして、I/F109は、ネットワーク114と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F109には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード110は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス111は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ112は、画像を光学的に読み取り、管理装置内に画像データを取り込む。なお、スキャナ112は、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ113は、画像データや文書データを印刷する。プリンタ113には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
<管理装置の機能的構成例>
図2は、本実施の形態にかかる管理装置の構成例を示すブロック図である。管理装置200は、データブロック集合dbと、ハッシュテーブル群HTsと、階層型ブルームフィルタBFと、階層型転置ブルームフィルタtBFと、登録処理部201と、検索処理部202と、を備えている。
データブロック集合dbは、複数のデータブロックを有しており、各データブロックは、登録されたデータを保持している。なお、個々のデータブロックをdb#と表記する。#は数字であり、ブロック番号を示す。ブロック番号#は、そのデータブロックdb#のビット位置に対応する。
ハッシュテーブル群HTsは、データブロック集合db内の各データブロックdb#に対応するハッシュテーブルの集合である。なお、個々のハッシュテーブルをHT#と表記する。#は数字であり、データブロックdb#のブロック番号と一致する。ハッシュテーブルHT#は、データをある特定のハッシュ関数に与えたときのハッシュ値と、ハッシュ値の生成元となるデータ(データそのものでもデータへのポインタでもよい)を関連付けたテーブルである。
図3は、ハッシュテーブル群HTsの一例を示す説明図である。図3では、ハッシュ関数としてSHA−1を用いている。なお、どのハッシュ関数を用いるかはあらかじめ設定しておけばよい。
図2に戻って、階層型ブルームフィルタBFは、ブルームフィルタを階層構造にしたインデックス情報である。階層型ブルームフィルタBFについては後述する。ブルームフィルタとは、所定数のデータブロック内での擬陽性(疑陽性、偽陽性ともいう)/陰性を示すビットが複数配列されたインデックス情報である。ブルームフィルタのビットがONのときは擬陽性を示し、OFFのときは陰性を示す。なお、ビットの値が1をONとし、0をOFFとしてもよく、逆に、ビットの値が0をONとし、1をOFFとしてもよい。本実施の形態では、ビットの値が1をONとし、0をOFFとする。
階層型転置ブルームフィルタtBFは、階層型ブルームフィルタBFを転置したインデックス情報である。階層型転置ブルームフィルタtBFは、検索処理部202により生成される。階層型転置ブルーフィルタtBFの詳細は後述する。
データブロック集合db、ハッシュテーブル群HTs、および階層型ブルームフィルタBFは、図1に示したROM102、RAM103、磁気ディスク105などの記憶装置に記憶される。また、図2では、データブロック集合db、ハッシュテーブル群HTs、および階層型ブルームフィルタBFは、管理装置200内に記憶させているが、管理装置200外の外部装置に記憶させてもよい。この場合、管理装置200は、ネットワークを介して外部装置から読み出したり、外部装置に書き込んだりする。
登録処理部201は、データブロック集合dbに登録したいデータがエントリされると、データブロック集合dbの空き領域に登録する。データの登録の際には、ハッシュ関数によりハッシュ値を求め、登録先のデータブロックdb#に対応するハッシュテーブルHT#に、データ(またはそのポインタ)とハッシュ値とを追加する。また、登録先のデータブロックdb#にデータが新規に登録されたことを階層型ブルームフィルタBFに学習させるため、登録処理部201は、階層型ブルームフィルタBFを更新する。
検索処理部202は、検索対象データが入力されると、階層型ブルームフィルタBFを参照して、検索対象データが存在するであろうデータブロックdb#を特定する。検索対象データが存在するであろうデータブロックdb#が特定されなかった場合は、いずれのデータブロックdb#にも検索対象データは存在しない(陰性)。逆に、検索対象データが存在するであろうデータブロックdb#が特定された場合でも、特定されたデータブロックdb#には、必ずしも検索対象データが存在するとは限らない(擬陽性)。
なお、擬陽性が陽性になるか陰性になるかは、検索処理部202により最終的に特定されたデータブロックdb#に対応するハッシュテーブルHT#での検索結果に依存する。たとえば、検索処理部202により最終的に特定されたデータブロックdb#に対応するハッシュテーブルHT#において、検索対象データのハッシュ値がヒットすれば陽性、ヒットしなければ陰性となる。
なお、上述した登録処理部201および検索処理部202は、具体的には、たとえば、図1に示したROM102、RAM103、磁気ディスク105、光ディスク107などの記憶装置に記憶されたプログラムをCPU101に実行させることにより、その機能を実現する。
<階層型ブルームフィルタBF>
図4は、階層型ブルームフィルタBFの一例を示す説明図である。階層型ブルームフィルタBFは、h段×sビット幅のメモリ領域で構成されている。sビット幅は、データブロック集合dbのビット幅に対応する。また、各段のビット長sは最上段である第h段の分割数dに基づいて分割される。分割された各々はブルームフィルタであり、各段においてブルームフィルタ列を構成する。分割数dは基本的には2以上の整数であるが、最上段である第h段を単一のブルームフィルタとする場合は、d=1としてもよい。
任意の段をpとすると、第p段のブルームフィルタ列BF(p)を構成するブルームフィルタbf(p)のビット幅mは、m=s/d[h-(p-1)]となる。図4では、d=2としている。また、第p段のブルームフィルタ列BF(p)のブルームフィルタbf(p)の配列数nは、n=d[h-(p-1)]となる。
したがって、階層型ブルームフィルタBFでは、段が下がる(hが小さくなる)につれ、第p段のブルームフィルタ列BF(p)のブルームフィルタbf(p)の配列数が増加する。なお、最下段(第1段)のブルームフィルタ列Bf(1)のブルームフィルタbf(1)の配列個数は、データブロックdb#の個数と同一とする。
これにより、第1段までたどり着いたときにビットしたブルームフィルタbf(1)とデータブロックdb#とが一対一対応することになる。また、階層型ブルームフィルタBFの段数hは基本的には複数段であるが、1段(h=1)としてもよい。ただし、この場合は、d≠1とする。
<階層型ブルームフィルタBFの学習処理例>
図5は、登録処理部201による階層型ブルームフィルタBFの学習処理例を示す説明図である。図5では、説明上、全ビット幅s=4096ビット、段数h=3段、第h段での分割数d=2とする。
したがって、最下段である第1段のブルームフィルタ列BF(1)は、8(=d[h-(p-1)]=23)分割されてブルームフィルタbf(1−1)〜bf(1−8)により構成される。また、第2段のブルームフィルタ列BF(2)は、4(=d[h-(p-1)]=22)分割されてブルームフィルタbf(2−1)〜bf(2−4)により構成される。また、最上段である第3段のブルームフィルタ列BF(3)は、2(=d[h-(p-1)]=21)分割されてブルームフィルタbf(3−1)〜bf(3−2)により構成される。
また、登録される対象データDが与えられるハッシュ関数の種類数kをk=3とする。ここでは、ハッシュ関数H1(),H2(),H3()を用いることとする。また、ハッシュテーブルの登録対象となるハッシュ関数をH1()とする。
まず、データブロック集合dbのうちデータブロックdb3に対象データDが登録されたものとする。対象データDを各ハッシュ関数H1(),H2(),H3()に与えたときのハッシュ値は、例として以下の値とする。
H1(D)=1234567
H2(D)=3984012
H3(D)=9803323
また、階層型ブルームフィルタBFの学習処理では、更新対象となるブルームフィルタ内の特定のビットをONにするが、その特定のビットがすでにONになっている場合はそのままとする。
ここで、登録処理部201は、登録先のデータブロックdb3のブロック番号3のハッシュテーブルHT3に対するハッシュテーブルエントリE3を作成する。そして、登録処理部201は、作成されたハッシュテーブルエントリE3を、ハッシュテーブルHT3に追加登録する。
つぎに、登録処理部201は、更新対象となるブルームフィルタを、第1段のブルームフィルタ列BF(1)の中から特定する。最下段では、登録先のデータブロックdb3のブロック番号3と同一配列番号であるブルームフィルタbf(1−3)が対応する。したがって、ブルームフィルタbf(1−3)を更新対象とする。ブルームフィルタbf(1−3)は512ビットのビット列である。
また、登録処理部201は、各ハッシュ値を、第1段のブルームフィルタbf(1)のビット幅である512で割り算し、余り値を算出する。ハッシュ値H1(D)の余り値は「135」、ハッシュ値H2(D)の余り値は「140」、ハッシュ値H3(D)の余り値は「59」になったものとする。
つぎに、登録処理部201は、更新対象のブルームフィルタにおいて余り値に対応する位置のビットをONにする。なお、余り値が0の場合は、更新対象のブルームフィルタの末尾ビットをONにする。図5の例では、ブルームフィルタbf(1−3)は、512ビット有するため、余り値「135」については、先頭から135番目のビットをONにする。同様に、余り値「140」については、先頭から140番目のビットをONにする。余り値「59」については、先頭から59番目のビットをONにする。これにより、第1段での学習処理を終了する。
つぎに、第2段の学習処理に移る。登録処理部201は、更新対象となるブルームフィルタを、第2段のブルームフィルタ列BF(2)の中から特定する。具体的には、第1段での更新対象のブルームフィルタbf(1−3)のビット位置を包含するブルームフィルタを、第2段のブルームフィルタ列BF(2)の中から特定する。本例では、ブルームフィルタbf(2−2)となる。より具体的には、前段の第1段での更新対象のブルームフィルタbf(1−3)の配列番号3を、分割数d(=2)で割り算し、端数を切り上げることで、更新対象の配列番号は2となる。したがって、ブルームフィルタbf(2−2)が特定される。
そして、登録処理部201は、各ハッシュ値を、第2段のブルームフィルタbf(2)のビット幅である1024で割り算し、余り値を算出する。ハッシュ値H1(D)の余り値は「647」、ハッシュ値H2(D)の余り値は「652」、ハッシュ値H3(D)の余り値は「571」になったものとする。
つぎに、登録処理部201は、更新対象のブルームフィルタにおいて余り値に対応する位置のビットをONにする。なお、余り値が0の場合は、更新対象のブルームフィルタの末尾ビットをONにする。図5の例では、ブルームフィルタbf(2−2)は、1024ビット有するため、余り値「647」については、先頭から647番目のビットをONにする。同様に、余り値「652」については、先頭から652番目のビットをONにする。余り値「571」については、先頭から571番目のビットをONにする。これにより、第2段での学習処理を終了する。
つぎに、最上段である第3段の学習処理に移る。登録処理部201は、更新対象となるブルームフィルタを、第3段のブルームフィルタ列BF(3)の中から特定する。具体的には、第2段での更新対象のブルームフィルタbf(2−2)のビット位置を包含するブルームフィルタを、第3段のブルームフィルタ列BF(3)の中から特定する。本例では、ブルームフィルタbf(3−1)となる。より具体的には、前段の第2段での更新対象のブルームフィルタbf(2−2)の配列番号2を、分割数d(=2)で割り算することで、更新対象の配列番号は1となる。したがって、ブルームフィルタbf(3−1)が特定される。
そして、登録処理部201は、各ハッシュ値を、第3段のブルームフィルタbf(3)のビット幅である2048で割り算し、余り値を算出する。ハッシュ値H1(D)の余り値は「1671」、ハッシュ値H2(D)の余り値は「652」、ハッシュ値H3(D)の余り値は「1595」になったものとする。
つぎに、登録処理部201は、更新対象のブルームフィルタにおいて余り値に対応する位置のビットをONにする。なお、余り値が0の場合は、更新対象のブルームフィルタの末尾ビットをONにする。図5の例では、ブルームフィルタbf(3−1)は、2048ビット有するため、余り値「1671」については、先頭から1671番目のビットをONにする。同様に、余り値「652」については、先頭から652番目のビットをONにする。余り値「1595」については、先頭から1595番目のビットをONにする。これにより、第3段での学習処理を終了する。
このような手順により、登録処理部201は、階層型ブルームフィルタBFにデータエントリを学習させることとなる。
<階層型ブルームフィルタBFを用いた検索処理例>
図6は検索処理部202による階層型ブルームフィルタBFの検索処理例を示す説明図である。図6では、図5と同一の階層型ブルームフィルタBFを用いて説明する。なお、図6では、図5で登録された対象データDを検索対象データとして検索する例について説明する。
図5に示した学習処理では、最下段の第1段から処理したが、検索処理では最上段(図6の場合は第3段)から処理をおこなう。まず、検索処理部202は、対象データDについての3個のハッシュ値を、第3段の各ブルームフィルタbf(3)のビット幅2048で割り算したときの余り値「1671」、「652」、「1595」を求める。
つぎに、検索処理部202は、フィルタリング対象となるブルームフィルタを第3段のブルームフィルタ列BF(3)から特定する。第3段は最上段であるため、無条件で第3段のすべてのブルームフィルタbf(3−1),bf(3−2)が特定される。
そして、検索処理部202は、フィルタリング対象に特定されたブルームフィルタ群の中から、算出した余り値に対応する位置のビットがすべてONになっているブルームフィルタを特定する。第3段の場合、ブルームフィルタbf(3−1),bf(3−2)はいずれも、算出した余り値に対応する位置のビットがすべてONになっているものとする。これにより、第3段でのフィルタリング処理を終了する。
つぎに、第2段のフィルタリング処理に移る。検索処理部202は、対象データDについての3個のハッシュ値を、第2段の各ブルームフィルタbf(2)のビット幅1024で割り算したときの余り値「647」、「652」、「571」を求める。
つぎに、検索処理部202は、フィルタリング対象となるブルームフィルタを第2段のブルームフィルタ列BF(2)から特定する。最上段を除く残余の段の場合、1つ上の段において、算出した余り値に対応する位置のビットがすべてONになっているブルームフィルタbf(p+1)を探し、そのブルームフィルタbf(p+1)のビット位置に包含されるブルームフィルタbf(p)をフィルタリング対象とする。
第2段の場合、第3段で算出した余り値に対応する位置のビットがすべてONになっているブルームフィルタbf(3−1),bf(3−2)のビット位置に包含されるブルームフィルタbf(2−1)〜bf(2−4)をフィルタリング対象とする。
そして、検索処理部202は、フィルタリング対象に特定されたブルームフィルタ群の中から、算出した余り値に対応する位置のビットがすべてONになっているブルームフィルタを特定する。第2段の場合、ブルームフィルタbf(2−2),bf(2−3)は、算出した余り値に対応する位置のビットがすべてONになっているものとする。一方、ブルームフィルタbf(2−1),bf(2−4)については、算出した余り値に対応する位置のビットのいずれかがOFFであるものとする。
したがって、ブルームフィルタbf(2−1),bf(2−4)のビット位置に包含される下位の段のブルームフィルタbf(1−1),bf(1−2),bf(1−7),bf(1−8)は、フィルタリング対象外となり、対象データDの存在するデータブロックdb#は、ブルームフィルタbf(2−2),bf(2−3)のビット位置に包含されるデータブロックdb#に絞り込まれる。これにより、第2段でのフィルタリング処理を終了する。
つぎに、最下段である第1段のフィルタリング処理に移る。検索処理部202は、対象データDについての3個のハッシュ値を、第1段の各ブルームフィルタbf(1)のビット幅512で割り算したときの余り値「135」、「140」、「59」を求める。
つぎに、検索処理部202は、フィルタリング対象となるブルームフィルタを第1段のブルームフィルタ列BF(1)から特定する。第1段の場合、第2段で算出した余り値に対応する位置のビットがすべてONになっているブルームフィルタbf(2−2),bf(2−3)のビット位置に包含されるブルームフィルタbf(1−3)〜bf(1−6)をフィルタリング対象とする。
そして、検索処理部202は、フィルタリング対象に特定されたブルームフィルタ群の中から、算出した余り値に対応する位置のビットがすべてONになっているブルームフィルタを特定する。第1段の場合、ブルームフィルタbf(1−3),bf(1−6)は、算出した余り値に対応する位置のビットがすべてONになっているものとする。一方、ブルームフィルタbf(1−4),bf(1−5)については、算出した余り値に対応する位置のビットのいずれかがOFFであるものとする。
最下段では、これ以上、下位の段が存在しないため、ブルームフィルタbf(1−3),bf(1−6)に擬陽性がある。検索処理部202は、特定されたブルームフィルタbf(1−3)の配列番号「3」に対応するハッシュテーブルHT3に、ハッシュ値H1(D)が登録されているかを判定する。ハッシュテーブルHT3では、エントリE3が登録されているため、ハッシュテーブルHT3に対応するデータブロックdb3の中に対象データDが登録されていることが判明する。
一方、検索処理部202は、特定されたブルームフィルタbf(1−6)の配列番号「6」に対応するハッシュテーブルHT6に、ハッシュ値H1(D)が登録されているかも判定する。ハッシュテーブルHT6では、ハッシュ値H1(D)=1234567が登録されていないため、ハッシュテーブルHT6に対応するデータブロックdb6の中に対象データDが登録されていないことが判明する。これにより、検索処理を終了する。
このような手順により、検索処理部202は、階層型ブルームフィルタBFを利用して対象データDが存在するデータブロックを特定することができる。
次に、ブルームフィルタの擬陽性による影響について説明する。
ブルームフィルタの擬陽性の発生確率FPRは、ビット長がmのブルームフィルタがh段ある場合、データ登録数N(N<m)、ハッシュ関数の個数をk個とすると、ブルームフィルタの性質より、次式(2)のように表すことができる。
FPR={1−(1−1/m)kN}k≒{1−e(-kN/m))}k …(1)
この場合、k,m,Nを変更することにより、擬陽性の発生確率FPRを非常に小さくすることができる。すなわち、本実施形態では、k,m,Nの設定次第で、擬陽性の発生確率FPRを1よりも非常に小さい値(ほぼ0)に設定することができるようになる。したがって、図5の例では、ブルームフィルタbf(1−6)が選ばれることはほとんどありえない。
また、本実施形態では、データブロック数Ndbはdhであるため、高さ段数hは、次式(2)にて表すことができる。
h=log(Ndb)/log(d)+1 …(2)
上記式(2)は、log(Ndb)/log(d)が割り切れる場合を前提にしたが、そうでない場合、段によりdの値を他の段とは変えることで、hを決定することができる。
また、上述した検索処理では、ハッシュ値の数(k回(定数))だけ照合を行う必要があり、検索における1段あたりのフィルタリング対象の数は多くてもd個である。したがって、検索によるメモリアクセス回数MAは、最大でも次式(3)で表される程度である。
MA=k×d×log(Ndb)/log(d) …(3)
すなわち、段数h(=メモリ量)は、分割数dを増やすことにより小さくすることができ、その一方で、検索回数は分割数dの増加とともに大きくなるというトレードオフの関係にある。したがって、この関係を考慮することで、適切なメモリの運用が可能となる。
<階層型転置ブルームフィルタ>
つぎに、階層型転置ブルームフィルタについて説明する。上述した説明では、階層型ブルームフィルタBFの登録処理や検索処理について説明したが、検索速度をより高速化させるため、階層型ブルームフィルタBFを転置させる。
図7は、階層型ブルームフィルタBF内の第p段のブルームフィルタ列bf(p)の転置例を示す説明図である。(A)は、ブルームフィルタ列BF(p)を示している。ここでは、ブルームフィルタ列BF(p)は、例として、4分割されたブルームフィルタbf(p−1)〜bf(p−4)を示している。すなわち、ブルームフィルタ列BF(p)は、10ビット×4フィルタ数のビット列である。転置する場合は、4ビット×10フィルタ数のビット列となる。
(B)は、ブルームフィルタ列BF(p)の転置を示している。転置する場合、各ブルームフィルタbf(p−1)〜bf(p−4)の同一位置のビットを集めて、同一位置ごとに集められたビット列を、ビット位置順に配列させる。
具体的には、各ブルームフィルタbf(p−1)〜bf(p−4)の各先頭ビットを配列番号順にまとめてビット列{0110}とする。左から先頭ビット「0」がブルームフィルタbf(p−1)の先頭ビット、2番目のビット「1」がブルームフィルタbf(p−2)の先頭ビット、3番目のビット「1」がブルームフィルタbf(p−3)の先頭ビット、末尾ビット「0」がブルームフィルタbf(p−4)の先頭ビットである。
このビット列{0110}を、転置ブルームフィルタtbf(p−1)と称す。2番目〜末尾のビット位置についても同様にまとめることで、転置ブルームフィルタtbf(p−1)〜tbf(p−10)を得る。転置ブルームフィルタtbf(p−1)〜tbf(p−10)がビット位置順に配列されたインデックス情報を、転置ブルームフィルタ列tBF(p)と称す。転置ブルームフィルタ列tBF(p)をすべての段で生成することで、階層型転置ブルームフィルタtBFとなる。
(C)は、ブルームフィルタ列BF(p)と転置ブルームフィルタ列tBF(p)との検索比較例を示している。ここでは、2種類のハッシュ関数により対象データDのハッシュ値を2つ求め、ブルームフィルタ列BF(p)を構成するブルームフィルタbf(p)のビット幅10で割り算した余り値を、「4」および「8」とする。
ブルームフィルタ列BF(p)で検索する場合、余り値「4」および「8」となるビット位置「4」および「8」がすべてONになっているブルームフィルタbf(p)をブルームフィルタ列BF(p)から探す。この場合、ブルームフィルタbf(p−2)が該当する。
一方、転置ブルームフィルタ列tBF(p)を用いる場合、ブルームフィルタ列BF(p)のように、ビット位置「4」および「8」がすべてONになっているブルームフィルタbf(p)を検索せず、余り値「4」および「8」と同一配列番号の転置ブルームフィルタtbf(p−4),tbf(p−8)を抽出する。そして、抽出された転置ブルームフィルタtbf(p−4),tbf(p−8)をAND演算することで、ともにONになっているビット位置「2」を特定する。
ブルームフィルタ列BF(p)の場合は、4個のブルームフィルタbf(p−1)〜bf(p−4)内の4ビット目と8ビット目を参照するため、8(=4×2)のメモリアクセスが必要となる。一方、転置ブルームフィルタ列tBF(p)は、転置前のブルームフィルタbf(p−1)〜bf(p−4)のビット位置ごとに折りたたまれたインデックス情報である。したがって、転置ブルームフィルタtbf(p−4),tbf(p−8)を抽出するという2回のメモリアクセスとそのAND演算により判定することが可能となる。したがって、メモリアクセス頻度が低減され、検索速度が高速化することとなる。
<階層型転置ブルームフィルタを用いた検索処理例>
図8は検索処理部202による階層型転置ブルームフィルタの検索処理例を示す説明図である。図8では、説明上、全ビット幅s=64ビット、段数h=3段、第h段での分割数d=2とする。
最下段である第1段のブルームフィルタ列BF(1)を構成するブルームフィルタのビット幅は、8(=s/dh=64/23)ビットであるため、最下段である第1段の転置ブルームフィルタ列tBF(1)は、8(=s/dh=64/23)個の転置ブルームフィルタtbf(1−1)〜tbf(1−8)により構成される。
また、第2段の転置ブルームフィルタ列tBF(2)を構成するブルームフィルタのビット幅は、16(=s/dh=64/22)ビットであるため、第2段の転置ブルームフィルタ列tBF(2)は、16(=s/dh=64/22)個の転置ブルームフィルタtbf(2−1)〜tbf(2−16)により構成される。
また、最上段である第3段のブルームフィルタ列BF(3)を構成するブルームフィルタのビット幅は、32(=s/dh=64/21)ビットであるため、最上段である第3段の転置ブルームフィルタ列tBF(3)は、32(=s/dh=64/21)個の転置ブルームフィルタtbf(3−1)〜tbf(3−32)により構成される。
なお、図8では、説明上、比較のため、転置ブルームフィルタ列tBF(1)〜tBF(3)とともに、転置前のブルームフィルタ列BF(1)〜BF(3)を併記しておく。
まず、検索処理部202は、検索対象データDxについてのハッシュ関数H1()〜H3()での3個のハッシュ値を、第3段の転置ブルームフィルタ数32で割り算したときの余り値「2」、「19」、「27」を求める。
つぎに、検索処理部202は、フィルタリング対象となる転置ブルームフィルタを第3段の転置ブルームフィルタ列tBF(3)から特定する。具体的には、余り値と同一ビット位置(余り値が0の場合は末尾位置)となる転置ブルームフィルタtbf(3−2),tbf(3−19),tbf(3−27)を特定する。そして、特定された転置ブルームフィルタtbf(3−2),tbf(3−19),tbf(3−27)の各ビット列{10},{11},{10}のAND演算をおこなう。そのAND結果は、{10}となる。
検索処理部202は、AND結果に「1」が含まれていない場合は、データブロック集合dbには検索対象データDxが存在しないと判定する。一方、AND結果に「1」が含まれている場合、検索対象データDxを登録したかもしれないため、1つ下の段に移る。
第2段においても、まず、検索処理部202は、検索対象データDxについての3個のハッシュ値を、第2段の転置ブルームフィルタ数16で割り算したときの余り値「8」、「11」、「13」を求める。
つぎに、検索処理部202は、フィルタリング対象となる転置ブルームフィルタを第2段の転置ブルームフィルタ列tBF(2)から特定する。具体的には、余り値と同一ビット位置(余り値が0の場合は末尾位置)となる転置ブルームフィルタtbf(2−8),tbf(2−11),tbf(2−13)を特定する。そして、特定された転置ブルームフィルタtbf(2−8),tbf(2−11),tbf(2−13)の各ビット列{0110},{0100},{0110}のAND演算をおこなう。そのAND結果は、{0100}となる。
検索処理部202は、AND結果に「1」が含まれていない場合は、データブロック集合dbには検索対象データDxが存在しないと判定する。一方、AND結果に「1」が含まれている場合、検索対象データDxを登録したかもしれないため、1つ下の段に移る。
最下段である第1段においても、まず、検索処理部202は、検索対象データDxについての3個のハッシュ値を、第1段の転置ブルームフィルタ数8で割り算したときの余り値「2」、「5」、「7」を求める。
つぎに、検索処理部202は、フィルタリング対象となる転置ブルームフィルタを第1段の転置ブルームフィルタ列tBF(1)から特定する。具体的には、余り値と同一ビット位置(余り値が0の場合は末尾位置)となる転置ブルームフィルタtbf(1−2),tbf(1−5),tbf(1−7)を特定する。そして、特定された転置ブルームフィルタtbf(1−2),tbf(1−5),tbf(1−7)の各ビット列{00110110},{10011010},{00110111}のAND演算をおこなう。そのAND結果は、{00010010}となる。
これ以上下の段は存在しないため、擬陽性により、AND結果{00010010}が「1」のビット位置4,7に対応するデータブロックdb4,db7に検索対象データDxが存在する可能性がある。
この場合、ハッシュテーブルHT4,HT7に対しハッシュ関数H1()でのハッシュ値をキーにして検索することで、データブロックdb4がヒットし、データブロックdb7はヒットしなかったものとする。これにより、検索対象データDxは、データブロックdb4に登録されていることが判明する。これにより、検索処理を終了する。
このような手順により、検索処理部202は、階層型転置ブルームフィルタを利用することで、階層型ブルームフィルタBFに比べてもより高速に対象データを検索することができる。
<検索処理部202の詳細な機能的構成>
つぎに、検索処理部202の詳細な機能的構成例について説明する。
図9は、検索処理部202の機能的構成例を示すブロック図である。検索処理部202は、受付部901と、転置部902と、変換部903と、第1の特定部904と、第2の特定部905と、判断部906と、判定部907と、抽出部908と、出力部909とを備えている。
受付部901は、ブルームフィルタ列BF(p)の転置要求を受け付ける機能を有する。たとえば、階層型ブルームフィルタBFから階層型転置ブルームフィルタtBFへの転置要求を受け付ける。
ここで、転置要求とは、ブルームフィルタ列BF(p)を転置ブルームフィルタ列tBF(p)に転置させるリクエストである。たとえば、管理装置200が起動して起動が完了した旨の起動完了通知を転置要求とする。これにより、管理装置200が起動することで、階層型ブルームフィルタBFが階層型転置ブルームフィルタtBFに転置される。このように起動時に一括して、階層型転置ブルームフィルタtBFに転置しておけば、シャットダウンするまでは常時転置ブルームフィルタtBFを利用することができる。
また、データブロック集合dbに対する検索要求を転置要求としてもよい。これにより、検索処理部202は、検索要求があるまでは待機しておき、検索要求があると、階層型ブルームフィルタBFのうち検索処理部202で用いられるブルームフィルタ列BF(p)を転置させることとなる。これにより、検索頻度が高くなるにつれ、転置ブルームフィルタ列tBF(p)が増加する。したがって、検索に必要なブルームフィルタ列BF(p)から徐々に転置させるため、シャットダウンまでに利用されなかったブルームフィルタ列の無駄な転置処理を低減することができる。
転置部902は、受付部901によって転置要求が受け付けられた場合、ブルームフィルタ列BF(p)を、転置ブルームフィルタ列tBF(p)に転置する機能を有する。具体的には、転置部902では、ブルームフィルタ列BF(p)を、図7に示したような手法により、転置ブルームフィルタ列tBF(p)に転置する。
たとえば、ブルームフィルタ列BF(p)は、n(=d[h-(p-1)])個のブルームフィルタbf(p−1)〜bf(p−n)が配列されたインデックス情報である。また、各ブルームフィルタbf(p−1)〜bf(p−n)のビット幅は、m(=s/n)ビットである。
ブルームフィルタ列BF(p)を図7にしたがって転置すると、転置ブルームフィルタ列tBF(p)は、m(=s/n)個の転置ブルームフィルタtbf(p−1)〜tbf(p−m)が配列されたインデックス情報となる。各転置ブルームフィルタtbf(p−1)〜tbf(p−m)のビット幅は、n(=d[h-(p-1)])ビットとなる。このように転置により、配列数とビット幅が入れ替わる。
変換部903は、複数種類(種類数k)のハッシュ関数に基づいて、ハッシュ関数ごとに、検索対象データを、転置ブルームフィルタの配列位置をあらわす位置情報に変換する機能を有する。具体的には、たとえば、k個の異なるハッシュ関数H1()〜Hk()に検索対象データを与えることで、k個のハッシュ値が得られる。
図5に示したブルームフィルタ列BF(p)へのエントリでは、ブルームフィルタ列BF(p)を構成するブルームフィルタのビット幅m(=s/n)でハッシュ値を除算し、その余り値に対応するビット位置をONにしていた。
このため、変換部903では、k個のハッシュ値が得られると、転置ブルームフィルタ列tBF(p)を構成する転置ブルームフィルタの配列数m(=s/n)でハッシュ値を除算し、その余り値を算出する。このk個の余り値が、転置ブルームフィルタの配列位置をあらわす位置情報である。なお、算出された余り値が0の場合の位置情報は、mとする。
第1の特定部904は、転置ブルームフィルタ列tBF(p)の中から、変換部903によって変換された位置情報に対応する転置ブルームフィルタを位置情報ごとに特定する機能を有する。具体的には、変換部903から得られた位置情報と配列番号が一致する転置ブルームフィルタを転置ブルームフィルタ列tBF(p)の中から特定する。
図8に示した例では、第3段の転置ブルームフィルタ列tBF(3)では、余り値(位置情報)が「2」、「19」、「27」であるため、配列番号が「2」、「19」、「27」である転置ブルームフィルタtbf(3−2),tbf(3−19),tbf(3−27)を特定する。
第2の特定部905は、第1の特定部904によって特定された複数の転置ブルームフィルタtbf(p)に共通する位置情報に対応するブルームフィルタbf(p)を、ブルームフィルタ列BF(p)の中から特定する機能を有する。具体的には、第1の特定部904によって特定された複数の転置ブルームフィルタtbf(p)のビット列をAND演算する。このAND演算によって「1」が出現したビットの位置が、転置前のブルームフィルタ列BF(p)でエントリ時にONになったであろうビットを有するブルームフィルタである。
図8に示した例では、第3段において転置ブルームフィルタtbf(3−2),tbf(3−19),tbf(3−27)をAND演算すると、AND結果では先頭のビット位置が「1」となる。したがって、転置前のブルームフィルタ列BF(3)のうちブルームフィルタbf(3−1)のいずれかのビットが、検索対象データのエントリ時にONになった可能性があることがわかる。
このように、第1の特定部904および第2の特定部905により、転置ブルームフィルタ列tBF(p)へのアクセス回数が転置前のブルームフィルタ列BF(p)よりも減少する。したがって、転置ブルームフィルタtbf(p)の段数pが増加すればするほど、転置前のブルームフィルタ列BF(p)よりもアクセス回数が格段に抑えられ、検索速度の高速化を実現することができる。
判断部906は、第2の特定部905によって特定されたブルームフィルタを配列要素とするブルームフィルタ列が存在するか否かを判断する機能を有する。具体的には、転置ブルームフィルタ列tBF(p)の1つ下の段の転置ブルームフィルタ列が存在するか否かを判断するだけでよい。より具体的には、p=1であるか否かをみるだけでよい。
1つ下の段の転置ブルームフィルタ列が存在する場合(p≠1)は、第1の特定部904により、1つ下の段の転置ブルームフィルタ列をあらたに転置ブルームフィルタ列tBF(p)とする。一方、1つ下の段の転置ブルームフィルタ列が存在しない場合(p=1)、転置ブルームフィルタ列tBF(p)は、最下段である第1段の転置ブルームフィルタ列tBF(1)となる。
判定部907は、判断部906によって存在しないと判断された場合、データブロック集合dbのうち、第2の特定部905によって特定されたブルームフィルタbf(p)に対応するデータブロックdb#内での検索対象データの有無を判定する機能を有する。p=1の場合、第2の特定部905によって特定されたブルームフィルタbf(1)はデータブロックと一対一対応するため、第2の特定部905でのAND結果で「1」になったビットの位置をブロック番号#とするデータブロックdb#を判定対象とする。判定部907では、判定対象のデータブロックdb#は擬陽性であるため、陽性であるか陰性であるかを判定することとなる。
そして、判定対象のデータブロックdb#のハッシュテーブルHT#を参照して、検索対象データの擬陽性/陰性を判定する。この場合、階層型ブルームフィルタBFを用いた検索処理と同様、特定のハッシュ関数(たとえば、H1())による検索対象データのハッシュ値をキーにして、ハッシュテーブルHT#からデータ(またはそのポインタ)の有無を判定する。存在しない場合は、擬陽性によりヒットミスしたこととなる。
抽出部908は、判定部907によって陽性であると判定された場合、判定対象のデータブロックdb#から検索対象データを抽出する機能を有する。具体的には、たとえば、判定対象のデータブロックに対応するハッシュテーブルHT#によりデータの格納位置が判明するため、抽出部908は、その格納位置から検索対象データや検索対象データに関連するデータを抽出する。
たとえば、検索対象データそのものを判定対象のデータブロックdb#から抽出する。抽出できた場合は、検索対象データが登録されていることが判明する。また、検索対象データがファイル番号である場合は、ファイル番号に関連するファイルデータを抽出する。また、検索対象データが辞書や用語の見出し語である場合は、見出し語の用語解説データを抽出する。
出力部909は、判定部907による判定結果や抽出部908によって抽出されたデータを出力する。たとえば、検索対象データの陽性または陰性といった判定結果や、陽性である場合の抽出データを出力する。出力形式としては、ディスプレイ108への表示、音声出力、印刷出力、他の装置への送信などがある。
<登録処理部201による階層型ブルームフィルタBFの学習処理手順>
図10は、登録処理部201による階層型ブルームフィルタBFの学習処理手順を示すフローチャートである。まず、登録処理部201は、登録したいデータ(対象データD)があるか否かを判断する(ステップS1001)。対象データDがある場合(ステップS1001:Yes)、登録処理部201は、段数pをp=1に設定し(ステップS1002)、p>h(hは階層型ブルームフィルタBFの最上段)であるか否かを判断する(ステップS1003)。p>hでない場合(ステップS1003:No)、登録処理部201は、k種類のハッシュ関数を用いて、対象データのk個のハッシュ値を算出する(ステップS1004)。そして、k個のハッシュ値をブルームフィルタ列BF(p)のビット幅で除算して、k個の余り値を算出する(ステップS1005)。
つぎに、登録処理部201は、p段目のブルームフィルタ列BF(p)の中から登録先のブルームフィルタbf(p)rを特定する(ステップS1006)。p=1の場合は、保存先のデータブロックdb#のブロック番号#に対応するブルームフィルタbf(1−#)を登録先のブルームフィルタbf(p)rとする。
具体的には、図5に示したように、対象データDをデータブロックdb3に登録する場合は、データブロックdb3のブロック番号3と同一配列番号である第1段のブルームフィルタbf(1−3)を登録先のブルームフィルタbf(1)rとする。
p≠1の場合は、p段目のブルームフィルタ列BF(p)の中から、(p−1)段目の登録先のブルームフィルタbf(p−1)rのビット位置に対応するブルームフィルタbf(p)をあらたな登録先のブルームフィルタbf(p)rとする。
具体的には、図5に示したように、P=2とすると、2段目のブルームフィルタ列BF(2)の中から、1段目の登録先のブルームフィルタbf(1)rであるブルームフィルタbf(1−3)のビット位置を包含するブルームフィルタbf(2−2)をあらたな登録先のブルームフィルタbf(2)rとする。
そして、登録先のブルームフィルタbf(p)rに、ステップS1005で算出されたk個の余り値をエントリする(ステップS1007)。すなわち、余り値と同一ビット位置のビットをONにする。余り値が0の場合は、末尾ビットをONにする。そして、段数pをインクリメントして(ステップS1008)、ステップS1003に戻る。
ステップS1003において、p>hである場合(ステップS1003:Yes)、対象データのハッシュテーブルエントリを追加する(ステップS1009)。具体的には、たとえば、図4に示したように、ハッシュテーブルエントリE3をハッシュテーブルHT3に追加登録する。
そして、ステップS1001に戻る。ステップS1001において、対象データDがない場合(ステップS1001:No)、登録処理部201による階層型ブルームフィルタBFの学習処理を終了する。このような処理手順により、階層型ブルームフィルタBFが構築されることとなる。
<検索処理部202による検索処理手順>
図11および図12は、検索処理部202による検索処理手順を示すフローチャートである。なお、検索処理部202により利用されるブルームフィルタは、すでに一括転置済みの階層型転置ブルームフィルタtBFでもよく、階層型ブルームフィルタBFでもよい。階層型ブルームフィルタBFを用いる場合は、未転置のブルームフィルタが特定される都度転置処理をおこなう。
すなわち、検索しながら階層型転置ブルームフィルタtBFを構築していく。図11および図12では、検索しながら階層型転置ブルームフィルタtBFを構築していく場合の修理手順について説明する。なお、一括転置済みの場合は、転置済みか否かの判断(ステップS1104)と転置処理(ステップS1105)を省略するだけでよい。
まず、図11において、検索処理部202は、受付部901により、検索対象データDxを待ち受け(ステップS1101:No)、検索対象データDxが受け付けられた場合(ステップS1101:Yes)、検索処理部202は、変換部903により、検索対象データDxをk種類のハッシュ関数に与えてk個のハッシュ値を算出する(ステップS1102)。
そして、検索処理部202は、p=h、すなわち、段数pを最大段数hに設定し(ステップS1103)、p段目のブルームフィルタ列BF(p)が転置済みであるか否かを判断する(ステップS1104)。転置済みである場合(ステップS1104:Yes)、ステップS1106に移行する。一方、未転置である場合(ステップS1104:No)、検索処理部202は、転置部902により、p段目のブルームフィルタ列BF(p)を転置して(ステップS1105)、ステップS1106に移行する。
ステップS1106では、検索処理部202は、変換部903により、k個のハッシュ値を転置ブルームフィルタの配列数で除算して、k個の余り値を算出する(ステップS1106)。そして、検索処理部202は、第1の特定部904により、p段目の転置ブルームフィルタ列tBF(p)から、k個の余り値に対応するk個の転置ブルームフィルタtbf(p)rを特定する(ステップS1107)。
そして、検索処理部202は、第2の特定部905により、k個の転置ブルームフィルタtbf(p)rをAND演算し(ステップS1108)、図12のステップS1201に移行する。
図12において、検索処理部202は、第2の特定部905により、AND結果の先頭ビットを対象ビットに設定し(ステップS1201)、対象ビットがONであるか否かを判断する(ステップS1202)。ONでない場合、検索処理部202は、判定部907により、対象ビットがシフト可能か否かを判断する(ステップS1203)。具体的には、対象ビットが末尾ビットであるか否かを判断する。
シフト可能である場合(ステップS1203:Yes)、検索処理部202は、対象ビットを1ビット末尾方向へシフトし(ステップS1204)、ステップS1202に戻る。一方、ステップS1203においてシフト可能でない場合(ステップS1203:No)、検索処理部202は、判定部907により、検索結果(陰性)と判定し、出力部909から出力する(ステップS1205)。これにより、検索結果が陰性である場合の処理手順を終了する。
一方、ステップS1202において、対象ビットがONであった場合(ステップS1202:Yes)、検索処理部202は、判断部906により、現在の段数pがp=1であるか否かを判断する(ステップS1206)。p=1でない場合(ステップS1206:No)、pをデクリメントして(ステップS1207)、ステップS1104に戻る。
一方、p=1である場合(ステップS1206:Yes)、検索処理部202は、判定部907により、対象ビットのビット位置に対応するハッシュテーブルを検索する(ステップS1208)。そして、検索対象データDxが存在するか否かを判断する(ステップS1209)。
検索対象データが存在しない場合(ステップS1209:No)、ステップS1203に戻り、対象ビットがシフト可能か否かを判断することとなる。一方、検索対象データが存在する場合(ステップS1209:Yes)、検索処理部202は、検索結果(陽性)を出力する(ステップS1210)。検索処理部202は、必要に応じて抽出部908により関連するデータを抽出して検索結果として出力する。これにより、検索結果が陰性である場合の処理手順を終了する。
以上説明したように、本実施の形態によれば、ブルームフィルタ列BF(p)を転置して転置ブルームフィルタ列tBF(p)とすることで、メモリアクセスが低減され、検索速度が高速化するという効果を奏する。特に、階層型転置ブルームフィルタtBFとすることで、段ごとのメモリアクセスが低減されるため、より高速に検索をおこなうことができる。
また、起動完了通知を転置要求とすることで、管理装置200が起動すると、階層型ブルームフィルタBFが階層型転置ブルームフィルタtBFに転置される。このように起動時に一括して、階層型転置ブルームフィルタtBFに転置しておけば、シャットダウンするまでは常時階層型転置ブルームフィルタtBFを利用することができる。
また、データブロック集合dbに対する検索要求を転置要求とすることで、検索要求があると、階層型ブルームフィルタBFのうち検索処理部202で用いられるブルームフィルタ列BF(p)を転置させることとなる。これにより、検索頻度が高くなるにつれ、転置ブルームフィルタ列tBF(p)が増加する。したがって、検索に必要なブルームフィルタ列BF(p)から徐々に転置させるため、シャットダウンまでに利用されなかったブルームフィルタ列の無駄な転置処理を低減することができる。
また、階層型ブルームフィルタBFから転置された階層型転置ブルームフィルタtBFの場合、最下段になるまでは、AND結果のONの有無だけで擬陽性であるか陰性であるかを判断し、AND結果に1つでもONのビットがあれば、擬陽性と判断して、1つ下の段に移行する。このように、AND結果を利用することで、陰性か否かを容易に判断でき、検索対象データが存在しないことを早期に特定することができる。
また、階層型転置ブルームフィルタtBFだけをメモリに保持しておけば検索が可能であるため、階層型ブルームフィルタBFを保持しておく必要なない。これにより、省メモリ化を図ることができる。
<階層型転置ブルームフィルタtBFの学習処理例>
図13は、登録処理部201による階層型転置ブルームフィルタtBFの学習処理例を示す説明図である。ここでは、図8に示した階層型転置ブルームフィルタtBFを例にあげて説明する。また、図8では、検索対象データDxを検索してヒットさせた例について説明したが、図13では、検索対象データDx(図13では、対象データDxとする)がデータブロック集合dbにまだ登録されていないものとして説明する。
また、登録される対象データDが与えられるハッシュ関数の種類数kをk=3とする。ここでは、ハッシュ関数H1(),H2(),H3()を用いることとする。また、ハッシュテーブルの登録対象となるハッシュ関数をH1()とする。
まず、データブロック集合dbのうちデータブロックdb4に対象データDxが登録されたものとする。対象データDxを各ハッシュ関数H1(),H2(),H3()に与えたときのハッシュ値は、例として以下の値とする。
H1(Dx)=x1
H2(Dx)=x2
H3(Dx)=x3
また、階層型転置ブルームフィルタtBFの学習処理では、更新対象となる転置ブルームフィルタtbf(p)内の特定のビットをONにするが、その特定のビットがすでにONになっている場合はそのままとする。
ここで、登録処理部201は、登録先のデータブロックdb4のブロック番号4のハッシュテーブルHT4に対するハッシュテーブルエントリE4を作成する。そして、登録処理部201は、作成されたハッシュテーブルエントリE4を、ハッシュテーブルHT4に追加登録する。
そして、第1段の学習処理に移る。登録処理部201は、更新対象となる転置ブルームフィルタtbf(1)を、第1段の転置ブルームフィルタ列tBF(1)の中から特定する。具体的には、登録処理部201は、各ハッシュ値x1〜x3を、第1段の転置ブルームフィルタ列tBF(1)の配列個数である8で割り算し、余り値を算出する。ハッシュ値x1の余り値は「2」、ハッシュ値x2の余り値は「5」、ハッシュ値x3の余り値は「7」になったものとする。したがって、第1段での更新対象となる転置ブルームフィルタtbf(1)は、転置ブルームフィルタtbf(1−2),tbf(1−5),tbf(1−7)となる。
また、最下段では、登録先のデータブロックdb4のブロック番号4に対応するビット位置を更新対象ビットとする。したがって、更新対象となる転置ブルームフィルタの先頭から4ビット目のビットをONにする。これにより、第1段の転置ブルームフィルタ列tBF(1)の学習処理を終了する。
つぎに、第2段の学習処理に移る。登録処理部201は、更新対象となる転置ブルームフィルタtbf(2)を、第2段の転置ブルームフィルタ列tBF(2)の中から特定する。具体的には、登録処理部201は、各ハッシュ値x1〜x3を、第2段の転置ブルームフィルタ列tBF(2)の配列個数である16で割り算し、余り値を算出する。ハッシュ値x1の余り値は「8」、ハッシュ値x2の余り値は「11」、ハッシュ値x3の余り値は「13」になったものとする。したがって、第2段での更新対象となる転置ブルームフィルタtbf(2)は、転置ブルームフィルタtbf(2−8),tbf(2−11),tbf(2−13)となる。
つぎに、転置ブルームフィルタtbf(2−8),tbf(2−11),tbf(2−13)内のどのビット位置のビットをONにするかについて説明する。転置前の階層型ブルームフィルタBFでは、分割数をdとして、各ブルームフィルタ列BF(p)をn(=d[h-(p-1)])個に分割した。そして、これにより、各ブルームフィルタ列BF(p)のビット幅は、m(=s/n)ビットになった。
このため、階層型ブルームフィルタBFの学習処理では、第(p−1)段での更新対象のブルームフィルタbf((p−1)−#)のビット位置を包含するブルームフィルタbf(p)を、第p段のブルームフィルタ列BF(p)の中から特定していた。
たとえば、図5の例では、第2段において、前段の第1段での更新対象のブルームフィルタbf(1−3)の配列番号3を、分割数d(=2)で割り算し、端数を切り上げることで、更新対象の配列番号は2となる。したがって、ブルームフィルタbf(2−2)が特定される。
これに対し、階層型転置ブルームフィルタtBFでは、配列個数nとビット幅mが入れ替わっているため、第(p−1)段の更新対象のブルームフィルタbf((p−1)−#)の配列番号#ではなく、第(p−1)段での更新対象ビット位置を分割数dで割り算し、端数を切り上げる。
第2段の場合、第1段での更新対象ビットは、先頭から4ビット目のビットであり、転置ブルームフィルタtbf(1−2),tbf(1−5),tbf(1−7)の4ビット目がONにされた。したがって、第2段の更新対象ビットは、d=2であるため、先頭から4/d=2ビット目のビットを更新対象ビットとする。本例では、転置ブルームフィルタtbf(2−8),tbf(2−11),tbf(2−13)の先頭から2ビット目のビットをONにすることになる。これにより、第2段の転置ブルームフィルタ列tBF(2)の学習処理を終了する。
つぎに、第3段の学習処理に移る。登録処理部201は、更新対象となる転置ブルームフィルタtbf(3)を、第3段の転置ブルームフィルタ列tBF(3)の中から特定する。具体的には、登録処理部201は、各ハッシュ値x1〜x3を、第3段の転置ブルームフィルタ列tBF(3)の配列個数である32で割り算し、余り値を算出する。ハッシュ値x1の余り値は「2」、ハッシュ値x2の余り値は「19」、ハッシュ値x3の余り値は「27」になったものとする。したがって、第3段での更新対象となる転置ブルームフィルタtbf(3)は、転置ブルームフィルタtbf(3−2),tbf(3−19),tbf(3−27)となる。
つぎに、転置ブルームフィルタtbf(3−2),tbf(3−19),tbf(3−27)内の更新対象ビットを決める。第2段と同様、第(p−1)段の更新対象のブルームフィルタbf((p−1)−#)の配列番号#ではなく、第(p−1)段での更新対象ビット位置を分割数dで割り算し、端数を切り上げる。
第3段の場合、前段である第2段での更新対象ビットは、先頭から2ビット目のビットであり、転置ブルームフィルタtbf(2−8),tbf(2−11),tbf(2−13)の2ビット目がONにされた。したがって、第3段の更新対象ビットは、d=2であるため、先頭から2/d=1ビット目のビットを更新対象ビットとする。本例では、転置ブルームフィルタtbf(3−2),tbf(3−19),tbf(3−27)の先頭ビットをONにすることになる。これにより、第3段の転置ブルームフィルタ列tBF(3)の学習処理を終了する。
<登録処理部201による階層型転置ブルームフィルタtBFの学習処理手順>
図14は、登録処理部201による階層型ブルームフィルタBFの学習処理手順を示すフローチャートである。まず、登録処理部201は、登録したいデータ(対象データDx)があるか否かを判断する(ステップS1401)。対象データDxがある場合(ステップS1401:Yes)、登録処理部201は、段数pをp=1に設定し(ステップS1402)、p>h(hは階層型転置ブルームフィルタtBFの最上段)であるか否かを判断する(ステップS1403)。p>hでない場合(ステップS1403:No)、登録処理部201は、k種類のハッシュ関数を用いて、対象データDxのk個のハッシュ値を算出する(ステップS1404)。
つぎに、登録処理部201は、k個のハッシュ値を第p段の転置ブルームフィルタtBF(p)の配列個数で除算して、k個の余り値を算出する(ステップS1405)。そして、登録処理部201は、k個の余り値と同一配列番号のk個の転置ブルームフィルタtbf(p)rを特定する(ステップS1406)。
このあと、p=1であるか否かを判断し(ステップS1407)、p=1である場合(ステップS1407:Yes)、登録処理部201は、特定されたk個の転置ブルームフィルタtbf(p)rに、対象データDxの所属データブロックdb#のブロック番号#をエントリする(ステップS1408)。すなわち、対象データDxの所属データブロックdb#のブロック番号#を更新対象ビット位置#に設定し、特定されたk個の転置ブルームフィルタtbf(p)rの更新対象ビット位置#のビットをONにする。そして、ステップS1410に移行する。
一方、ステップS1407において、p≠1である場合(ステップS1407:No)、特定されたk個の転置ブルームフィルタtbf(p)rに、対象データDxの第(p−1)段での更新対象ビット位置を分割数dで除算した商(端数切り上げ)をエントリする(ステップS1409)。すなわち、対象データDxの第(p−1)段での更新対象ビット位置を分割数dで除算した商(端数切り上げ)を更新対象ビット位置に設定し、特定されたk個の転置ブルームフィルタtbf(p)rの更新対象ビット位置のビットをONにする。そして、ステップS1410に移行する。
ステップS1410において、登録処理部201は、段数pをインクリメントし(ステップS1410)、ステップS1403に戻る。これにより、最下段から最上段まで更新対象ビットをONにすることができる。
一方、ステップS1403において、p>hである場合(ステップS1403:Yes)、登録処理部201は、対象データのハッシュテーブルエントリを追加して(ステップS1411)、ステップS1401に戻る。対象データDxがない場合(ステップS1401:No)、登録処理部201による階層型転置ブルームフィルタtBFの学習処理を終了する。
このような手順により、登録処理部201は、階層型転置ブルームフィルタtBFにデータエントリを学習させることとなる。すなわち、転置後にデータが登録される場合も、階層型転置ブルームフィルタtBFから階層型ブルームフィルタBFに戻す必要がなく、転置後の階層型転置ブルームフィルタtBFのまま学習させることができる。したがって、転置前に戻すといった無駄な処理がなくなり、検索効率の向上も図ることができる。
なお、本実施の形態で説明した検索方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本検索プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本検索プログラムは、インターネット等のネットワークを介して配布してもよい。