以下に図面を参照しながら好ましい実施例を説明する。以下では計算機の処理として説明する。計算機はCPU(プロセッサ)とメモリを有する一般的なものであり、メモリに格納されたプログラムにしたがってCPUがメモリに格納されたデータを使用して処理を実行する。このため、以下の説明における計算機を主語とする説明は主語をCPUに置き換えてもよい。なお、計算機の構成は上記のものに限定されないが、図8を用いて特定の構成の例を後で説明する。また、計算機は検索を実行するため検索装置と見なすこともできる。
図1はn-gram出現リストを用いたn-gramテキスト検索の例を示す図である。計算機は検索を開始する前に予めn-gramノード11とn-gram出現リスト12、13とn-gramインデックス14〜17を作成しておく。n-gramノード11はn文字とポインタ(pt)とを対応付けるテーブルである。ここではn文字を2文字とし、検索対象テキストに含まれる全ての2文字が列挙される。また、n-gramノード11に列挙される全てのn文字、例えば「AB」〜「BR」などに対応するポインタとn-gram出現リストとn-gramインデックスは存在するが、ここでは図示を省略し、n文字が「FO」と「OT」に対応するものの一部のみを図示する。
n-gramインデックス14、16は検索対象テキストにおける「FO」の出現する文字位置を列挙するテーブルである。ここで、文字位置がn文字の中のどの文字の位置を基準とするかは一定の位置を基準とすればよい。「FO」において基準とする文字の位置は、例えば「F」の位置でもよいし、「O」の位置でもよい。ただし、「F」の位置とした場合、「OT」において基準とする文字の位置は「O」となる。
n-gramインデックス14、16はIDを含む。例えば特許文献1の図4にも記載されているように、検索対象テキストが項目やパラグラフを含むことは一般的であり、そのような項目やパラグラフなどにIDが付与されてもよいし、テキストの複数行をまとめたものにIDが付与されてもよい。このため、文字位置はIDで特定されるテキストの先頭から相対的な位置である。また、複数のn文字が1つのIDにおいて存在する場合、図1に示すように複数の文字位置が1つのIDに対応付けられる。n-gramインデックス15、17は検索対象テキストにおける「OT」の出現する文字位置を列挙するテーブルであり、そのテーブルの構成はn-gramインデックス14、16と同じである。
n-gram出現リスト12は「FO」がID範囲に存在するか否かを示すテーブルである。各ポインタ(pt)はそれぞれ対応するID範囲に「FO」が存在する場合、n-gramインデックス14、16へのポインタとなり、それぞれ対応するID範囲に「FO」が存在しない場合、所定の値となる。「FO」が存在しない場合の所定の値はいかなるn-gramインデックスへのポインタにもならない値であり、例えばnullやゼロでもよく、図1において斜線で表している。図1に示した例において「FO」はIDが52、73、89、203に存在するため、n-gram出現リスト12のID範囲が1〜100と201〜300に対応するポインタは、それぞれn-gramインデックス14とn-gramインデックス16へのポインタである。「FO」はID範囲が101〜200において存在しない。
n-gram出現リスト13は「OT」がID範囲に存在するか否かを示すテーブルであり、そのテーブルの構成はn-gram出現リスト13と同じである。ここで、n-gram出現リスト12のID範囲の各値とn-gram出現リスト13のID範囲の各値とは全て同一である。図1に示した例では100を単位とし、1〜100、101〜200、201〜300などである。異なるn-gram出現リストにおいてID範囲の各値が同一であるため、ID範囲が101〜200と201〜300の両方において「FO」と「OT」のどちらか一方は存在せず、「FOOT」は存在しないと判断できる。
このため、計算機は図示を省略した「AB」などのn-gram出現リストとn-gram出現リスト12、13を含めて全てのn-gram出現リストのID範囲の各値を同一に設定する。また、n-gram出現リストからn-gramインデックスへのポインタがn-gramインデックスのIDの値に対応するように、n-gramインデックスを構成する。図1に示した例では、n-gram出現リスト12のID範囲が1〜100に対応するポインタの先はIDの値が1〜100である52、73、89を含むようにn-gramインデックス14を1つのグループにする。
なお、以上の説明ではテーブルとして説明したが、テーブルにデータ構造を限定するものではなく、テーブル以外のデータ構造であっても、同じ管理の可能なデータ構造であればよい。また、図1において対応したりまとまったりして見える構造もメモリのアドレスが隣接するなどの構造に限定するものではなく、同じ管理の可能な構造であればよい。
以下では、検索条件である検索語18が「FOOT」の場合の処理の例を説明する。計算機は検索語18として「FOOT」が入力されると、n-gramここでは2-gramにより検索するため、検索キー19として「FO」と「OT」へ分解する。そして、計算機はn-gramノード11のn文字で「FO」と「OT」のそれぞれを検索する。「FO」と「OT」のそれぞれが見つかると、計算機は「FO」と「OT」それぞれに対応したポインタをたどり、n-gram出現リスト12とn-gram出現リスト13を取得する。
計算機は、n-gram出現リスト12とn-gram出現リスト13の両方においてID範囲の1〜100に対応するポインタが「FO」と「OT」の存在することを示すため、これらのポインタをたどりn-gramインデックス14とn-gramインデックス15を取得する。ID範囲が101〜200と201〜300に対応するポインタは「FO」と「OT」のどちらか一方の存在しないことを示すため、計算機はこれらのポインタはたどらない。このため、計算機はn-gramインデックス16とn-gramインデックス17の両方を取得せず、処理の対象ともしない。
計算機は、n-gramインデックス14とn-gramインデックス15の両方で値の一致するIDを照合し、照合で見つかったIDの文字位置が隣接するものを照合する。図1に示した例において、計算機はIDの値が52で一致することを見つけ、文字位置の値が37と39で文字位置の隣接を見つける。「F」の文字位置が37、「FO」の「O」の文字位置が38、「OT」の「O」の文字位置が39である。IDの値が52で一致する文字位置の値が122と125は文字位置の隣接ではないので、計算機は次に照合対象を進める。
計算機はIDの値が73で一致することを見つける。文字位置の値が1と26は文字位置の隣接ではないため、計算機は文字位置の値の小さいn-gramインデックス14の次の文字位置の値へ照合対象を進めて、文字位置の値が24と26で文字位置の隣接を見つける。IDの値が73の文字位置の残りの値は文字位置の隣接ではないので、計算機は次に照合対象を進める。IDの値が89と95は不一致であり、IDの値が89には「OT」が存在しないため、計算機はIDの値が小さいn-gramインデックス14においてIDの値が95以上になるまで次のIDへ照合対象を進める。そして、図示を省略したn-gramインデックス14の次のIDの値が95で一致することを見つければ文字位置の値の照合へ進み、次のIDの値が95より大きければ、そのIDの値以上になるまでn-gramインデックス15において次のIDへ照合対象を進める。このようにして、計算機はn-gramインデックス14とn-gramインデックス15の両方の全てのIDを照合対象とする。
なお、2個のn-gram出現リストを使用した処理を説明したが、検索語18が5文字以上であり、検索キー19が3個以上の場合は、検索キー19の数と同じ個数のn-gram出現リスト全てにおいて同一のID範囲に対応するポインタが存在を示す場合だけ、n-gramインデックスを照合対象にすればよい。
以上で説明したように、計算機は「FO」と「OT」の文字位置の隣接を見つけて「FOOT」をテキスト検索できるとともに、n-gram出現リスト12、13に基づきn-gramインデックス16、17を照合対象とせず、照合を含む検索処理を減らすことができるため、テキスト検索を高速化できる。
図2はn-gram出現リストをID範囲に基づき階層化した例を示す図である。検索語18と検索キー19とn-gramノード11とn-gram出現リスト12、13は図1を用いて説明したものと同じである。ただし、n-gram出現リストのポインタの先はn-gramインデックスではなく、n-gramサブグループ出現リストである。n-gramサブグループ出現リスト21のデータ構造はn-gram出現リスト12を用いて説明したものと同じであって、「FO」がID範囲に存在するか否かを示すテーブルであるが、n-gram出現リスト12とはID範囲の値が異なる。
n-gramサブグループ出現リスト22のデータ構造もn-gram出現リスト13を用いて説明したものと同じであって、「OT」がID範囲に存在するか否かを示すテーブルであるが、n-gram出現リスト13とはID範囲の値が異なる。そして、n-gramサブグループ出現リスト21のID範囲の各値とn-gramサブグループ出現リスト22のID範囲の各値とは全て同一である。図2に示した例でID範囲は10を単位とし、1〜10、11〜20、21〜30...91〜100である。
図2において図示を省略したn-gramインデックスは図1を用いて説明したものと同じ情報を含む。n-gramインデックス14とn-gramインデックス15の両方はIDの値が52を含むので、n-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22の両方でID範囲の値が51〜60に対応するポインタは「FO」と「OT」それぞれの存在を示す。これに対し、ID範囲が81〜90において「OT」は存在せず、n-gramサブグループ出現リスト22のID範囲が81〜90に対応するポインタは「OT」が存在しない場合の所定の値である。
既に説明したとおり、計算機はn-gram出現リスト12とn-gram出現リスト13の両方においてID範囲の1〜100に対応するポインタが「FO」と「OT」の存在することを示すため、これらのポインタをたどる。そして、n-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22をそれぞれ取得する。n-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22の両方においてID範囲が1〜10に対応するポインタは「FO」と「OT」のいずれも存在しないことを示すため、計算機は次に照合対象を進める。
ID範囲が51〜60まで照合対象が進むと、ID範囲が51〜60に対応するポインタは「FO」と「OT」の両方の存在を示すため、計算機はポインタをたどりn-gramインデックス14とn-gramインデックス15を照合する。n-gramインデックス14とn-gramインデックス15の両方においてIDの値が60までの照合を終了すると、計算機はn-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22の両方のID範囲が61〜70へ照合対象を進める。
ID範囲の81〜90まで照合対象が進むと、n-gramサブグループ出現リスト21のID範囲が81〜90に対応するポインタは「FO」の存在を示すが、n-gramサブグループ出現リスト22のID範囲が81〜90に対応するポインタは「OT」の存在しないことを示すため、計算機はポインタをたどらずに次へ照合対象を進める。ここで、n-gram出現リスト12とn-gram出現リスト13のID範囲が101〜200と201〜300に対応するポインタは「FO」と「OT」のどちらか一方の存在しないことを示すため、計算機はこれらのポインタはたどらない。このため、計算機はn-gramサブグループ出現リスト23とn-gramサブグループ出現リスト24の両方を取得せず、処理の対象ともしない。
なお、図2に示した例ではn-gram出現リストとn-gramサブグループ出現リストの2階層としたが、ID範囲をグループ分けしてさらに多くの階層としてもよい。
以上で説明したように計算機はn-gramサブグループ出現リスト21、22に基づきn-gramインデックス14のIDの値が89を含めて81〜90を照合対象とせず、さらに検索処理を減らすことができるため、テキスト検索を高速化できる。
図3はn-gramインデックスの代わりにテキストをスキャンする例を示す図である。この例では検索対象テキストなどのリードがページという単位により管理され、CPUはページ番号を指定することにより特定のページをリードする。1つのページの容量は例えば1回のリードで読める容量であって、例えば8KB(キロバイト)である。一般に計算機のOS(オペレーティングシステム)あるいはファイルシステムは、クラスタサイズなどと呼ばれる所定の容量をまとめて管理してリードの単位としており、ページの容量はクラスタサイズとしてもよい。また、データベースなどのアプリケーションプログラムが所定の容量をまとめて管理してリードの単位とする場合、ページの容量はアプリケーションプログラムの管理する容量としてもよい。
図3に示した検索語18と検索キー19とn-gramノード11は図1を用いて説明したものと同じである。n-gram出現リスト31はページ番号と各ページにおける「FO」の出現有無の情報を含む。n-gram出現リスト32はページ番号と各ページにおける「OT」の出現有無の情報を含む。ここで、n-gram出現リスト31のページ番号とn-gram出現リスト32のページ番号は対応しており、同じページ番号の容量は同じである。なお、ID範囲はこのページ番号の対応関係を説明するために図示したものであり、n-gram出現リスト31、32の内容としては必要がない。
ページ33はページ番号1を指定されることによりリードされるスキャン対象であり、IDが01〜15のスキャン対象を含む。この例ではアンケートの回答がテキスト検索の対象となるテキストであり、ページ33はIDと性別と年齢とアンケートの回答を含む。IDが03のアンケートの回答は「FO」と「OT」の両方を含むため、IDが03を含むページ番号1においてn-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有となる。ページ34はページ番号2を指定されることによりリードされるスキャン対象であり、ページ33と同じ構造である。ページ34のアンケートの回答は「OT」を含まず、IDが16のアンケートの回答は「FO」を含むため、ページ番号2においてn-gram出現リスト31の出現有無は有となり、n-gram出現リスト32の出現有無は無となる。
ページ35とページ36もそれぞれページ番号3とページ番号40を指定されることによりリードされるスキャン対象であり、ページ33と同じ構造である。ページ35のアンケートの回答は「FO」を含まず、IDが33のアンケートの回答は「OT」を含むため、ページ番号3においてn-gram出現リスト31の出現有無は無となり、n-gram出現リスト32の出現有無は有となる。IDが79のアンケートの回答は「OT」と「FO」の両方を含むため、IDが79を含むページ番号40においてn-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有となる。
テキスト検索の処理を開始すると、図1を用いて説明した処理を同じ処理により、計算機はn-gram出現リスト31とn-gram出現リスト32を取得する。ページ番号1においてn-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有であるため、計算機はページ番号1を指定してページ33をリードし、アンケートの回答をスキャンする。スキャンするために計算機はリードしたページ33のIDが01のIDと性別と年齢を取得し、アンケートの回答のテキストで検索語18の「FOOT」でスキャンする。このスキャンの処理は1文字ずつ一致するか否かを判定するなどの処理でもよい。
計算機はIDが01のアンケートの回答をスキャンし終えると、IDが02へスキャン対象を進める。さらにIDが03へスキャン対象を進めると、計算機は「FOOTBALL」の「FOOT」を見つける。計算機はIDが15すなわちページ33の全てをスキャンし終えると、n-gram出現リスト31とn-gram出現リスト32の両方においてページ番号2の出現有無を判定する。この例ではn-gram出現リスト32の出現有無が無であるため、計算機はページ34をスキャン対象とすることなく、ページ番号3の出現有無の判定に進む。ページ番号3ではn-gram出現リスト31の出現有無が無であるので、計算機はページ35をスキャン対象とすることなく、ページ番号4の出現有無の判定へ進む。
このようにしてページ番号40まで出現有無の判定を進めると、n-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有であるため、計算機はページ番号40を指定してページ36をリードする。計算機はIDが78のアンケートの回答をスキャン対象とし、次にIDが79のアンケートの回答をスキャン対象とする。このアンケートの回答は「OT」と「FO」を含むが「FOOT」を含まないため、計算機は検索語18の「FOOT」でスキャンしても「FOOT」を見つけない。
以上で説明したように、計算機はn-gram出現リスト31、32に基づきページ34、35をスキャン対象とせず、検索処理を減らすことができるため、n-gramインデックスの代わりにテキストをスキャンしてもテキスト検索を高速化できる。また、リードの単位であるページで検索キーと一致する文字列の出現有無を管理するため、計算機は個別の検索キーと一致する文字列を含まないリードを行うことがない。
図4はアンケートの回答を分離した例を示す図である。検索語18と検索キー19とn-gramノード11は図1を用いて説明したものと同じである。n-gram出現リスト41は図3を用いて説明したn-gram出現リスト31と同じ構造であり、ページ番号と各ページにおける「FO」の出現有無の情報を含むが、1つのページに対応するIDの範囲が異なる。また、n-gram出現リスト42もn-gram出現リスト32と同じ構造であり、ページ番号と各ページにおける「OT」の出現有無の情報を含むが、1つのページに対応するIDの範囲が異なる。
ページ43はページ番号1を指定されることによりリードされる情報であり、IDが01〜20の情報を含む。ページ43はIDと性別と年齢とアンケートの回答へのポインタ(pt)を含む。このポインタはアンケートの回答の含まれるページ番号と、アンケートの回答のテキストそれぞれの先頭文字のページ内における文字位置を含んでもよい。IDとアンケートの回答との対応関係は図3に示したページ33、34と同じである。アンケートの回答をページ44へ分離することにより、ページ33と同じ容量であっても、ページ43はページ33と比較して多くのIDに関する情報を含むことができる。
また、ページ43は可変長のアンケートの回答を含まないため、各ページは同じ量のID範囲の情報を含むことができる。図3に示したn-gram出現リスト31ではページ番号1のID範囲が1〜15の15個のIDであり、ページ番号2のID範囲が16〜21の6個のIDであるのに対し、図4に示したn-gram出現リスト41ではページ番号1のID範囲もページ番号2のID範囲も20個のIDである。
ページ44はページ番号5を指定されることによりリードされるスキャン対象であり、アンケートの回答のテキストを含む。ページ44はアンケートの回答以外を含まないため、ページ33と同じ容量であっても、ページ44はページ33と比較して多くのアンケートの回答を含むことができる。ページ45〜48もページ43、44と同じ構造である。なお、図4に示した例ではページ43のIDに対応するアンケートの回答がページ44に存在するが、このような状態に限定されるものではなく、ページの容量とテキストの容量によってはページ43のIDに対応するアンケートの回答の一部がページ44とページ46とに分かれる場合もある。また、ページ45の一部のIDに対応するアンケートの回答とページ47の一部のIDに対応するアンケートの回答とが1つのページ46にまとまる場合もある。
図3を用いて既に説明したページ33をリードする代わりに、計算機はページ43をリードし、ページ43内のポインタをたどってページ44をリードして、アンケートの回答をスキャン対象にする。
以上で説明したように、1回のリードにより多くのIDに関する情報を取得することが可能になる。また、可変長のテキストをポインタで管理するデータ構造は一般に広く採用されており、そのようなデータ構造であっても、計算機はn-gram出現リスト41、42に基づきページ45、46をスキャン対象とせず、検索処理を減らすことができるため、テキスト検索を高速化できる。
図5はn-gramノードを木構造にした例を示す図である。検索語18と検索キー19とn-gram出現リスト12、13は図1を用いて説明したものと同じである。図5に示すn-gramノードの例は木構造であり、根(ルート)となる第1層のn-gramノード51と第2層のn-gramノード52と葉(リーフ)となる第3層のn-gramノード53とから構成される。n-gramノード53はn-gramノード11と同じ内容であり、n文字(2文字)とそのn文字に対応するn-gramインデックスへのポインタを含む。
n-gramノード52はn-gramノード53へのポインタを含む。n-gramノード52のn文字が「AE」に対応するポインタは、n-gramノード53のn文字が「AB」「AC」「AE」へのポインタである。図5に示したポインタは「AB」「AC」「AE」の3つを代表して「AB」への矢印で表す。同様にn-gramノード52のn文字が「BR」に対応するポインタは、n-gramノード53のn文字が「BE」「BI」「BR」へのポインタであり、n-gramノード52のn文字が「OT」に対応するポインタは、n-gramノード53のn文字が「FO」「GO」「OT」へのポインタである。
n-gramノード51のn文字が「BR」に対応するポインタは、n-gramノード52の「AE」「BR」を含むn文字へのポインタであり、n-gramノード51のn文字が「SV」に対応するポインタは、n-gramノード52の「OT」「SV」を含むn文字へのポインタである。このため、「BR」と「SV」との間に位置するn文字は「SV」に対応するポインタの先に存在し、「AE」と「BR」との間に位置するn文字は「BR」に対応するポインタの先に存在する。
計算機は検索条件である検索語18の「FOOT」を検索キー19の「FO」と「OT」へ分解すると、「FO」と「OT」のそれぞれをn-gramノード51から検索する。計算機は検索キー19の「FO」とn文字の「BR」と比較し、n文字の「SV」と比較して、「FO」が「BR」と「SV」との間に位置すると判断する。そして、計算機は「SV」に対応するポインタをたどり、n-gramノード52の「OT」と「SV」を含むn文字を取得する。計算機は検索キー19の「FO」とn-gramノード52のn文字の「OT」と比較して、「FO」が「OT」より「BR」の方に存在する、すなわち「FO」が「OT」と「BR」との間に位置すると判断する。
このため、計算機は「OT」に対応するポインタをたどり、n-gramノード53の「FO」を見つけて「FO」に対応するポインタをたどり、n-gram出現リスト12を取得する。この後の処理は図1を用いて既に説明した処理と同じである。また、検索キー19の「OT」に関しても同じくn-gramノード51の「SV」に対応するポインタをたどり、n-gramノード52の「OT」に対応するポインタをたどり、n-gramノード53の「OT」を見つけて「OT」に対応するポインタをたどり、n-gram出現リスト13を取得する。
以上の説明でも明らかなように、計算機が図1に示したn-gramノード11を用いてn文字の「AB」「AC」「AE」「BE」などと順番に1つずつ検索キー19と比較して検索するよりも図5に示した木構造のn-gramノードを用いた方が比較の回数が少なく、短い時間で検索キー19と一致するn文字を見つけることができる。なお、木構造の階層の数は多いと比較の回数が増加するため、階層の数が均一であって少ない方が比較の回数が少なくなる。このため、いわゆるバランスした木構造の方が好ましい。
以上で説明したように、計算機は木構造のn-gramノードにより検索開始から短時間でn-gram出現リストを取得できる。また、n-gramノードを木構造にしてもn-gram出現リストは使用できるため、図1などを用いて説明した高速化の効果を得ることができる。なお、各階層は同じn文字を配置するn-gramノードの木構造すなわちn-gramノード51、52、53は「BR」を含む木構造を説明したが、例えばn-gramノード51のn文字が1文字であり、n-gramノード52のn文字が2文字であり、n-gramノード53のn文字が3文字であるような木構造であってもよい。すなわち、「ABC」を「A」「AB」「ABC」と階層化した木構造であってもよい。
図6はB-treeを用いた検索の例を示す図である。以上で説明した出現リストはテキスト検索のみならず、B-treeを用いた検索でも利用できる。検索対象テーブル61はID、C1、C2、C3の4つの項目に対して値を含むものであり、C1、C2、C3の各項目の値に一致するIDの値を検索されるテーブルである。計算機は検索開始前に検索対象テーブル61からC1のB-treeノードと図示を省略したC2のB-treeノードとC3のB-treeノードを展開する。ここで、B-treeノードは一般的なB-treeの構造であるので、構造そのものの説明は省略する。
図6に示したB-treeノードの各値はC1あるいはC3の値に対応する。そして、B-treeノードからB-tree出現リスト62、63へのポインタはIDの値を特定する情報であるが、C1の1つの値に対し複数のIDの値が検索対象テーブル61では対応する。図6に示した検索対象テーブル61のC1が12という値に対応するIDの値として1と3があり、検索対象テーブル61では図示を省略したIDの値として8、22、29もB-treeインデックス64、66に示すようにC1が12という値に対応する。
図1を用いて説明したIDと同じ処理をするため、B-tree出現リスト62、63はID範囲とポインタ(pt)を含む。すなわち、B-tree出現リスト62、63はそのID範囲内のIDが存在する場合、その存在するB-treeインデックス64〜67へのポインタを有する。また、B-tree出現リスト62、63はそのID範囲内のIDが存在しない場合、存在しないことを示す所定の値をポインタの値として有する。ここで、B-tree出現リスト62のID範囲の各値とB-tree出現リスト63のID範囲の各値とは同一である。
B-treeインデックス64、66はC1の値が12である場合の検索対象テーブル61のIDの値を列挙したものであり、B-treeインデックス64はIDの値が1〜10の範囲のものを含み、B-treeインデックス66はIDの値が21〜30の範囲のものを含む。ここで、IDの値が11〜20の範囲のものは存在しない。また、B-treeインデックス65、67はC3の値が32である場合の検索対象テーブル61のIDの値を列挙したものであり、B-treeインデックス65はIDの値が1〜10の範囲のものを含み、B-treeインデックス67はIDの値が11〜20の範囲のものを含む。
計算機は検索対象テーブル61をB-treeノードへ展開した後、B-treeインデックス64〜67を作成し、B-tree出現リスト62、63を作成してポインタで接続する。計算機は検索を開始すると検索条件68を検索キー69へ変換する。この例では検索条件68がC1の値が12であることとC3の値が32であることのAND条件である。このため、検索キー69はC1の値である12とC3の値である32と変換される。そして、C1の値が検索キー69の値12に一致するIDが検索され、C3の値が検索キー69の値32に一致するIDが検索される。
検索キー69の値12がC1のB-treeノードにおいて値50以下であり、値12と一致するため、計算機はB-tree出現リスト62を取得する。また、検索キー69の値32がC3のB-treeノードにおいて値52以下であり、値35以下であり、値32と一致するため、計算機はB-tree出現リスト63を取得する。既に説明したようにB-tree出現リスト62のID範囲の各値とB-tree出現リスト63のID範囲の各値とは同一である。計算機はID範囲1〜10においてB-tree出現リスト62とB-tree出現リスト63の両方にIDが存在すると判断し、ポインタをたどってB-treeインデックス64とB-treeインデックス65をそれぞれ取得する。
計算機は先ずB-treeインデックス64の先頭のID 1とB-treeインデックス65の先頭のID 3を比較し、これらのIDの値は一致せず、B-treeインデックス64のIDの値が小さいため、B-treeインデックス64の照合対象すなわち比較対象を進める。計算機はB-treeインデックス64のID 3とB-treeインデックス65のID 3を比較し、これらのIDの値は一致するので、検索条件68を満たすIDの値として3を見つける。さらに、計算機は照合対象を進めて、B-treeインデックス64のID 8とB-treeインデックス65のID 5を比較し、これらのIDの値は一致せず、B-treeインデックス64とB-treeインデックス65の末尾であるため、B-tree出現リスト62とB-tree出現リスト63における照合対象をID範囲11〜20へ進める。
計算機はB-tree出現リスト62のID範囲11〜20に対応するポインタからID範囲11〜20にはIDが存在しないと判断し、B-tree出現リスト63のID範囲11〜20に対応するポインタの先のB-treeインデックス67を照合対象とすることなく、検索条件68を満たさないと判断する。さらに、計算機はB-tree出現リスト62とB-tree出現リスト63における照合対象をID範囲21〜30へ進める。計算機はB-tree出現リスト63のID範囲21〜30に対応するポインタからID範囲21〜30にはIDが存在しないと判断し、B-tree出現リスト62のID範囲21〜30に対応するポインタの先のB-treeインデックス66を照合対象とすることなく、検索条件68を満たさないと判断する。
以上で説明したように、B-treeを用いた検索においても計算機はB-tree出現リストに基づきB-treeインデックス66、67を照合対象とせず、検索処理を減らすことができるため、ID検索を高速化できる。
図7はファイルシステムの例を示す図である。計算機のOSあるいはファイルシステムにはiノードを用いてディレクトリとファイルを管理するものがある。このような管理においてディレクトリもファイルであり、データ領域にデータブロックとして管理される。iノードは複数個列挙されてiノードリストを構成する。図7に示すようにiノード76はルートディレクトリ710へのポインタを含み、ルートディレクトリ710の各ディレクトリと各ファイルはiノードへのポインタを含む。ルートディレクトリ710のディレクトリ名homeはiノード77へのポインタを有し、iノード77は/homeディレクトリ711へのポインタを有する。
/homeディレクトリ711のディレクトリ名srcはiノード78へのポインタを有し、iノード78は/home/srcディレクトリ712へのポインタを有する。/home/srcディレクトリ712のファイル名test.cはiノード79へのポインタを有し、iノード79はtest.cファイル713へのポインタを有する。このようにしてルートディレクトリ710からtest.cファイル713へ到達してtest.cファイル713へアクセス可能となる。
iノードリストはグループ分けされ、グループ分けされたそれぞれのiノードリストはリスト番号で管理される。図3を用いた説明と同じように、iノードリストのグループの単位は1回のリードの単位が好ましい。そして、出現リストにおいてリスト番号ごとに検索キーの出現有無を管理する。複数の出現リストは同一のリスト番号を有するため、同一のグループ分けされたiノードリストを管理する。
例えば「main」という検索キーはリスト番号1で管理されるiノードリスト73とリスト番号2で管理されるiノードリスト74との2つのiノードリストに含まれるポインタの先のデータブロックには存在しないため、出現リスト71のリスト番号1と2の出現有無の欄は無となる。これに対し、リスト番号3で管理されるiノードリスト75に含まれるiノード79のポインタの先のtest.cファイル713には「main」が存在するため、出現リスト71のリスト番号3の出現有無の欄は有となる。「src」の出現リスト72も同様である。
「main」と「src」の両方の検索キーを含むディレクトリやファイルなどのデータブロックを検索する場合、計算機は先ず出現リスト71のリスト番号1の出現有無の欄と出現リスト72のリスト番号1の出現有無の欄との両方が無であると判定する。すなわち、計算機はリスト番号1のiノードリスト73に含まれるポインタの先には「main」と「src」の両方が無いことを判定できるため、iノードリスト73を検索対象とせず、リスト番号2へ進む。計算機は出現リスト72のリスト番号2の出現有無の欄は有であるが、出現リスト71のリスト番号2の出現有無の欄は無であると判定する。このため、計算機はiノードリスト74を検索対象とせず、リスト3へ進む。
計算機は出現リスト71と出現リスト72の両方のリスト番号3の出現有無の欄が有であると判定する。この時点では、リスト番号3で管理するiノードリスト75のどのiノードのポインタの先に「main」と「src」が存在するかは不明である。そこで、計算機はiノードリスト75のどのiノードのポインタの先に「main」と「src」が含まれるか否かをスキャンする。計算機はiノード78のポインタの先の/home/srcディレクトリ712を取得して、「main」と「src」をスキャンする。さらに、計算機はiノード79のポインタの先のtest.cファイル713を取得して、「main」と「src」をスキャンする。この例では計算機がtest.cファイル713において「main」と「open」を見つける。
以上で説明したように、iノードを使用するファイルシステムにおいて、出現リスト71、72に基づきiノードリスト73、74およびルートディレクトリ710と/homeディレクトリ711をスキャン対象とせず、検索処理を減らすことができるため、ファイルの検索を高速化できる。
図8は計算機の構成の例を示す図である。計算機はCPU-A81とCPU-B82の2個のCPUを有し、2個のCPUは独立して処理を実行できる。CPU-A81は専用のキャッシュA83が接続され、CPU-B82は専用のキャッシュB84が接続される。さらに、計算機はCPU-A81とCPU-B82が共用するキャッシュC85を有し、メモリ86とHDD(ハードディスクドライブ)やSSD(ソリッドステートドライブ)などのストレージデバイス87を有する。これらはアクセス性能と記憶容量が異なり、キャッシュA83とキャッシュB84のアクセス性能が1番に高く記憶容量が1番に少ない。キャッシュC85のアクセス性能が2番目に高く記憶容量が2番目に少ない。メモリ86のアクセス性能が3番目に高く記憶容量が3番目に少ない。ストレージデバイス87のアクセス性能が4番目に高く記憶容量が4番目に少ない。
出現リストすなわちn-gram出現リスト12、13、21〜24、31、32、41、42と、B-tree出現リスト62、63と、出現リスト71、72は、所定の範囲に検索キーが存在するか否かを示す簡単な情報であり、格納に必要な記憶容量が少ないため、キャッシュA83およびキャッシュB84あるいはキャッシュC85に格納されることにより、検索処理を高速化できる。特に、出現リスト以外の情報は処理対象とならない場合があるのに対し、出現リストの情報は全てが処理対象となるため、出現リストがキャッシュに格納されることにより検索処理の高速化の効果は高くなる。
図3に示すようにページがアンケートの回答のテキストを含む場合、テキストは大きな記憶容量を占めるため、ページはストレージデバイス87に格納され、出現リストに基づきリードされるページが少なくなることにより、ストレージデバイス87へのアクセス回数が減少して検索処理の高速化の効果は高くなる。
図2に示すように出現リストが階層化された場合、階層内の複数の出現リストは異なるCPUで並列に処理されてもよい。例えば、図2に示すn-gramサブグループ出現リスト21、22はキャッシュA83に格納されて、CPU-A81により処理される。これに対して、図示を省略したn-gram出現リスト12、13の両方の同じID範囲にポインタの存在するn-gramサブグループ出現リストはキャッシュB84に格納されて、CPU-B82により処理される。これにより、2つのn-gramサブグループ出現リストは2つのCPU-A81とCPU-B82により並列に処理可能となる。
また、出現リストの異なるID範囲は独立であるため、異なるID範囲は異なるCPUで並列に処理されてもよい。例えば、n-gram出現リスト12、13の両方のID範囲1〜100はキャッシュA83に格納されて、CPU-A81により処理される。これに対して、n-gram出現リスト12、13の両方のID範囲101〜200はキャッシュB84に格納されて、CPU-B82により処理される。そして、n-gramサブグループ出現リストも異なるID範囲は異なるCPUで処理されてもよく、n-gram出現リスト31、32の異なるページ番号は異なるCPUで処理されてもよい。
なお、計算機がキャッシュA83とキャッシュB84を含まない場合であっても、異なるCPUで並列に処理するために、出現リストがキャッシュC85あるいはメモリ86に格納されて、CPU-A81とCPU-B82に共用されてもよい。
図3、4に示すようにアンケートの回答のテキストがスキャンされる場合、異なるページのアンケートの回答のテキストは異なるCPUで並列にスキャンされてもよい。例えば、図3に示すページ番号1のページ33をCPU-A81がスキャンし、ページ番号40のページ36をCPU-A82がスキャンしてもよい。図8には計算機が2個のCPUと3個のキャッシュを有する例を示したが、これに限定されるものではなく、3個以上のCPUを有してもよく、4個以上のキャッシュを有してもよい。
計算機は、図示を省略したディスプレイとキーボードとマウスを接続する入出力IF(インターフェイス)88と図示を省略したネットワークに接続するネットワークIF89を有する。計算機が検索を処理するための設定情報を入出力IF88経由で受け取り、検索結果を入出力IF88から出力してディスプレイに表示してもよい。また、計算機はネットワークIF89経由で設定情報を受け取り、検索結果を出力してもよい。さらに、テキストやIDなどの検索対象データおよび検索のために実行するプログラムをネットワークIF89で受け取ってもよい。
図9は出現リストを作成する処理フローの例を示す図である。出現リストは検索開始前のn-gramノード、B-treeノード、iノード作成時に作成されてもよいし、n-gramノードとn-gramインデックスあるいはB-treeノードとB-treeインデックスが予め作成されていて検索を開始し、1回目の検索の時点で作成されてもよい。ここでは検索開始前にノードとともに出現リストを作成する例を説明する。
計算機はステップ91によりグループ作成単位を決定する。図1において100のID範囲が1つのグループであり、図3において1つのページが1つのグループであり、図6において10のID範囲が1つのグループである。これらのグループを作成する単位はユーザの入力値を使用してもよいし、ページなどのリードの単位であればOSやファイルシステムのパラメタから取得してもよい。次に、計算機はステップ92からステップ911までのステップをループの範囲とし、グループの個数をループの回数としてステップ93へ進む。
計算機はステップ93により1つのグループのデータを取得する。ここで、1つのグループはステップ91で決定した単位のグループであり、ループが実行されるごとに次々と他のグループへ変更される。データは図3、4のテキスト検索においてページ33などのID、性別、年齢、アンケートの回答(テキスト)であり、図6のID検索において検索対象テーブル61であり、図7のファイルシステム検索においてデータブロックである。
ステップ94により計算機はステップ93で取得したデータから全てのIDを取得する。全てのIDは図1において例えば1〜100に含まれる全てのIDであって52、73、89、95などであり、図3において例えば1〜15であり、図6では例えば1〜10に含まれる全てのIDであって1〜3、5、8などである。次に、計算機はステップ95からステップ910までのステップをループの範囲とし、ステップ94で取得したIDの個数をループの回数としてステップ96へ進む。
計算機はステップ96により1つのIDに対応するテキスト内の全てn文字、あるいは1つのIDに対応する値を取得する。ここで、1つのIDはループが実行されるごとに次々と他のIDへ変更される。そして、図3においてIDが01に対応するテキスト内の全てのn文字は、アンケートの回答のテキストから「OU」「UT」「TD」などの全ての2文字である。また、図6においてIDが1に対応する値は、C1の12とC2のaaaとC3の78である。
ステップ97により計算機はステップ96で取得した全てのn文字あるいは値をn-gramノードあるいはB-treeノードへ登録し、n-gramノードあるいはB-treeノードを作成して行く。ステップ98により計算機はインデックスへIDおよび必要に応じて全ての文字位置を登録する。すなわち、ステップ96でIDの値が52の場合に図1で計算機はn-gramインデックス14、15にIDの値52を登録し、このIDの値に対して文字位置37と122および文字位置39と125を登録する。また、ステップ96でIDの値が1の場合に図6で計算機はB-treeインデックス64にIDの値1を登録し、図示を省略したC2がaaaに対応するB-treeインデックスとC3が78に対応するB-treeインデックスにIDの値1を登録する。
ステップ99により計算機はステップ98で新たなn文字あるいは新たな値を登録した場合、登録した新たなn文字あるいは新たな値に関する出現リストを作成し、作成した出現リストあるいは既に作成済みの出現リストへインデックスへのポインタあるいは出現有無の情報を登録する。ここで、出現リストを作成するために計算機は図1でIDの値が52の新たなn文字「FO」に対し、ID範囲が1〜100のみならず101以降も含めてグループの数を行数とするn-gram出現リスト12を作成する。そして、計算機はn-gramノード11のn文字「FO」に対応するポインタへn-gram出現リスト12を登録し、n-gram出現リスト12のID範囲が1〜100に対応するポインタへn-gramインデックス14を登録する。計算機はn-gram出現リストのID範囲が101以降のポインタへ「FO」が存在しない場合の所定の値を設定する。
その後、計算機はIDの値が203の新たではないn文字「FO」に対し、既に存在するn-gram出現リスト12のID範囲が201〜300に対応するポインタへn-gramインデックス16を登録する。ID範囲が101〜200において「FO」は存在しないため、n-gram出現リスト12のID範囲が101〜200は作成時に設定された「FO」が存在しない場合の所定の値を維持する。
以上で説明したように、n-gramノードあるいはB-treeノードと、n-gramインデックスあるいはB-treeインデックスを作成するとともに、n-gram出現リストあるいはB-tree出現リストを作成できる。なお、図3、4に示したテキストスキャンと図7に示したファイルシステムではインデックスなどがないため、計算機は必要のないステップを実行しなければよい。
図10は出現リストを使用した検索の処理フローの例を示す図である。ステップ101により計算機は検索条件である検索語18を検索キー19に変換する、あるいは検索条件68を検索キー69に変換する。ステップ102により計算機はn-gramノードあるいはB-treeノードを検索キーで検索し、検索キーにより見つかったn文字列あるいは値に対応するポインタを取得し、取得したポインタにより出現リストを取得する。すなわち、図1において計算機は検索キー19の「FO」に対してn-gramノード11のn文字「FO」を見つけ、n文字「FO」に対応するポインタを使用してn-gram出現リスト12を取得する。また、図6において計算機は検索キー69の値12に対してC1のB-treeノードの値12を見つけ、値12に対応するポインタを使用してB-tree出現リスト62を取得する。
計算機はステップ103からステップ107までのステップをループの範囲とし、ステップ102で取得した出現リスト内のグループ数をループの回数としてステップ104へ進む。ここで、グループ数は図1のn-gram出現リスト12の1〜100と101〜200と201〜300を3個と数えてのID範囲の項目数であり、図3のn-gram出現リスト31のページ番号の項目数の40である。
ステップ104により計算機は出現リストから1つのグループの全ての出現有無情報あるいは出現有無を示すポインタを取得する。ここで、1つのグループはループが実行されるごとに次々と他のグループへ変更される。1つのグループの全ての出現有無情報は例えば図3のn-gram出現リスト31のページ番号1に対応する出現有無情報とn-gram出現リスト32のページ番号1に対応する出現有無情報である。すなわち、ページ番号1という1つのグループの複数のn-gram出現リスト全ての出現有無情報である。1つのグループの全ての出現有無を示すポインタは例えば図1のn-gram出現リスト12のID範囲が1〜100に対応するポインタとn-gram出現リスト13のID範囲が1〜100に対応するポインタである。すなわち、ID範囲が1〜100という1つのグループの複数のn-gram出現リスト全てのポインタである。
ステップ105により計算機はステップ104で取得した出現有無情報が全て有を示すか否か、あるいは取得したポインタが全て有を示すか否かを判定する。計算機は全て有を示すと判定するとステップ106へ進み、出現有無情報が有に対応する1つのグループについて詳細な検索を行う。例えば図3ではページ番号1という有に対応する1つのグループがあり、計算機はページ番号1であるページ33を取得し、ページ33に含まれるアンケートの回答のテキストの中から「FOOT」をスキャンする。
例えば図1ではID範囲が1〜100という有に対する1つのグループがあり、計算機はn-gram出現リスト12のID範囲が1〜100に対応するポインタからn-gramインデックス14を取得し、n-gram出現リスト13のID範囲が1〜100に対応するポインタからn-gramインデックス15を取得し、図1を用いて既に説明したようにIDの一致と文字位置の隣接を照合する。ステップ103からステップ107までのループにより全てのグループを照合すると、計算機はステップ108により詳細検索の結果をまとめて出力する。
以上で説明したように、計算機は出現リストに基づき1つのグループの全ての出現有無情報が有の場合のみに詳細検索を実行するため、詳細検索の実行対象を絞ることができ、検索を高速化できる。また、図10においてステップ106を全てのグループの出現有無情報のチェックが終わった後に実行することとし、全出現有無情報が有であるグループの数が多い場合、すなわち詳細検索に時間が掛かる場合には、ユーザに検索条件の見直しを促すようにしてもよい。
図11は出現リスト作成パラメタの入力の例を示す図である。図9に示したステップ91において計算機は入出力IF88からディスプレイへウインドウ111の表示データを出力し、キーボードとマウスによるパラメタの入力を入出力IF88で受け付けてもよい。また、ネットワークIF89で接続されたネットワークの他の計算機が出力と入力を行い、出力する表示データと入力するパラメタを計算機はネットワークIF89で送受信してもよい。
出現リスト作成の入力欄112は、出現リストを作成しない設定、出現リストを検索開始前に作成する設定、出現リストを1回目の検索時に作成する設定を含む設定を入力する欄である。この欄で出現リストを作成しない設定が入力されると、計算機は図9に示したステップ99を実行せず、対応するインデックスをノードへ登録する。また、出現リストを1回目の検索時に作成する設定が入力されると、計算機はステップ99を実行せず、対応するインデックスをノードへ登録し、1回目の検索時に出現リストを作成して登録する。また、出現リストを検索開始前に作成する設定が入力されると、計算機は図9を用いて説明したとおり処理する。
検索対象の入力欄113は検索対象データのファイルなど、すなわち出現リストを作成する対象のファイルなどを指定する欄である。テキスト検索の対象となるテキストファイルの名称を指定してもよいし、検索の対象となるデータベースなどの名称を指定してもよい。計算機はステップ93により検索対象の入力欄113で指定されたファイルなどからデータを取得する。
ID単位の入力欄114は図1、6を用いて説明したIDを指定される欄である。検索対象の入力欄113で指定されたファイルなどにIDが明示的に含まれる場合、例えば図6を用いて説明した検索対象テーブル61にはIDの項目が存在するため、このIDの項目をID単位の入力欄114は指定される。検索対象の入力欄113で指定されたファイルなどにIDが明示的に含まれていない場合、図1を用いて説明したように項目やパラグラフをID単位の入力欄114は指定されてもよい。また、テキストの行をID単位として指定されてもよい。なお、図3、4を用いて説明した例ではIDを使用しないため、ID単位の入力欄114はIDを指定されないという設定が可能であってもよい。
グループ単位の入力欄115はID単位の入力欄114で指定されたIDを基準にグループを指定したり、OSやファイルシステムからパラメタを取得してグループとすることを指定したりする欄である。図1を用いて説明したn-gram出現リスト12、13とするために、グループ単位の入力欄115は100という単位が入力され、図6を用いて説明したB-tree出現リスト62、63とするために、グループ単位の入力欄115は10という単位が入力される。図3、4を用いて説明した例では、OSやファイルシステムから1回のリードという単位が入力される。このグループ単位の入力欄115で入力された指定は複数の出現リスト全てで共通である。これによりグループごとに検索キー19、69で見つかるものの出現有無の判定が可能となる。
階層数の入力欄116は出現リストの階層数を指定される欄である。図1、6の例では出現リストが1層であるため、階層数の入力欄116は1が入力される。あるいは、デフォルトの階層数を1として、計算機は何も入力されないと出現リストが1層であると判断してもよい。図2の例では出現リストがn-gram出現リスト12、13とn-gramサブグループ出現リスト21〜24の2層であるため、階層数の入力欄116は2が入力される。ここで、n-gramサブグループ出現リスト21、23はn-gram出現リスト12の1つのグループをさらにグループ分けするものであるから、そのグループ分けの単位を入力するために、グループ単位の入力欄115を2つに増やす。そして、グループ単位の入力欄115はn-gram出現リスト12のための100とn-gramサブグループ出現リスト21、23のための10が入力される。
入力欄112〜116のそれぞれは文字列を入力可能としてもよいし、選択可能な候補が列挙して表示されていわゆるラジオボタンで選択可能としてもよいし、いわゆるプルダウンメニューで選択可能としてもよい。
以上で説明したように、検索対象データを複数のグループに分け、複数の出現リストで同じグループを管理することにより、計算機は出現リストに基づき検索が不要のグループを判断できるため、検索が不要なグループの処理を削減し、検索を高速化できる。