以下に、本願の開示する符号化プログラム、符号化方法、符号化装置、検索プログラム、検索方法および検索装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
[実施例1に係るビットマップ型インデックスの更新処理の一例]
図2は、実施例1に係るビットマップ型インデックスの更新処理の一例を示す図である。図2上図に示すように、ビットマップ型インデックスBIにおけるインデックス生成処理は、ビットマップ型インデックスBIのサイズ縮小を実現するために、ビットマップ型インデックスBIからハッシュ化インデックスを生成する。すなわち、インデックス生成処理は、隣接した複数のハッシュ値(底)を基に、2次元(単語の軸とファイルの軸)にハッシュ化を適用したハッシュ化インデックスを生成する。そして、ファイルが更新されると、インデックス更新処理は、更新後のファイルに対応したインデックス情報の、更新前のインデックス情報に対する差分情報を単語の軸方向またはファイルの軸方向について生成する。なお、ここでいう「更新」とは、ファイル内の単語を変更すること、ファイルを追加することおよびファイルを削除することを含む。単語の軸をハッシュ化する際に用いられる底、ファイルの軸をハッシュ化する際に用いられる底は、共通であっても良いし、共通でなくても良い。
ここでいうビットマップ型インデックスBIとは、全文検索のためのインデックスであり、単語を指定するポインタと単語の各対象ファイルでの存否を示すビットを連結したビット列である。すなわち、ビットマップ型インデックスBIとは、ファイルに含まれる単語について、ファイルごとの存否をインデックス化したビットマップのことをいう。検索処理時には、このビットマップを、ビットのON・OFFに応じて検索対象の単語を含むか否かを示すインデックスとして用いることができる。単語を指定するポインタとしては、例えば、単語の符号が採用される。単語の符号は、静的コードおよび単語コードのことをいい、単語ID(identification)と同義である。なお、単語を指定するポインタは、例えば、単語そのものを用いても良い。すなわち、ビットマップ型インデックスBIは、単語を指定するポインタで示される単語ごとのビットマップを纏めたものである。図2に示すように、ビットマップ型インデックスBIのX軸はファイルID(Identification)を表し、ビットマップ型インデックスBIのY軸は単語IDを表す。すなわち、ビットマップ型インデックスBIは、単語IDが示す単語の、複数のファイルIDが示すファイルごとの存否を表す。
一例として、ファイルの軸(X軸)方向のビットマップのハッシュ化について説明する。ある単語IDに対応するビットマップb1が示されている。ある単語IDが示す単語がファイルに存在する場合には、当該単語のファイルの存否として2進数の「1」が設定され、当該単語がファイルに存在しない場合には、当該単語のファイルの存否として2進数の「0」が設定される。なお、ビットマップ型インデックスBIの詳細の説明は、後述する。
例えば、図2上図に示すように、インデックス生成処理は、単語IDに対応するビットマップそれぞれについてハッシュ関数を適用した複数のハッシュ化ビットマップを生成する。ここでは、インデックス生成処理は、32ビットレジスタを想定し、一例として29と31のハッシュ値(底)を基に、各ビットマップをハッシュ化する。具体的には、インデックス生成処理は、1つの底のハッシュ化ビットマップについて、単語IDに対応するビットマップの各ビットの位置を底で割った余りの位置に、当該ビットマップの各ビットの値を設定する。ビットマップの各ビットの位置は、それぞれのファイルIDに対応する。一例として、インデックス生成処理は、底29のハッシュ化ビットマップh11について、ビットマップb1の各ビットの位置を底29で割った余りの位置に、ビットマップb1の各ビットの値を設定する。ビットマップb1の35ビット目の位置のビット値「1」は、ハッシュ化ビットマップh11の6ビット目に設定される。ビットマップb1の42ビット目の位置のビット値「1」は、ハッシュ化ビットマップh11の13ビット目に設定される。インデックス生成処理は、底31のハッシュ化ビットマップh12について、ビットマップb1の各ビットの位置を底31で割った余りの位置に、ビットマップb1の各ビットの値を設定する。ビットマップb1の35ビット目の位置のビット値「1」は、ハッシュ化ビットマップh12の4ビット目に設定される。ビットマップb1の42ビット目の位置のビット値「1」は、ハッシュ化ビットマップh12の11ビット目に設定される。すなわち、インデックス生成処理は、ビットマップの0ビット目からの各ビットを順番にハッシュ化ビットマップの0ビット目から設定し、(底−1)ビット目まで設定する。そして、インデックス生成装置は、再度折り返してハッシュ化ビットマップの0ビット目から既にハッシュ化ビットマップに設定された値とOR演算した値を設定する。この結果、複数の単語が示す各単語IDについてのビットマップにおいて、ファイルID1〜mまでのインデックス情報が格納される。なお、ハッシュ値(底)は、以降、29と31であるとして説明する。
図2下図は、図2上図の状態から新たなファイルm+1が追加された状態を示している。ビットマップ型インデックスBIには、複数の単語が示す単語IDごとにファイルm+1についてのビットが設定される。
一例として、図2上図で示したある単語IDに対応するビットマップb1´が示されている。ある単語IDが示す単語がファイルに存在する場合には、当該単語のファイルの存否として2進数の「1」が設定され、当該単語がファイルに存在しない場合には、当該単語のファイルの存否として2進数の「0」が設定される。ここでは、ビットマップb1´の44ビット目に、当該単語がファイルに存在するとして「1」が設定されるとする。
例えば、図2下図に示すように、インデックス更新処理は、単語IDに対応するビットマップの更新ビットについてハッシュ関数を適用した複数のハッシュ化ビットマップを更新する。具体的には、インデックス更新処理は、1つの底のハッシュ化ビットマップについて、単語IDに対応するビットマップの更新ビットの位置を底で割った余りの位置に、更新ビットの値と既にハッシュ化ビットマップに設定された値とをOR演算した値に更新する。一例として、インデックス更新処理は、底29のハッシュ化ビットマップh11´について、ビットマップb1´の更新ビットの位置を底29で割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。ビットマップb1´の44ビット目の位置のビット値「1」は、ハッシュ化ビットマップh11´の15ビット目に設定される。インデックス更新処理は、底31のハッシュ化ビットマップh12´について、ビットマップb1´の更新ビットの位置を底31で割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。ビットマップb1´の44ビット目の位置のビット値「1」は、ハッシュ化ビットマップh12´の13ビット目に設定される。この結果、ファイルが追加されても、インデックス更新処理は、追加されたファイルにおける単語の存否情報を対象にして、ハッシュ化ビットマップを更新するので、ビットマップの差分だけを更新できる。
[ファイル削除によるビットマップ型インデックスの更新処理の一例]
図3は、ファイル削除によるビットマップ型インデックスの更新処理の一例を示す図である。図3に示すように、ビットマップ型インデックスBIにおけるインデックス生成処理は、ビットマップ型インデックスBIのサイズ縮小を実現するために、削除ビットマップdbからハッシュ化ビットマップhdbを生成する。
ここでいう削除ビットマップdbとは、対象ファイルの存在または削除をビット列で示したインデックスである。なお、削除ビットマップdbにおいてON(=1)に該当するビットに対応するファイルIDの対象ファイルは、存在していることを意味する。一方、OFF(=0)になると、当該対象ファイルは削除されたことを意味する。これにより、ビットマップ型インデックスBIを用いて検索を行う場合に、対象ファイルが削除されていれば、対象ファイルに対応する削除ビットマップdbを参照することで、対象ファイルを検索対象から除くことができる。
一例として、削除ビットマップdbが示されている。あるファイルが存在する場合には、当該ファイルの存否として2進数の「1」が設定され、存在しない場合には、当該ファイルの存否として2進数の「0」が設定される。
例えば、図3上図に示すように、インデックス生成処理は、削除ビットマップdbについてハッシュ関数を適用した複数のハッシュ化ビットマップを生成する。具体的には、インデックス生成処理は、1つの底のハッシュ化ビットマップについて、削除ビットマップdbの各ビットの位置を底で割った余りの位置に、当該削除ビットマップdbの各ビットの値を設定する。一例として、インデックス生成処理は、底29のハッシュ化ビットマップhdb1について、削除ビットマップdbの各ビットの位置を底29で割った余りの位置に、削除ビットマップdbの各ビットの値を設定する。削除ビットマップdbの5ビット目の位置のビット値「1」は、ハッシュ化ビットマップhdb1の5ビット目に設定される。インデックス生成処理は、底31のハッシュ化ビットマップhdb2について、削除ビットマップdbの各ビットの位置を底31で割った余りの位置に、削除ビットマップdbの各ビットの値を設定する。削除ビットマップdbの5ビット目の位置のビット値「1」は、ハッシュ化ビットマップhdb2の5ビット目に設定される。すなわち、インデックス生成処理は、削除ビットマップの0ビット目からの各ビットを順番にハッシュ化ビットマップの0ビット目から設定し、(底−1)ビット目まで設定する。そして、インデックス生成装置は、再度折り返してハッシュ化ビットマップの0ビット目から既にハッシュ化ビットマップに設定された値とOR演算した値を設定する。この結果、削除ビットマップdbにおいて、ファイルID1〜mまでのインデックス情報が格納される。
図3下図は、図3上図の状態からファイル6が削除された状態を示している。削除ビットマップdb´には、ファイル6についてのビットに2進数の「0」が設定される。
例えば、図3下図に示すように、インデックス更新処理は、削除ビットマップdb´の更新ビットについてハッシュ関数を適用した複数のハッシュ化ビットマップを更新する。具体的には、インデックス更新処理は、1つの底のハッシュ化ビットマップについて、削除ビットマップdb´の更新ビットの位置を底で割った余りの位置に、更新ビットの値「0」と既にハッシュ化ビットマップhdb1´に設定された値とをAND演算した値に更新する。一例として、インデックス更新処理は、底29のハッシュ化ビットマップhdb1´について、削除ビットマップdb´の更新ビットの位置を底29で割った余りの位置に、更新ビットの値「0」と既に設定された値「1」とをAND演算した値「0」を更新する。削除ビットマップdb´の5ビット目の位置のビット値「0」は、ハッシュ化ビットマップhdb1´の5ビット目に設定される。同様に、インデックス更新処理は、底31のハッシュ化ビットマップhdb2´について、削除ビットマップdb´の更新ビットの位置を底31で割った余りの位置に、更新ビットの値「0」と既に設定された値「1」とをAND演算した値「0」を更新する。削除ビットマップdb´の5ビット目の位置のビット値「0」は、ハッシュ化ビットマップhdb2´の5ビット目に設定される。
[ビットマップ型インデックスの一例]
次に、実施例1に係るビットマップ型インデックスBIの一例を、図4を参照して説明する。図4は、実施例1に係るビットマップ型インデックスの一例を示す図である。図4に示すように、ビットマップ型インデックスBIは、超高頻度の単語、高頻度の単語および低頻度の単語に係る圧縮付号(単語IDに対応)ごとにビットマップを対応付ける。ビットマップとは、超高頻度の単語、高頻度の単語および低頻度の単語がいずれの圧縮ファイルに含まれるかを表す符号ビット列である。ビットマップの各ビットが、各圧縮ファイルに超高頻度の単語、高頻度の単語および低頻度の単語が含まれているか否かを表す。
ビットマップ型インデックスBIは、例えば、32種類の超高頻度単語ごと、8K(8000)種類の高頻度の単語および16K(16000)種類の低頻度単語ごとにビットマップを対応付ける。超高頻度単語とは、出現頻度集計用のファイル群において各単語の出現頻度を集計した場合に、出現頻度の高い単語を表す。例えば、超高頻度単語は、頻度集計用のファイル群での出現頻度が上位32位までの単語である。高頻度単語は、頻度集計用のファイル群での出現頻度が上位8000位までの単語である。また、低頻度単語は、頻度集計用のファイル群での出現頻度の順位が24000位未満であって、符号化するファイルから抽出された数値文字列または単語である。単語の一例として、専門用語、新語および未知語が挙げられる。ここでいう専門単語とは、ある特定の学問の分野や業界等の間で通用する単語であり、符号化するファイルの中で繰り返し出現する特長がある単語のことをいう。新語とは、流行語等の新しく作られた単語であり、符号化するファイルの中で繰り返し出現する特長がある単語のことをいう。未知語とは、専門単語でなく、新語でない単語であり、符号化するファイルの中で繰り返し出現する特長がある単語のことをいう。
例えば、ビットマップ型インデックスBIの有効行1行目は、圧縮符号が示す単語「the」のビットマップが「・・・1101」となっている。ビットマップ型インデックスBIの有効行1行目のビットマップは、「the」の圧縮符号が含まれるファイルを表す。ビットマップ「・・・1101」は、1ビット目に「1」が格納されているのでファイル1に「the」が含まれ、2ビット目に「0」が格納されているのでファイル2に「the」が含まれず、3ビット目に「1」が格納されているのでファイル3に「the」が含まれることを表す。また、ビットマップ「・・・1101」は、4ビット目に「1」が格納されているのでファイル4に「the」が含まれていることを表す。なお、ビットマップ「・・・1101」は、ファイル5以降の他の各ファイルに「the」が含まれるか否かについても表す。
[実施例1に係るビットマップ型インデックスの生成処理]
ここで、実施例1に係るビットマップ型インデックスBIの生成処理を、図5を参照して説明する。図5は、実施例1に係るビットマップ型インデックスの生成処理の一例を示す図である。図5に示すように、まず、符号化処理は、特定のファイルに含まれる単語を静的辞書S0および動的辞書D0を用いて符号化する際に、静的辞書S0に登録されない単語のうち外部辞書E0に含まれる単語を抽出する。符号化処理は、抽出された単語の外部辞書E0における符号と、動的に割り当てられる動的符号とを対応付けて動的辞書D0に登録する。
ここでいう静的辞書S0とは、一般的な英語辞典、国語辞典や教科書などを基にして、文書中に出現する単語の出現頻度を特定し、出現頻度のより高い単語に対して、より短い符号を割り当てた辞書のことをいう。静的辞書S0には、それぞれの単語に対応する符号である静的コードがあらかじめ登録されている。
ここでいう動的辞書D0とは、静的辞書S0に登録されず、且つ、外部辞書E0に登録されている単語と、外部辞書E0における符号と、動的に付された動的コードとを対応付けた辞書である。静的辞書S0に登録されていない単語には、一例として、出現頻度の低い単語(低頻度単語)が挙げられる。かかる単語(低頻度単語)には、専門単語、新語、未知語などがある。なお、動的辞書D0には、静的辞書S0に登録されていない単語の出現順に、動的コードに対応付けられた単語がバッファ部に登録される。動的辞書D0に関する詳しい説明は後述する。
ここでいう外部辞書E0とは、静的辞書S0に登録されていない単語を専門ごとに単語コードと対応付けた辞書である。外部辞書E0には、一例として、専門辞書、新語辞書および未知語辞書などがある。専門辞書には、専門単語が記憶される。新語辞書には、新語が記憶される。未知語辞書には、未知語が記憶される。低頻度単語に付される動的コードは、同一の単語であっても符号化対象のファイルごとに異なるが、外部辞書E0における単語コードは、同一の単語であれば符号化対象のファイルごとに共通化される。
符号化処理の一例を、以下に説明する。例えば、符号化処理は、ファイルF1内の符号化対象のファイルf3を記憶領域にロードする。なお、ファイルf3の「3」は、ファイルIDが「3」であることを示す。
符号化処理は、符号化対象のファイルf3を記憶領域から読み出し、読み出したファイルf3に対して字句解析を行う。ここでいう字句解析とは、符号化されていない状態のファイルを単語に分割することをいう。
符号化処理は、静的辞書S0と単語の文字列とを比較して、静的辞書S0に単語の文字列に対応する符号があるか否かを判定する。なお、かかる判定処理は、静的辞書S0を用いて符号化可能な単語の文字列を特定するビットフィルタと単語の文字列とを比較して、単語の文字列がビットフィルタにヒットするか否かを判定しても良い。ここでいうビットフィルタとは、静的辞書S0を用いて符号化可能な単語の文字列を特定するフィルタのことをいう。符号化処理は、静的辞書S0に単語の文字列に対応する符号がある場合には、静的辞書S0に基づいて単語の文字列を、当該単語の文字列に対応する符号(静的コード)に符号化し、静的コードを出力する。
符号化処理は、静的辞書S0に単語の文字列に対応する符号がない場合には、外部辞書E0から、単語の文字列に対応する符号(単語コード)および当該単語が登録された外部辞書E0のIDを取得する。なお、符号化処理は、外部辞書E0における符号を、自装置にて割り当てても良いし、単語コードを割り当てるマスタ装置に問い合わせても良い。実施例では、符号化処理は、外部辞書E0における符号を、自装置にて割り当てる場合とする。
符号化処理は、単語の文字列と、外部辞書E0における符号(単語コード)と、動的に付された動的コードとを動的辞書D0に登録する。符号化処理は、動的辞書D0に基づいて、登録した単語の文字列を、当該登録した単語の文字列に対応する単語コードに符号化し、単語コードを出力する。なお、符号化処理は、単語の文字列が動的辞書D0に登録されている場合には、動的辞書D0に基づいて、当該単語の文字列を、当該単語の文字列に対応する単語コードに符号化し、単語コードを出力すれば良い。
符号化処理は、静的コードおよび動的辞書D0に基づいた単語コードそれぞれを、単語の出現順に、符号化データc3のエリアに出力する。符号化データc3のエリアは、ファイルf3に対応する符号化ファイルF1内の符号化データのエリアである。
符号化対象のファイルf3の符号化処理が完了すると、インデックス生成処理は、複数の単語コードそれぞれについて、ファイルf3内の存否をビットマップ型インデックスBIに設定する。
一例として、「Mickey」の単語ID「A002h」に対応するビットマップが示されている。単語ID「A002h」が示す単語「Mickey」がファイルに存在する場合には、当該単語のファイルの存否としてON、すなわち2進数の「1」が設定され、当該単語がファイルに存在しない場合には、当該単語のファイルの存否としてOFF、すなわち2進数の「0」が設定される。ここでは、ファイルf3には、単語「Mickey」が存在するので、「Mickey」の単語ID「A002h」に対応するビットマップには、ファイルID「3」に対応するビットに「1」が設定される。
そして、インデックス生成処理は、ビットマップ型インデックスBIからハッシュ化インデックスHIを生成する。すなわち、インデックス生成処理は、隣接した複数のハッシュ値(底)を基に、例えばファイルの軸(X軸)にハッシュ化を適用したハッシュ化インデックスを生成する。なお、ハッシュ化インデックスを生成する方法は、図2上図の説明と同様であるので、その説明を省略する。
[動的辞書の一例]
図6は、実施例1に係る動的辞書の一例を示す図である。図6に示される動的辞書D0は、バッファ部D1とアドレステーブルD2とを含む。バッファ部D1は、文字列を記憶する。アドレステーブルD2は、動的コードと、格納位置と、データ長と、外部辞書IDと、単語コードとを対応付けて保持する。動的コードは、あらかじめ定められた固定長のコードであり、単語の文字列が登録された順に割り当てられる。ここでは、動的コードは、16進数「F」で始まる固定長3バイトのコードである。格納位置は、バッファ部D1に格納された文字列の位置を示す。データ長は、バッファ部D1に格納された文字列の長さ(バイト長)を示す。外部辞書IDは、単語が登録されている外部辞書E0のIDを示す。単語コードは、単語に割り当てられたコードであり、例えば圧縮符号である。かかる単語コードは、動的辞書D0に登録された単語であっても、同じ単語であれば、複数のファイルで共通して用いられる。
例えば、単語の文字列「Mickey」に動的コードが割り当てられる場合について説明する。符号化処理は、単語の文字列「Mickey」をバッファ部D1に格納する。符号化処理は、単語の文字列を格納した格納位置および格納したデータ長をアドレステーブルD2に登録する。さらに、符号化処理は、単語の文字列「Mickey」に割り当てられた単語コードおよび外部辞書IDをアドレステーブルD2に登録する。ここでは、符号化処理は、格納位置として「16」、データ長として「6」、外部辞書IDとして「53」、単語コードとして「CD0010h」をアドレステーブルD2に登録する。
符号化処理は、単語の文字列を、当該単語の文字列に対応付けられたアドレステーブルD2の単語コードに符号化する。ここでは、符号化処理は、単語の文字列「Mickey」を当該単語の文字列に対応付けられた動的コード「A002h」に符号化する。
[Y軸のハッシュ化の一例]
ここで、ビットマップ型インデックスBIの単語IDの軸(Y軸)方向のビットマップのハッシュ化について、図7を参照して説明する。図7は、実施例1に係るビットマップ型インデックスのY軸方向のハッシュ化の一例を示す図である。図7に示すように、インデックス生成処理は、ファイルIDに対応するビットマップにハッシュ関数を適用した複数のハッシュ化ビットマップを生成する。ここでは、インデックス生成処理は、出現頻度に応じて、Y軸を3分割し、3分割したそれぞれのビットマップを、異なる底の組合せでハッシュ化する。一例として、インデックス生成処理は、超高頻度単語では、αy1とβy1のハッシュ値(底)を基に、Y軸方向の超高頻度単語に対応するビットマップをハッシュ化する。インデックス生成処理は、高頻度単語では、αy2とβy2のハッシュ値(底)を基に、Y軸方向の高頻度単語に対応するビットマップをハッシュ化する。インデックス生成処理は、低頻度単語では、αy3とβy3のハッシュ値(底)を基に、Y軸方向の低頻度単語に対応するビットマップをハッシュ化する。
そして、インデックス更新処理は、ファイルIDに対応するビットマップの更新ビットについてハッシュ関数を適用した複数のハッシュ化ビットマップを更新する。例えば、ファイルに低頻度単語が追加されると、インデックス更新処理は、ファイルのIDに対応するビットマップのうち低頻度単語のビットマップの更新ビットの値を、底αy3のハッシュ化ビットマップおよび底βy3のハッシュ化ビットマップに更新する。すなわち、インデックス更新処理は、ハッシュ化ビットマップh21´について、ビットマップb2´のうち低頻度単語に対応するビットマップの更新ビットの位置を底αy3で割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。インデックス更新処理は、底βy3のハッシュ化ビットマップh22´について、ビットマップb2´のうち低頻度単語のビットマップの更新ビットの位置を底βy3で割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。この結果、ファイルに未知語が追加されても、インデックス更新処理は、追加された未知語の存否情報を対象にして、ハッシュ化ビットマップを更新するので、ビットマップの差分だけを更新できる。
[実施例に係る検索処理の一例]
図8は、実施例1に係る検索処理の一例を示す図である。図8に示すように、検索処理は、検索単語の入力を受け付けると、受け付けた検索単語が示す単語IDに対する複数のハッシュ化ビットマップをハッシュ化インデックスHIから抽出する。ここでは、検索単語として「Sherlock」と「Mickey」が入力された場合とする。すると、検索処理は、検索単語として受け付けられた「Sherlock」が示す単語ID「A000h」に対する複数のハッシュ化ビットマップh5をハッシュ化インデックスHIから抽出する。複数のハッシュ化ビットマップh5には、底29のハッシュ化ビットマップh51と底31のハッシュ化ビットマップh52とが含まれる。また、検索処理は、検索単語として受け付けられた「Mickey」が示す単語ID「A002h」に対する複数のハッシュ化ビットマップh4をハッシュ化インデックスHIから抽出する。複数のハッシュ化ビットマップh4には、底29のハッシュ化ビットマップh41と底31のハッシュ化ビットマップh42とが含まれる。
検索処理は、抽出された単語IDに対する複数のハッシュ化ビットマップおよびハッシュ化された削除ビットマップを復元する。なお、複数のハッシュ化ビットマップの復元処理は、後述する。復元結果は、単語IDに対応するビットマップで表わされる。ここでは、検索処理は、単語ID「A002h」に対する複数のハッシュ化ビットマップh4を復元し、ビットマップb4を復元結果として出力する。検索処理は、単語ID「A000h」に対する複数のハッシュ化ビットマップh5を復元し、ビットマップb5を復元結果として出力する。検索処理は、ハッシュ化された削除ビットマップhdbを復元し、削除ビットマップdbを復元結果として出力する。
また、検索処理は、単語ID「A002h」のビットマップb4と、単語ID「A000h」のビットマップb5と、反転された削除ビットマップdbと、のAND演算を行う。検索処理は、AND結果のビットがON(「1」)であるファイルIDを検索結果として出力する。ここでは、ファイルIDが3であるファイル3が検索結果として出力される。これにより、検索処理は、検索対象のハッシュ化ビットマップを復元し、復元されたビットマップだけを用いることで、検索キーが示す単語が、どのファイルに存在するかを、高速に絞り込むことができる。
[実施例1に係るハッシュ化ビットマップ復元処理の一例]
図9は、実施例1に係るハッシュ化ビットマップ復元処理の一例を示す図である。図9に示すように、ハッシュ化ビットマップ復元処理は、単語IDに対応するハッシュ化ビットマップから、ハッシュ化を展開したビットマップへ復元する。ハッシュ化ビットマップ復元処理は、検索単語を構成する単語がどのファイルに存在するかを検索する際に実行される。
検索処理は、ハッシュ化ビットマップh4(図8参照)の複数のハッシュ化ビットマップh41,h42をそれぞれビットマップに展開する(第1の復元処理)。ここでは、検索処理は、1つの底のハッシュ化ビットマップの復元先のビットマップについて、底に整数(0〜)を乗算して得られた値にハッシュ化ビットマップの各ビットの位置を加算した位置に、ハッシュ化ビットマップの各ビットの値を設定する。一例として、検索処理は、底29のハッシュ化ビットマップh41の復元先のビットマップb41について、底29に「0」を乗算した値にハッシュ化ビットマップh41の各ビットの位置を加算した位置に、ハッシュ化ビットマップh41の各ビットの値を設定する。検索処理は、底29のハッシュ化ビットマップh41の復元先のビットマップb41について、底29に「1」を乗算した値にハッシュ化ビットマップh41の各ビットの位置を加算した位置に、ハッシュ化ビットマップh41の各ビットの値を設定する。検索処理は、復元先の底29のビットマップb41の最大ビットの位置のビットの値が設定されるまで繰り返す。同様に、検索処理は、底31のハッシュ化ビットマップh42の復元先のビットマップb42について、底31に「0」を乗算した値にハッシュ化ビットマップh42の各ビットの位置を加算した位置に、ハッシュ化ビットマップh42の各ビットの値を設定する。検索処理は、底31のハッシュ化ビットマップh42の復元先のビットマップb42について、底31に「1」を乗算した値にハッシュ化ビットマップh42の各ビットの位置を加算した位置に、ハッシュ化ビットマップh42の各ビットの値を設定する。検索処理は、復元先のビットマップb42の最大ビットの位置のビットの値が設定されるまで繰り返す。
検索処理は、第1の復元処理で復元されたそれぞれのビットマップの対応する位置のビットをAND演算する(第2の復元処理)。ここでは、検索処理は、底29のハッシュ化ビットマップh41から復元されたビットマップb41と、底31のハッシュ化ビットマップh42から復元されたビットマップb42とをAND演算する。検索処理は、AND結果のビットマップb4を復元結果として出力する。
[実施例1に係る符号化装置の構成]
次に、図10を参照して、実施例1に係る符号化装置100の構成について説明する。図10は、実施例1に係る符号化装置の構成を示す機能ブロック図である。図10に示すように、符号化装置100は、制御部110と記憶部120とを有する。
制御部110は、図2,図3および図5に示したインデックス生成処理、符号化処理およびインデックス更新処理を実行する処理部である。制御部110は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、制御部110は、例えば、ASICやFPGAなどの集積回路の電子回路に対応する。または、制御部110は、CPUやMPUなどの電子回路に対応する。また、制御部110は、ファイルリード部111、符号化部112、インデックス生成部113およびインデックス更新部114を有する。
記憶部120は、例えばフラッシュメモリやFRAM(登録商標)などの不揮発性の半導体メモリ素子などの記憶装置に対応する。記憶部120は、静的辞書121、動的辞書122、外部辞書123およびハッシュ化インデックス124を有する。なおハッシュ化インデックス124の構成は、各単語IDに対応するハッシュ化ビットマップを纏めた構成(図5参照)と同様であるので、その説明を省略する。
静的辞書121は、一般的な英語辞典、国語辞典や教科書などを基にして、文書中に出現する単語の出現頻度を特定し、出現頻度のより高い単語に対して、より短い符号を割り当てた辞書である。なお、静的辞書121は、図5の静的辞書S0に対応する。
動的辞書122は、静的辞書121に登録されていない単語と動的に付された動的コードおよび単語コードとを対応付けた辞書である。なお、動的辞書122は、図5および図6の動的辞書D0に対応する。動的辞書122の説明は、図6と同様であるので、その説明を省略する。
外部辞書123は、静的辞書121に登録されていない単語を専門ごとに単語コードと対応付けた辞書である。外部辞書123には、例えば、専門辞書、新語辞書および未知語辞書が含まれる。一例として、外部辞書123は、辞書ごとに、単語の文字列および単語コードが対応付けられている。なお、外部辞書123は、図5の外部辞書E0に対応する。
ファイルリード部111は、符号化対象のファイルF1を記憶領域に読み出す。ファイルリード部111は、ファイルF1を記憶領域から読み出し、読み出したファイルF1に対して字句解析を行う。ファイルリード部111は、字句解析した結果の各単語を順次符号化部112に出力する。
符号化部112は、ファイルリード部111から出力された単語を符号化する。
例えば、符号化部112は、ファイルリード部111から出力された対象の単語の文字列が静的辞書121に登録されているか否かを判定する。一例として、符号化部112は、対象の単語の文字列が静的辞書121のビットフィルタにヒットするか否かを判定する。符号化部112は、対象の単語の文字列が静的辞書121に登録されている場合には、当該単語の文字列を静的辞書121に基づいて符号化する。一例として、符号化部112は、静的辞書121に基づいて、単語の文字列を、当該単語の文字列に対応する静的コード(単語コード)に符号化する。符号化部112は、符号化された単語コードをインデックス生成部113に出力する。
そして、符号化部112は、対象の単語の文字列が静的辞書121に登録されていない場合には、当該単語の文字列を動的辞書122に基づいて符号化する。一例として、符号化部112は、単語の文字列が動的辞書122のバッファ部D1に既に格納されているか否かを判定する。符号化部112は、単語の文字列が動的辞書122のバッファ部D1に既に格納されていない場合には、当該単語の文字列に対応する単語コードおよび当該単語が登録された辞書のIDを外部辞書123から取得する。符号化部112は、単語コードおよび単語が登録された辞書のIDを、アドレステーブルD2の新たな動的コードに対応するレコードに格納する。加えて、符号化部112は、単語の文字列をバッファ部D1に格納するとともに、アドレステーブルD2の新たな動的コードに対応するレコードに、当該単語の文字列を格納した格納位置および格納したデータ長を格納する。符号化部112は、単語の文字列を、当該単語の文字列に対応付けられた、アドレステーブルD2の単語コードに符号化する。符号化部112は、符号化された単語コードをインデックス生成部113に出力する。
インデックス生成部113は、それぞれ符号化された単語コード群に基づいて、ビットマップを生成する。例えば、インデックス生成部113は、符号化部112から出力された単語コードに対応するビットマップの、ファイルF1に対応するビットをハッシュ化し「1」を設定する。インデックス生成部113は、ファイルF1に未処理の単語がある場合には、次の単語の符号化処理を符号化部112に実行させる。インデックス生成部113は、ファイルF1に未処理の単語がない場合には、他の符号化対象のファイルが有れば、他の符号化対象のファイルの符号化処理を符号化部112に実行させる。
また、インデックス生成部113は、複数のハッシュ値(底)を基に、ハッシュ化インデックス124を生成する。例えば、インデックス生成部113は、複数の単語ID(単語コード)に対応するビットマップそれぞれについて、複数のハッシュ化ビットマップを生成する。一例として、インデックス生成部113は、複数の単語IDに対応するビットマップそれぞれについて、2つのハッシュ値(底)に基づいたそれぞれのハッシュ化ビットマップを生成する。すなわち、インデックス生成部113は、ビットマップの0ビット目からの各ビットを順番にハッシュ化ビットマップの0ビット目から設定し、(底−1)ビット目まで設定する。そして、インデックス生成部113は、再度折り返してハッシュ化ビットマップの0ビット目から既にハッシュ化ビットマップに設定された値とOR演算した値を設定する。そして、インデックス生成部113は、全ての単語IDに対応するビットマップに対してハッシュ化ビットマップを生成すると、生成されたハッシュ化ビットマップを纏めたハッシュ化インデックス124を記憶部120に格納する。
インデックス更新部114は、ファイルが追加された場合には、追加されたファイルのファイルIDに対応する、ビットマップの追加ビットについて、ハッシュ化ビットマップを更新する。
例えば、インデックス更新部114は、ハッシュ化インデックス124において、追加ファイルのファイルIDに関係するビットを設定する。一例として、インデックス更新部114は、削除ビットマップについては、追加ファイルのファイルIDに対して「0」(OFF)のビットを設定し、削除ファイルについては、削除ファイルIDに対して「1」(ON)のビットを設定する。また、インデックス更新部114は、追加ファイルに含まれる単語の単語コード(単語ID)に対応するビットマップの、当該追加ファイルのファイルIDに対応するビットを「1」に更新する。インデックス更新部114は、単語IDに対応するビットマップの更新ビットについて、2つのハッシュ値(底)に基づいたそれぞれのハッシュ化ビットマップを更新する。一例として、底がα、βであるとする。すると、インデックス更新部114は、底αのハッシュ化ビットマップについて、更新ビットの位置をαで割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。インデックス更新部114は、底βのハッシュ化ビットマップについて、更新ビットの位置をβで割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。同様に、インデックス更新部114は、削除ビットマップの更新ビットについて、2つのハッシュ値(底)に基づいたそれぞれのハッシュ化ビットマップを更新する。これにより、インデックス更新部114は、ファイルの追加に応じて、複数のファイルのいずれが所定の単語を含むかを示すハッシュ化インデックス124に差分だけを更新できる。
また、インデックス更新部114は、ファイルが削除された場合には、削除されたファイルのファイルIDに対応する、ハッシュ化ビットマップを更新する。例えば、インデックス更新部114は、削除ビットマップについて、削除ファイルのファイルIDに対して「1」のビットを更新する。そして、インデックス更新部114は、削除ビットマップの更新ビットについて、2つのハッシュ値(底)に基づいたそれぞれのハッシュ化ビットマップを更新する。これにより、インデックス更新部114は、ファイルの削除に応じて、複数のファイルのいずれが削除であるかを示す削除のハッシュ化ビットマップに差分だけを更新できる。
[実施例1に係るインデックス生成処理の処理手順]
次に、実施例1に係るインデックス生成処理の処理手順について、図11を参照して説明する。図11は、実施例1に係るインデックス生成処理のフローチャートの一例を示す図である。
図11に示すように、符号化部112は、前処理を実行する(ステップS11)。例えば、符号化部112は、各種記憶領域を記憶部120に確保する。そして、符号化部112は、符号化対象の複数の対象ファイルのうち1つの対象ファイルの文字列を読み出し、読出用の記憶領域に格納する(ステップS12)。
符号化部112は、読み出し用の記憶領域から、1つの対象ファイルの単語の文字列を読み出す(ステップS13)。例えば、符号化部112は、1つの対象ファイルに対して字句解析を行い、字句解析した結果の単語の文字列を先頭から読み出す。
符号化部112は、読み出した単語を符号化する(ステップS14)。なお、単語の符号化処理の説明は、後述する。そして、符号化部112は、単語の符号化処理から出力された単語コードを、対象ファイルに対応する符号化データ用の記憶領域に書き込む(ステップS15)。
続いて、インデックス生成部113は、単語コードに対応するビットマップをハッシュ化し「1」を書き込む(ステップS16)。例えば、インデックス生成部113は、底αのハッシュ化ビットマップについて、ビットマップの各ビットの位置を底αで割った余りの位置に、各ビットの値を設定する。インデックス生成部113は、底βのハッシュ化ビットマップについて、ビットマップの各ビットの位置を底βで割った余りの位置に、各ビットの値を設定する。すなわち、インデックス生成部113は、ビットマップの0ビット目からの各ビットを順番にハッシュ化ビットマップの0ビット目から設定し、(底−1)ビット目まで設定したら、再度折り返して0ビット目からOR演算した結果を設定する。すなわち、インデックス生成部113は、単語コードに対応するビットマップの、対象ファイルにおけるファイルIDに対応するビットに存在することを示す「1」を設定する。
符号化部112は、対象ファイルの終点か否かを判定する(ステップS17)。対象ファイルの終点でないと判定した場合には(ステップS17;No)、符号化部112は、対象ファイルの次の単語を読み出すべく、ステップS13に移行する。
一方、対象ファイルの終点であると判定した場合には(ステップS17;Yes)、符号化部112は、符号化されていない対象ファイルがあるか否かを判定する(ステップS18)。符号化されていない対象ファイルがあると判定した場合には(ステップS18;Yes)、符号化部112は、次の対象ファイルを符号化すべく、ステップS12に移行する。
符号化されていない対象ファイルがないと判定した場合には(ステップS18;No)、インデックス生成部113は、生成されたハッシュ化ビットマップを纏めたハッシュ化インデックス124を記憶部120に格納する(ステップS19)。そして、インデックス生成部113は、インデックス生成処理を終了する。
[実施例1に係る符号化処理の処理手順]
次に、実施例1に係る符号化処理の処理手順について、図12を参照して説明する。図2は、実施例1に係る符号化処理のフローチャートの一例を示す図である。なお、符号化部112は、単語の文字列を受け取ったものとする。
図12に示すように、単語の文字列を受け取った符号化部112は、静的辞書121に当該単語の文字列が登録済みであるか否かを判定する(ステップS31)。静的辞書121に単語の文字列が登録済みであると判定した場合には(ステップS31;Yes)、符号化部112は、静的辞書121に登録されている静的コード(単語コード)を出力する(ステップS32)。そして、符号化部112は、符号化処理を終了する。
一方、静的辞書121に単語の文字列が登録済みでないと判定した場合には(ステップS31;No)、符号化部112は、動的辞書122を参照する(ステップS33)。符号化部112は、動的辞書122に単語の文字列が登録済みであるか否かを判定する(ステップS34)。例えば、符号化部112は、単語の文字列が動的辞書122のバッファ部D1に既に格納されているか否かを判定する。
動的辞書122に単語の文字列が登録済みであると判定した場合には(ステップS34;Yes)、符号化部112は、ステップS37に移行する。
一方、動的辞書122に単語の文字列が登録済みでないと判定した場合には(ステップS34;No)、符号化部112は、当該単語に対する単語コードを割り当てる(ステップS35)。例えば、符号化部112は、外部辞書123から、単語の文字列に対応する符号および当該単語が登録された外部辞書123のIDを取得する。そして、符号化部112は、取得された符号を単語コードとして割り当てる。
符号化部112は、割り当てられた単語コードを動的辞書122に登録する(ステップS36)。例えば、符号化部112は、割り当てられた単語コードおよび単語が登録された辞書のIDを、アドレステーブルD2の新たな動的コードに対応するレコードに格納する。加えて、符号化部112は、単語の文字列をバッファ部D1に格納するとともに、アドレステーブルD2の新たな動的コードに対応するレコードに、当該単語の文字列を格納した格納位置および格納したデータ長を格納する。そして、符号化部112は、ステップS37に移行する。
ステップS37において、符号化部112は、動的辞書122に登録されている単語コードを出力する(ステップS37)。例えば、符号化部112は、単語の文字列を、当該単語の文字列に対応付けられた、アドレステーブルD2の単語コードに符号化する。符号化部112は、符号化した単語コードを出力する。そして、符号化部112は、符号化処理を終了する。
[実施例1に係るインデックス更新処理の処理手順]
次に、実施例1に係るインデックス更新処理の処理手順について、図13を参照して説明する。図13は、実施例1に係るインデックス更新処理のフローチャートの一例を示す図である。
図13に示すように、インデックス更新部114は、ファイルが追加されたか否かを判定する(ステップS41)。ファイルが追加されたと判定した場合には(ステップS41;Yes)、インデックス更新部114は、削除ビットマップに対応するハッシュ化ビットマップの、追加ファイルのファイルIDのビットに「0」をデフォルトとして設定する(ステップS42)。
続いて、インデックス更新部114は、追加ファイルの単語の文字列を読み出す(ステップS43)。例えば、インデックス更新部114は、追加ファイルに対して字句解析を行い、字句解析した結果の単語の文字列を先頭から読み出す。
インデックス更新部114は、読み出した単語を符号化する(ステップS44)。なお、単語の符号化処理の説明は、図12で説明したので、その説明を省略する。そして、インデックス更新部114は、単語の符号化処理から出力された単語コードを、追加ファイルに対応する符号化データ用の記憶領域に書き込む(ステップS45)。
続いて、インデックス更新部114は、単語コードに対応するハッシュ化ビットマップの、追加ファイルのファイルIDのビットに「1」を更新する(ステップS46)。例えば、インデックス更新部114は、単語コードに対応する底αのハッシュ化ビットマップについて、追加ファイルIDに対応する、ビットマップのビット位置をαで割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。インデックス更新部114は、単語コードに対応する底βのハッシュ化ビットマップについて、追加ファイルIDに対応する、ビットマップのビット位置をβで割った余りの位置に、更新ビットの値「1」と既に設定された値「0」とをOR演算した値「1」を更新する。
インデックス更新部114は、追加ファイルの終点か否かを判定する(ステップS47)。追加ファイルの終点でないと判定した場合には(ステップS47;No)、インデックス更新部114は、追加ファイルの次の単語を読み出すべく、ステップS43に移行する。
一方、追加ファイルの終点であると判定した場合には(ステップS47;Yes)、インデックス更新部114は、インデックス更新処理を終了する。
ステップS41において、ファイルが追加されていないと判定した場合には(ステップS41;No)、インデックス更新部114は、ファイルが削除されたか否かを判定する(ステップS48)。ファイルが削除されていないと判定した場合には(ステップS48;No)、インデックス更新部114は、判定処理を繰り返すべく、ステップS41に移行する。
一方、ファイルが削除されたと判定した場合には(ステップS48;Yes)、インデックス更新部114は、削除ビットマップに対応するハッシュ化ビットマップの、削除ファイルのファイルIDのビットに「1」を更新する(ステップS49)。例えば、インデックス更新部114は、削除ビットマップに対応する底αのハッシュ化ビットマップについて、削除ファイルIDに対応する、ビットマップのビット位置をαで割った余りの位置に、更新ビットの値「1」と既に設定された値とをOR演算した値「1」を更新する。インデックス更新部114は、削除ビットマップに対応する底βのハッシュ化ビットマップについて、削除ファイルIDに対応する、ビットマップのビット位置をβで割った余りの位置に、更新ビットの値「1」と既に設定された値とをOR演算した値「1」を更新する。そして、インデックス更新部114は、インデックス更新処理を終了する。
[実施例1に係る検索装置の構成]
次に、図14を参照して、実施例1に係る検索処理を実行する検索装置200の構成について説明する。図14は、実施例1に係る検索装置の構成を示す機能ブロック図である。図14に示すように、検索装置200は、制御部210と記憶部220とを有する。
制御部210は、図8に示した検索処理を実行する処理部である。制御部210は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、制御部210は、例えば、ASICやFPGAなどの集積回路の電子回路に対応する。または、制御部210は、CPUやMPUなどの電子回路に対応する。また、制御部210は、検索キー受付部211、復元部212、検索処理部213および検索結果出力部214を有する。
記憶部220は、例えばフラッシュメモリやFRAMなどの不揮発性の半導体メモリ素子などの記憶装置に対応する。記憶部220は、ハッシュ化インデックス221と復元ビットマップ222および絞込みビットマップ223を有する。なお、ハッシュ化インデックス221と復元ビットマップ222の構成は、各単語IDに対応するハッシュ化ビットマップとビットマップの構成(図2参照)と同様であるので、その説明を省略する。また、絞込みビットマップ223の構成は、各単語とAND結果に対応するビットマップの構成(図8参照)と同様であるので、その説明を省略する。
検索キー受付部211は、検索キーを受け付ける。例えば、検索キー受付部211は、検索キーとして検索対象の単語を受け付ける。
復元部212は、検索対象の単語に対応する複数のハッシュ化ビットマップを復元する。例えば、復元部212は、検索対象の単語の単語IDに対応する複数のハッシュ化ビットマップをそれぞれビットマップに展開する(第1の復元処理)。一例として、底がαとβであるとする。すると、復元部212は、底αのハッシュ化ビットマップの復元先のビットマップについて、底αに整数(0〜)を乗算した値にハッシュ化ビットマップの各ビットの位置を加算した位置に、ハッシュ化ビットマップの各ビットの値を設定する。復元部212は、底βのハッシュ化ビットマップの復元先のビットマップについて、底βに整数(0〜)を乗算した値にハッシュ化ビットマップの各ビットの位置を加算した位置に、ハッシュ化ビットマップの各ビットの値を設定する。すなわち、復元部212は、ハッシュ化ビットマップの0ビット目からの各ビットを順番に復元先のビットマップの0ビット目から設定し、(底−1)ビット目まで処理する。そして、復元部212は、再度折り返してハッシュ化ビットマップの0ビット目からハッシュ化ビットマップの値を設定する。
そして、復元部212は、第1の復元処理で展開されたそれぞれのビットマップの対応する位置のビットをAND演算する(第2の復元処理)。一例として、復元部212は、底αのハッシュ化ビットマップを展開したビットマップと、底βのハッシュ化ビットマップを展開したビットマップとをAND演算する。そして、復元部212は、AND結果のビットマップを復元結果として復元ビットマップ222に保持する。なお、検索対象の単語が複数ある場合には、復元部212は、検索対象の単語ごとにハッシュ化ビットマップを復元し、復元結果であるビットマップを復元ビットマップ222に保持する。
また、復元部212は、ハッシュ化された削除ビットマップを復元する。一例として、復元部212は、ハッシュ化された削除ビットマップについて、第1の復元処理および第2の復元処理を実行し、削除ビットマップを復元結果として復元ビットマップ222に保持する。
検索処理部213は、検索対象の単語が存在するファイルを検索する。例えば、検索処理部213は、復元部212によって復元ビットマップ222に保持されたビットマップと反転した削除ビットマップとのAND演算を行い、AND結果を絞込みビットマップ223に保持する。
検索結果出力部214は、検索処理部213によって保持された絞込みビットマップ223を用いて、検索結果を出力する。例えば、検索結果出力部214は、絞込みビットマップ223のビットが「1」を示すファイルIDを検索結果として出力する。
[検索処理のフローチャート]
図15は、実施例1に係る検索処理のフローチャートの一例を示す図である。
まず、検索キー受付部211は、検索対象の単語を受け付けたか否かを判定する(ステップS51)。検索対象の単語を受け付けていないと判定した場合には(ステップS51;No)、検索キー受付部211は、検索対象の単語を受け付けるまで、判定処理を繰り返す。
一方、検索対象の単語を受け付けたと判定した場合には(ステップS51;Yes)、復元部212は、ハッシュ化インデックス221を記憶部220から読み出す(ステップS51A)。復元部212は、読み出したハッシュ化インデックス221から、検索対象の単語が示す単語IDに対応する、底α、底βの各ハッシュ化ビットマップを選択する(ステップS52)。
復元部212は、選択されたハッシュ化ビットマップを復元する(ステップS53)。なお、かかる復元処理は、底αおよび底βにおけるハッシュ化ビットマップごとに行われる。すなわち、復元部212は、底αのハッシュ化ビットマップについて、第1の復元処理を行う。復元部212は、底βのハッシュ化ビットマップについて、第1の復元処理を行う。
そして、復元部212は、底αのビットマップと底βのビットマップとをAND演算する(ステップS54)。すなわち、復元部212は、第1の復元処理によって復元された底αのビットマップおよび底βのビットマップを用いて、第2の復元処理を行う。復元部212は、AND結果を復元ビットマップ222に保持する。
復元部212は、未処理の単語があるか否かを判定する(ステップS55)。未処理の単語があると判定した場合には(ステップS55;Yes)、復元部212は検索対象の次の単語を処理すべく、ステップS52に移行する。
一方、未処理の単語がないと判定した場合には(ステップS55;No)、復元部212は、ハッシュ化された削除ビットマップを復元する(ステップS56)。なお、かかる復元処理は、底αおよび底βにおけるハッシュ化削除ビットマップごとに行われる。すなわち、復元部212は、底αのハッシュ化削除ビットマップについて、第1の復元処理を行う。復元部212は、底βのハッシュ化削除ビットマップについて、第1の復元処理を行う。
そして、復元部212は、底αの削除ビットマップと底βの削除ビットマップとをAND演算する(ステップS57)。すなわち、復元部212は、第1の復元処理によって復元された底αのビットマップおよび底βのビットマップを用いて、第2の復元処理を行う。復元部212は、AND結果を復元ビットマップ222に保持する。
そして、検索処理部213は、検索対象の単語のビットマップと削除ビットマップとをAND演算する(ステップS58)。例えば、演算処理部213は、復元ビットマップ222に保持されたビットマップおよび反転した削除ビットマップをビットごとにAND演算する。演算処理部213は、AND結果を絞込みビットマップ223に保持する。
そして、検索結果出力部214は、AND結果のビットが「1」を示すファイルIDを検索結果として出力する(ステップS59)。例えば、検索結果出力部214は、絞込みビットマップ223に保持されたAND結果を用いて、ビットが「1」を示すファイルIDを検索結果として出力する。
これにより、符号化装置100は、符号化対象のファイルを、静的辞書121および動的辞書122を用いて符号化する。符号化装置100は、静的辞書121および動的辞書122に登録された単語の、ファイルにおける存否を示すインデックス情報を、ファイルの軸方向および単語の軸方向をそれぞれ所定の底でハッシュ化して折り返して生成する。符号化装置100は、ファイルが更新された際に、更新後のファイルに対応したインデックス情報の、更新前のインデックス情報に対する差分情報を、ファイルの軸方向または単語の軸方向について生成する。かかる構成によれば、符号化装置100は、ファイルの更新に応じて、ファイルにおける存否を示すインデックス情報を容易に更新することができる。すなわち、符号化装置100は、ファイルの更新に応じて、更新前のインデックス情報に対する更新後の差分情報を生成するので、インデックス情報に差分だけを更新することができる。例えば、符号化装置100は、ファイルが追加された場合には、追加されたファイルにおける単語の存否情報だけを追加前後のインデックス情報に対する差分情報として生成するので、インデックス情報にこの差分情報だけを更新することができる。さらに、ファイルに新語や流行語と呼ばれる単語が含まれていたとしても、符号化装置100は、インデックス情報を再生成しなくても、差分情報を更新することで、インデックス情報を更新できる。
ところで、実施例1では、符号化装置100は、複数のビットマップ型インデックスBIを対象として複数のビットマップ型インデックスBIを基に、それぞれハッシュ化インデックスHIを生成する。そして、符号化装置100は、ファイルが更新されると、更新ファイルを担当するハッシュ化インデックスHIに対して、更新後のファイルに対応したビットマップの、更新前のビットマップに対する差分情報を当該ハッシュ化インデックスHIに更新する。そして、符号化装置100は、複数のビットマップ型インデックスBIを階層化しても良い。
そこで、実施例2では、符号化装置100は、複数のビットマップ型インデックスBIを階層化する場合を説明する。
[実施例2に係るビットマップ型インデックスの階層化]
図16は、実施例2に係るビットマップ型インデックスの階層化の一例を示す図である。図16に示すように、ビットマップ型インデックスBIは、所定のファイル数n単位で分割されている。nは例えば256である。分割されたそれぞれを、セグメントと称す。
セグメントsg0(1)は、符号化対象のファイルf1〜fnまでのビットマップ型インデックスBIを有するセグメントである。セグメントsg0(2)は、ファイルf(n+1)〜f(2n)までのビットマップ型インデックスBIを有するセグメントである。セグメントsg0(3)は、ファイルf(2n+1)〜f(3n)までのビットマップ型インデックスBIを有するセグメントである。
セグメントは初期状態では、セグメントsg0(1)のみが存在し、ファイル追加によりファイル数がnを超えると、セグメントsg0(2)が生成され、ファイル数が2nを超えると、セグメントsg0(3)が生成される。
各セグメントのビットマップ型インデックスBIは、単語が同じであるビットマップを有するが、担当するファイルIDが異なる。各セグメントのビットマップ型インデックスBIにおいて担当するファイルIDは、自セグメントが保持する符号化ファイルのファイルIDとなる。例えば、セグメントsg0(1)のビットマップ型インデックスBIでは、各単語のビットマップについてファイルID1〜nの存否を示すビット列を有することになる。セグメントsg0(m)のビットマップ型インデックスBIでは、各単語のビットマップについてファイルID(m−1)n〜mnの存否を示すビット列を有することになる。
動的辞書D0は、静的辞書S0に登録されず、且つ、外部辞書E0に登録されている単語と、外部辞書E0における符号と、動的に付された動的コードとを対応付けた辞書である。すなわち、符号化装置100は、静的辞書S0に単語の文字列に対応する符号がない場合には、外部辞書E0から、単語の文字列に対応する符号(単語コード)および当該単語コードが登録された外部辞書E0のIDを取得する。符号化装置100は、単語の文字列と、外部辞書E0から取得された符号(単語コード)と、動的に付された動的コードとを動的辞書D0に登録する。なお、動的辞書D0は、実施例1ではファイル単位に生成されたが、ファイル単位に生成されても、セグメント単位に生成されても良い。図16では、動的辞書D0は、セグメント単位に生成される場合である。
ここで、セグメント数が増加すると、単語IDごとにビットマップが冗長化する。冗長化した場合、単語IDごとに、全ファイル数について存否を示すビットのON/OFFを確認する必要があるが、存在しない(OFFの)箇所について確認作業をするのは無駄である。そこで、単語IDごとに、セグメントがm+1個生成されたら、m個単位でビットマップを集約することにする。
図16では、例えば、単語xが示す単語IDxのビットマップを上位階層に集約する場合を例に挙げて説明する。なお、「sgX(Y)」のXは、階層番号を示しており、Yはセグメント番号を示している。したがって、sgX(Y)の場合は、第X階層のY番目のセグメントとなる。また、これまで説明してきたセグメントsg0(1)〜sg0(m)は、基本階層である第0階層のセグメントとなる。
まず、基本階層である第0階層から上位階層である第1階層への集約例について説明する。集約のルールとしては、対象階層のセグメントのビットマップであるビット列がオール0、すなわち、単語xがそのセグメント内の対象ファイル群に存在しない場合、上位階層のインデックスとして「0」に集約する。一方、対象階層のセグメントのビットマップであるビット列に1個でも「1」がある場合、すなわち、単語xがそのセグメント内の対象ファイル群の少なくともいずれか1つに存在する場合、上位階層のインデックスとして「1」に集約する。
例えば、セグメントsg0(1)については、「1」が存在するため、上位階層のセグメントsg1(1)には、「1」が設定される。同様に、セグメントsg0(m)については、オール0であるため、上位階層のセグメントsg1(1)には、「0」が設定される。この上位階層のセグメントsg1(1)のビットマップのビット位置は、下位のセグメントsg0(1)〜sg0(m)の位置を示している。このように、上位階層のセグメントのビットの値により下位のセグメントのビットマップの状態を特定することができる。
また、このような集約は第0階層と第1階層との間だけではなく、最上位階層のセグメント数がm個になると、新たに上位階層のセグメントが生成されることとなる。例えば、第1階層でセグメントがセグメントsg1(m)まで生成されると、第2階層のセグメントsg2(1)が生成されることとなる。なお、図16では、第2階層までの例を示したが、データの規模が増加するにしたがって、第3階層以上の階層に集約されることになる。
図16では、基本階層の各セグメントは、ハッシュ化された状態で保持される。すなわち、符号化装置100は、自己が担当するセグメントについて、セグメントが示すビットマップ型インデックスBIからハッシュ化インデックスHIを生成して、生成して得られたハッシュ化インデックスHIを保持する。そして、符号化装置100は、ファイルが追加されると、追加ファイルを担当するハッシュ化インデックスHIに対して、追加後のファイルに対応したビットマップの、追加前のビットマップに対する差分情報を当該ハッシュ化インデックスHIに更新する。更新の際に、符号化装置100は、更新される単語xに対するビットマップに、最初に「1」が設定されるタイミングで、上位階層のインデックスとして「1」に集約する。
[実施例2に係る削除ビットマップの階層化]
図17は、実施例2に係る削除ビットマップの階層化の一例を示す図である。図17に示すように、削除ビットマップdbについても、図16と同様セグメント単位で上位階層に集約されることになる。
また、削除ビットマップbdについても、基本階層の各セグメントは、ハッシュ化された状態で保持される。すなわち、符号化装置100は、自己が担当するセグメントについて、削除ビットマップbdからハッシュ化ビットマップhbdを生成して、生成して得られたハッシュ化ビットマップhbdを保持する。そして、符号化装置100は、ファイルが削除されると、削除ファイルを担当するハッシュ化ビットマップhbdに対して、削除前後の差分情報を更新する。更新の際に、符号化装置100は、該当するハッシュ化ビットマップhbdのビットが全て「0」となったタイミングで、上位階層のインデックスとして「0」に集約する。一方、符号化装置100は、ファイルが追加されると、追加ファイルを担当するハッシュ化ビットマップhbdに対して、追加前後の差分情報を更新する。更新の際に、符号化装置100は、該当するハッシュ化ビットマップhbdに、最初に「1」が設定されるタイミングで、上位階層のインデックスとして「1」に集約する。
[ビットマップ型インデックスの更新処理の一例]
図18は、実施例2に係るビットマップ型インデックスの更新処理の一例を示す図である。図18上図に示すように、セグメントsg0(1)が登録済みであり、単語ID1〜単語IDxについてのビットマップ型インデックスBIにおいて、ファイルID1〜nまでのハッシュ化されたインデックス情報が格納されている。
図18下図は、図18上図の状態から新たなファイルn+1が追加された状態を示している。図18上図での最後尾のセグメントであるセグメントsg0(1)ではファイルn+1を格納できないため、新たなセグメントsg0(2)が設定され、セグメントsg0(2)にファイルn+1が保存されることになる。
セグメントsg0(2)のビットマップ型インデックスBIには、単語IDごとにファイルn+1についてのビットが設定される。図18下図の例では、単語ID1、単語ID2については「1」、単語IDxについては「0」が設定されている。そして、符号化装置100は、一例として29と31のハッシュ値(底)を基に、新たなセグメントsg0(2)の各ビットマップをハッシュ化する。具体的には、ビットマップb6の0ビット目が、ファイルIDn+1に対応する。すると、符号化装置100は、底29のハッシュ化ビットマップh61について、ビットマップb6の0ビットの位置を底29で割った余りの位置に、当該ビットマップの0ビットの値を設定する。符号化装置100は、底31のハッシュ化ビットマップh62について、ビットマップb6の0ビットの位置を底31で割った余りの位置に、当該ビットマップの0ビットの値を設定する。この結果、ファイルIDn+1のファイルが追加されても、符号化装置100は、追加されたファイルにおける単語の存否情報を対象にして、ハッシュ化ビットマップを更新するので、ビットマップの差分だけを更新できる。
[階層化されたセグメント群を用いた検索処理の一例]
図19は、階層化されたセグメント群を用いた検索処理の一例を示す図である。図19では、説明を単純化するため、第0階層のセグメントのファイル数nを4とし、mを4とする。したがって、第0階層セグメントsg0(1)〜sg0(16)まで存在することになるが、図示されていないセグメントについては説明を省略する。また、図19では、最上位階層を第2階層として説明する。また、図19において、実線矢印はAND結果にしたがって下位階層のセグメントを指定していることを示しており、点線矢印は実際には指定されないが、指定されたセグメントと対比するため図示している。また、図19では、検索文字列として「Sherlock△Mickey」が入力された場合とする。なお、P(s)は、単語sの単語IDを示すものとする。また、図19における削除マップは、削除ビットマップの略称であり、「0」である場合には削除されたことを示し、「1」である場合には削除されていないことを示す。
(A)において、最上位階層である第2階層のセグメントsg2(1)について、単語「Sherlock」の単語IDを示すP(Sherlock)のビットマップと、単語「Mickey」の単語IDを示すP(Mickey)のビットマップと、集約削除マップと、のAND演算を行う。AND結果は「1100」となり、下位階層である第1階層のセグメントsg1(1)、sg1(2)に、単語「Sherlock」および「Mickey」が存在する可能性があることがわかる。
また、最上位階層である第2階層のセグメントsg2(1)について、下位セグメント番号3、4についてはAND結果が「0」である。したがって、セグメントsg1(3)、sg1(4)の各AND演算を行うまでもなく、セグメントsg1(3)、sg1(4)の各AND結果がオール0になることがわかる。
(B)では、第2階層のAND結果から第1階層のセグメントsg1(1)、sg1(2)が指定されたため、セグメントsg1(1)、sg1(2)について、(A)と同様AND演算を実行する。これにより、セグメントsg1(1)からはセグメントsg0(1)が指定され、セグメントsg1(2)からはセグメントsg0(5)が指定されることになる。セグメントsg1(2)に着目すると、下位セグメント番号6〜8についてはAND結果が「0」である。したがって、セグメントsg0(6)〜sg0(8)の各AND演算を行うまでもなく、セグメントsg0(6)〜sg0(8)の各AND結果がオール0になることがわかる。
(C)では、第1階層のAND結果から第0階層のセグメントsg0(1)、sg0(5)が指定されたため、セグメントsg0(1)、sg0(5)について、(A)、(B)と同様AND演算を実行する。すなわち、検索装置200は、単語「Sherlock」の単語IDに対するハッシュ化ビットマップを復元し、P(Sherlock)のビットマップを復元結果として出力する。検索装置200は、単語「Mickey」の単語IDに対するハッシュ化ビットマップを復元し、P(Mickey)のビットマップを復元結果として出力する。検索装置200は、ハッシュ化された削除ビットマップを復元し、削除ビットマップを復元結果として出力する。そして、検索装置200は、セグメントsg0(1)について、P(Sherlock)のビットマップと、P(Mickey)のビットマップと、削除ビットマップと、のAND演算を行う。検索装置200は、セグメントsg0(5)について、P(Sherlock)のビットマップと、P(Mickey)のビットマップと、削除ビットマップと、のAND演算を行う。これにより、セグメントsg0(1)からはファイルID3が指定され、セグメントsg0(5)からはファイルID19が指定されることになる。したがって、ファイルf3、f19に、単語「Sherlock」および「Mickey」の両方が存在することがわかる。
[階層化されたセグメント群を実装したコンピュータシステムの構成例]
図20は、階層化されたセグメント群を実装したコンピュータシステムの構成例を示す図である。図20では、m個のセグメントを1アーカイブファイルとする。なお、「AX(Y)」は、アーカイブファイルの符号であり、Xは階層番号を示しており、Yはアーカイブ番号を示している。したがって、AX(Y)の場合は、第X階層のY番目のアーカイブファイルとなる。例えば、アーカイブファイルA0(1)は、第0階層のセグメントsg0(1)〜sg0(m)の集合である。
図20の例では、マスタサーバMSは、第1階層以上のアーカイブファイルを格納している。また、スレーブサーバS1、S2、・・・、S(2m+1)、・・・は、マスタサーバMSにより割り当てられた1個のアーカイブファイルを格納している。なお、個々のスレーブサーバは、例えば、それぞれ符号化装置100および検索装置200に対応する。図20のアーカイブファイルの割り当ては1個であり、マスタサーバMSが第1階層以上のアーカイブファイルをすべて担当する必要はなく、他のサーバに分散させても良い。また、スレーブサーバS1、S2、・・・、S(2m+1)、・・・についても1アーカイブファイルだけではなく、複数のアーカイブファイルを担当することとしても良い。
これにより、符号化装置100および検索装置200を含むコンピュータシステムは、例えば専門用語、新語や未知語に対する符号(単語コード)をもとに、符号化および階層化を行うことで、容易にスレーブサーバ全体のパフォーマンスを向上させることができる。すなわち、コンピュータシステムは、スケールアウトすることができる。具体的には、マスタサーバMSは、担当しているアーカイブファイル内のAND結果を参照して、負荷が均一となるように、セグメントにスレーブサーバを割り当てることができる。
[実施例に関連する他の態様]
以下、上述の実施形態における変形例の一部を説明する。下記の変形例のみでなく、本発明の本旨を逸脱しない範囲の設計変更は適宜行われうる。
また、実施例に係る符号化装置100は、32ビットレジスタを想定し、29と31のハッシュ値(底)を基に、各ビットマップをハッシュ化するとして説明した。しかしながら、29および31のハッシュ値(底)は、一例であって、これに限定されない。2つのハッシュ値(底)は、複数のファイル内のそれぞれの単語の種類の数に応じて決定されれば良い。例えば、単語の種類数が10000であるとすると、一方の底で割った余りと他方の底で割った余りとから表わされる2次元の行列が約10000となるように、2つの底が選択される。2つの底は、隣接した素数であれば良い。選択される2つの素数は、行列の数が10000の場合、一例として、97と101である。つまり、最小公倍数が約10000となる2次元のマトリックス空間の中で、ある単語について一方のハッシュおよび他方のハッシュで求められる余りの組は、他の単語について求められる余りの組と衝突しない(重複しない)であろうという推測に基づくものである。
また、実施例では、符号化装置100が、複数の単語IDに対応するビットマップそれぞれについて、2つのハッシュ値(底)に基づいたそれぞれのハッシュ化ビットマップを生成すると説明した。符号化装置100は、ハッシュ化ビットマップを生成する際、ハッシュの衝突(ハッシュノイズ)を検知する場合がある。例えば、超高頻度の単語は、複数のファイルに存在するため、超高頻度の単語に対応するビットマップの複数位置のビット値が「1」に設定される。すると、ビットマップがハッシュ化されると、ハッシュ化ビットマップの同じ位置に「1」が重複して設定されることがある。超高頻度の単語の一例として、「the」や「on」が挙げられる。そこで、符号化装置100は、ハッシュノイズに対して、ハッシュの衝突監視を行い、0/1比率の測定やビットマップの分割により、ハッシュノイズの低減化を行えば良い。例えば、符号化装置100は、ハッシュ化ビットマップのいずれか1つで連続して衝突が発生した場合に、衝突が発生したハッシュ化ビットマップに対応する単語IDのビットマップの存否情報を用いて存否(1/0)の比率を集計する。符号化装置100は、「1」の比率が閾値より大きい場合には、衝突が発生したハッシュ化ビットマップに対応する単語IDのビットマップを分割する。具体的には、符号化装置100は、衝突が発生したハッシュ化ビットマップに対応する単語IDのビットマップの偶数番目の位置のビットを抽出し、新たにビットマップを生成する。加えて、符号化装置100は、衝突が発生したハッシュ化ビットマップに対応する単語IDのビットマップの奇数番目の位置のビットを抽出し、新たにビットマップを生成する。そして、符号化装置100は、分割した新たなビットマップを、分割先として例えば低頻度単語の領域に格納する。符号化装置100は、2つのハッシュ化ビットマップのいずれか1つに対し分割先を設定する。そして、符号化装置100は、ビットマップを分割後に、分割先の各ビットマップに対して、2つのハッシュ値(底)に基づいたそれぞれのハッシュ化ビットマップを生成する。これにより、符号化装置100は、ハッシュ化ビットマップのデータが衝突する場合であっても、ハッシュ化前のビットマップの偶数番目のデータと奇数番目のデータとを分割してそれぞれハッシュ化することで、データの衝突を回避することが可能となる。
また、実施例に係る符号化装置100は、隣接した複数のハッシュ値(底)を基に、2次元(単語の軸とファイルの軸)にハッシュ化を適用したハッシュ化インデックスを生成すると説明した。しかしながら、符号化装置100は、ファイルの軸に代えてブロックの軸としても良い。すなわち、単語IDの存否情報は、ブロック単位であるとしても良い。
また、実施例に示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
[ハードウェア構成]
下記に、上述の実施形態に用いられるハードウェア及びソフトウェアについて説明する。図21は、コンピュータ1のハードウェア構成例を示す図である。コンピュータ1は、例えば、プロセッサ301、RAM(Random Access Memory)302、ROM(Read Only Memory)303、ドライブ装置304、記憶媒体305、入力インターフェース(I/F)306、入力デバイス307、出力インターフェース(I/F)308、出力デバイス309、通信インターフェース(I/F)310、SAN(Storage Area Network)インターフェース(I/F)311およびバス312などを含む。それぞれのハードウェアはバス312を介して接続されている。
RAM302は読み書き可能なメモリ装置であって、例えば、SRAM(Static RAM)やDRAM(Dynamic RAM)などの半導体メモリ、またはRAMでなくてもフラッシュメモリなどが用いられる。ROM303は、PROM(Programmable ROM)なども含む。ドライブ装置304は、記憶媒体305に記録された情報の読み出しか書き込みかの少なくともいずれか一方を行なう装置である。記憶媒体305は、ドライブ装置304によって書き込まれた情報を記憶する。記憶媒体305は、例えば、ハードディスク、SSD(Solid State Drive)などのフラッシュメモリ、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスクなどの記憶媒体である。また、例えば、コンピュータ1は、複数種類の記憶媒体それぞれについて、ドライブ装置304及び記憶媒体305を設ける。
入力インターフェース306は、入力デバイス307と接続されており、入力デバイス307から受信した入力信号をプロセッサ301に伝達する回路である。出力インターフェース308は、出力デバイス309と接続されており、出力デバイス309に、プロセッサ301の指示に応じた出力を実行させる回路である。通信インターフェース310はネットワーク3を介した通信の制御を行なう回路である。通信インターフェース310は、例えばネットワークインターフェースカード(NIC)などである。SANインターフェース311は、ストレージエリアネットワークによりコンピュータ1と接続された記憶装置との通信の制御を行なう回路である。SANインターフェース311は、例えばホストバスアダプタ(HBA)などである。
入力デバイス307は、操作に応じて入力信号を送信する装置である。入力信号は、例えば、キーボードやコンピュータ1の本体に取り付けられたボタンなどのキー装置や、マウスやタッチパネルなどのポインティングデバイスである。出力デバイス309は、コンピュータ1の制御に応じて情報を出力する装置である。出力デバイス309は、例えば、ディスプレイなどの画像出力装置(表示デバイス)や、スピーカーなどの音声出力装置などである。また、例えば、タッチスクリーンなどの入出力装置が、入力デバイス307及び出力デバイス309として用いられる。また、入力デバイス307及び出力デバイス309は、コンピュータ1と一体になっていても良いし、コンピュータ1に含まれず、例えば、コンピュータ1に外部から接続する装置であっても良い。
例えば、プロセッサ301は、ROM303や記憶媒体305に記憶されたプログラムをRAM302に読み出し、読み出されたプログラムの手順に従って制御部110,210の処理を行なう。その際にRAM302はプロセッサ301のワークエリアとして用いられる。記憶部120,220の機能は、ROM303および記憶媒体305がプログラムファイル(後述のアプリケーションプログラム24、ミドルウェア23およびOS22など)やデータファイル(例えば、静的辞書121、動的辞書122、外部辞書123,ビットマップ型インデックス部124、ハッシュ化インデックス125など)を記憶し、RAM302がプロセッサ301のワークエリアとして用いられることによって実現される。プロセッサ301が読み出すプログラムについては、図22を用いて説明する。
図22は、コンピュータで動作するプログラムの構成例を示す図である。コンピュータ1において、図22に示すハードウェア群HW21(301〜312)の制御を行なうOS(オペレーティング・システム)22が動作する。OS22に従った手順でプロセッサ301が動作して、ハードウェア群HW21の制御・管理が行なわれることにより、アプリケーションプログラムAP24やミドルウェアMW23に従った処理がハードウェア群21で実行される。さらに、コンピュータ1において、ミドルウェアMW23またはアプリケーションプログラムAP24が、RAM302に読み出されてプロセッサ301により実行される。
プロセッサ301が、符号化機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)制御部110の機能が実現される。プロセッサ301が、検索機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)制御部210の機能が実現される。符号化機能および検索機能は、アプリケーションプログラム24自体に含まれても良いし、アプリケーションプログラム24に従って呼び出されることで実行されるミドルウェア23の一部であっても良い。
図23は、実施形態のシステムにおける装置の構成例を示す図である。図23のシステムは、コンピュータ1a、コンピュータ1b、基地局2およびネットワーク3を含む。コンピュータ1aは、無線または有線の少なくとも一方により、コンピュータ1bと接続されたネットワーク3に接続している。
符号化装置100と検索装置200とは、図23に示すコンピュータ1aとコンピュータ1bとのいずれに含まれても良い。コンピュータ1bが符号化装置100の機能を含み、コンピュータ1aが検索装置200の機能を含んでも良いし、コンピュータ1aが符号化装置100の機能を含み、コンピュータ1bが検索装置200の機能を含んでも良い。また、コンピュータ1aとコンピュータ1bとの双方が、符号化装置100の機能および検索装置200の機能を備えても良い。