(57)【要約】  指定された文字列で文献を検索する計算機の文字列検索方法において、前記指定された文字列を第１の文字または文字列と第２の文字または文字列を含む複数の文字または文字列に分解する第１のステップと、前記計算機の１回のリード処理で読み込める単位で複数の文献をグルーピングして複数の集合を作成する第２のステップと、前記複数の集合それぞれにおいて前記第１の文字または文字列が出現するか否かを判定し、出現する集合それぞれに前記第１の文字または文字列の第１の出現情報を付与する第３のステップと、前記複数の集合それぞれにおいて前記第２の文字または文字列が出現するか否かを判定し、出現する集合それぞれに前記第２の文字または文字列の第２の出現情報を付与する第４のステップと、前記複数の集合の中の第１の集合において前記第１の出現情報と前記第２の出現情報が付与されている場合、前記第１の集合を詳細検索対象とする第６のステップと、を有する。
2016001991.tif 000002
【特許請求の範囲】
【請求項１】
指定された文字列で文献を検索する計算機の文字列検索方法において、
前記指定された文字列を第１の文字または文字列と第２の文字または文字列を含む複数の文字または文字列に分解する第１のステップと、
前記計算機の１回のリード処理で読み込める単位で複数の文献をグルーピングして複数の集合を作成する第２のステップと、
前記複数の集合それぞれにおいて前記第１の文字または文字列が出現するか否かを判定し、出現する集合それぞれに前記第１の文字または文字列の第１の出現情報を付与する第３のステップと、
前記複数の集合それぞれにおいて前記第２の文字または文字列が出現するか否かを判定し、出現する集合それぞれに前記第２の文字または文字列の第２の出現情報を付与する第４のステップと、
前記複数の集合の中の第１の集合において前記第１の出現情報と前記第２の出現情報が付与されている場合、前記第１の集合を詳細検索対象とする第６のステップと、
を有することを特徴とする文字列検索方法。
【請求項２】
前記複数の集合の中の第２の集合において前記第１の出現情報あるいは前記第２の出現情報が付与されていない場合、前記第２の集合を詳細検索対象としない第７のステップをさらに有することを特徴とする請求項１に記載の文字列検索方法。
【請求項３】
前記詳細検索対象を前記指定された文字列で検索する第８のステップをさらに有することを特徴とする請求項２に記載の文字列検索方法。
【請求項４】
前記複数の集合それぞれにおいて、前記第１の文字または文字列および前記第２の文字または文字列以外の前記分解された文字または文字列それぞれが出現するか否かを判定し、出現する集合それぞれに出現情報を付与する第５のステップをさらに有し、
前記第６のステップであって、前記複数の集合の中の第３の集合において前記第１の出現情報と前記第２の出現情報を含むすべての出現情報が付与されている場合、前記第３の集合を詳細検索対象とする第６のステップを有することを特徴とする請求項１に記載の文字列検索方法。
【請求項５】
前記複数の集合の中の第４の集合において前記第３のステップと前記第４のステップと前記第５のステップの少なくとも１つのステップにおいて出現情報が付与されていない場合、前記第４の集合を詳細検索対象としない第７のステップをさらに有することを特徴とする請求項４に記載の文字列検索方法。
【請求項６】
前記詳細検索対象を前記指定された文字列で検索する第８のステップをさらに有することを特徴とする請求項５に記載の文字列検索方法。
【請求項７】
指定された文字列で文献を検索する計算機の文字列検索方法において、
前記計算機の１回のリード処理で読み込める単位で複数の文献をグルーピングして複数の集合を作成する第１のステップと、
前記複数の集合それぞれにｎ個（ｎは自然数）の任意の文字が出現するか否かを判定し、出現する集合それぞれにｎ個の文字の出現情報を付与する第２のステップと、
前記指定された文字列を第１のｎ個の文字と第２のｎ個の文字を含む複数のｎ個の文字に分解する第３のステップと、
前記複数の集合の中の第１の集合において前記第１のｎ個の文字の出現情報が付与されるとともに前記第２のｎ個の文字の出現情報が付与されている場合、前記第１の集合を詳細検索対象とする第４のステップと、
を有することを特徴とする文字列検索方法。
【請求項８】
前記複数の集合の中の第２の集合において前記第１のｎ個の文字の出現情報あるいは前記第２のｎ個の文字の出現情報のいずれかがが付与されていない場合、前記第２の集合を詳細検索対象としない第５ステップをさらに有することを特徴とする請求項７に記載の文字列検索方法。
【請求項９】
前記詳細検索対象を前記指定された文字列で検索する第６ステップをさらに有することを特徴とする請求項８記載の文字列検索方法。
【請求項１０】
前記第４のステップであって、前記複数の集合の中の第３の集合において前記第１のｎ個の文字の出現情報と前記第２のｎ個の文字の出現情報を含む前記分解されたすべてのｎ個の文字の出現情報が付与されている場合、前記第３の集合を詳細検索対象とする第４のステップを有することを特徴とする請求項７に記載の文字列検索方法。
【請求項１１】
前記複数の集合の中の第４の集合において前記第１のｎ個の文字の出現情報と前記第２のｎ個の文字の出現情報を含む前記分解されたｎ個の文字の出現情報の中の少なくとも１つの出現情報が付与されていない場合、前記第４の集合を詳細検索対象としない第５のステップをさらに有することを特徴とする請求項１０に記載の文字列検索方法。
【請求項１２】
前記詳細検索対象を前記指定された文字列で検索する第６のステップをさらに有することを特徴とする請求項１１に記載の文字列検索方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は検索方法に関するものである。
【背景技術】
【０００２】
データベースにおいて必要なデータを短時間で取得するために、データベースの検索の高速化が重要である。また、例えばインターネット上などに存在するビッグデータを使用した分析では非常に多量なデータを高速に検索できることが要求されている。【０００３】
このような検索の中でテキスト検索の高速化に関し、特許文献１には検索対象テキストから“ａｂｃ”や“ｂｃｄ”など全ての３文字それぞれに対して出現文字位置のインデックス（ディスクリプタテーブル）を作成し、“ａｂｃｄ”を検索語とした場合に“ａｂｃ”のインデックスの出現文字位置と“ｂｃｄ”のインデックスの出現文字位置とが隣接するものを検索する技術が開示されている（段落０００２〜０００９、図２、４）。なお、このような技術はn-gram法（３文字の場合は3-gram法）として知られている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平０８−１９４７１８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に開示された技術を使用すれば、テキスト全体を先頭から１文字ずつ検索するより高速に検索できる。しかしながら、複数のインデックスにまたがる検索の高速化に関する技術までは開示されていない。【０００６】
そこで、本発明の目的は、複数のインデックスにまたがるような検索すなわち分解された複数の検索キーによる検索において検索を高速化することにある。
【課題を解決するための手段】
【０００７】
本発明に係る代表的な検索方法は、指定された文字列で文献を検索する計算機の文字列検索方法において、前記指定された文字列を第１の文字または文字列と第２の文字または文字列を含む複数の文字または文字列に分解する第１のステップと、前記計算機の１回のリード処理で読み込める単位で複数の文献をグルーピングして複数の集合を作成する第２のステップと、前記複数の集合それぞれにおいて前記第１の文字または文字列が出現するか否かを判定し、出現する集合それぞれに前記第１の文字または文字列の第１の出現情報を付与する第３のステップと、前記複数の集合それぞれにおいて前記第２の文字または文字列が出現するか否かを判定し、出現する集合それぞれに前記第２の文字または文字列の第２の出現情報を付与する第４のステップと、前記複数の集合の中の第１の集合において前記第１の出現情報と前記第２の出現情報が付与されている場合、前記第１の集合を詳細検索対象とする第６のステップと、を有することを特徴とする。
【発明の効果】
【０００８】
本発明によれば、複数のインデックスにまたがるような検索すなわち分解された複数の検索キーによる検索において検索の高速化が可能となる。
【図面の簡単な説明】
【０００９】
【図１】n-gram出現リストとインデックスを用いた検索の例を示す図である。
【図２】n-gram出現リストを階層化した例を示す図である。
【図３】n-gram出現リストとテキストスキャンを用いた検索の例を示す図である。
【図４】分離したテキストのスキャンを用いた検索の例を示す図である。
【図５】n-gramノードを木構造にした例を示す図である。
【図６】B-tree出現リストとインデックスを用いた検索の例を示す図である。
【図７】ファイルシステムを用いた検索の例を示す図である。
【図８】計算機のハードウェア構成の例を示す図である。
【図９】出現リストなどの作成の処理フローの例を示す図である。
【図１０】出現リストなどを用いた検索の処理フローの例を示す図である。
【図１１】出現リスト作成パラメタの設定画面の例を示す図である。
【発明を実施するための形態】
【００１０】
以下に図面を参照しながら好ましい実施例を説明する。以下では計算機の処理として説明する。計算機はCPU（プロセッサ）とメモリを有する一般的なものであり、メモリに格納されたプログラムにしたがってCPUがメモリに格納されたデータを使用して処理を実行する。このため、以下の説明における計算機を主語とする説明は主語をCPUに置き換えてもよい。なお、計算機の構成は上記のものに限定されないが、図８を用いて特定の構成の例を後で説明する。また、計算機は検索を実行するため検索装置と見なすこともできる。
【００１１】
図１はn-gram出現リストを用いたn-gramテキスト検索の例を示す図である。計算機は検索を開始する前に予めn-gramノード11とn-gram出現リスト12、13とn-gramインデックス14〜17を作成しておく。n-gramノード11はｎ文字とポインタ（pt）とを対応付けるテーブルである。ここではｎ文字を２文字とし、検索対象テキストに含まれる全ての２文字が列挙される。また、n-gramノード11に列挙される全てのn文字、例えば「AB」〜「BR」などに対応するポインタとn-gram出現リストとn-gramインデックスは存在するが、ここでは図示を省略し、n文字が「FO」と「OT」に対応するものの一部のみを図示する。
【００１２】
n-gramインデックス14、16は検索対象テキストにおける「FO」の出現する文字位置を列挙するテーブルである。ここで、文字位置がｎ文字の中のどの文字の位置を基準とするかは一定の位置を基準とすればよい。「FO」において基準とする文字の位置は、例えば「F」の位置でもよいし、「O」の位置でもよい。ただし、「F」の位置とした場合、「OT」において基準とする文字の位置は「O」となる。
【００１３】
n-gramインデックス14、16はIDを含む。例えば特許文献１の図４にも記載されているように、検索対象テキストが項目やパラグラフを含むことは一般的であり、そのような項目やパラグラフなどにIDが付与されてもよいし、テキストの複数行をまとめたものにIDが付与されてもよい。このため、文字位置はIDで特定されるテキストの先頭から相対的な位置である。また、複数のｎ文字が１つのIDにおいて存在する場合、図１に示すように複数の文字位置が１つの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やゼロでもよく、図１において斜線で表している。図１に示した例において「FO」はIDが５２、７３、８９、２０３に存在するため、n-gram出現リスト12のID範囲が１〜１００と２０１〜３００に対応するポインタは、それぞれn-gramインデックス14とn-gramインデックス16へのポインタである。「FO」はID範囲が１０１〜２００において存在しない。
【００１５】
n-gram出現リスト13は「OT」がID範囲に存在するか否かを示すテーブルであり、そのテーブルの構成はn-gram出現リスト13と同じである。ここで、n-gram出現リスト12のID範囲の各値とn-gram出現リスト13のID範囲の各値とは全て同一である。図１に示した例では１００を単位とし、１〜１００、１０１〜２００、２０１〜３００などである。異なるn-gram出現リストにおいてID範囲の各値が同一であるため、ID範囲が１０１〜２００と２０１〜３００の両方において「FO」と「OT」のどちらか一方は存在せず、「FOOT」は存在しないと判断できる。
【００１６】
このため、計算機は図示を省略した「AB」などのn-gram出現リストとn-gram出現リスト12、13を含めて全てのn-gram出現リストのID範囲の各値を同一に設定する。また、n-gram出現リストからn-gramインデックスへのポインタがn-gramインデックスのIDの値に対応するように、n-gramインデックスを構成する。図１に示した例では、n-gram出現リスト12のID範囲が１〜１００に対応するポインタの先はＩＤの値が１〜１００である５２、７３、８９を含むようにn-gramインデックス14を１つのグループにする。
【００１７】
なお、以上の説明ではテーブルとして説明したが、テーブルにデータ構造を限定するものではなく、テーブル以外のデータ構造であっても、同じ管理の可能なデータ構造であればよい。また、図１において対応したりまとまったりして見える構造もメモリのアドレスが隣接するなどの構造に限定するものではなく、同じ管理の可能な構造であればよい。
【００１８】
以下では、検索条件である検索語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範囲の１〜１００に対応するポインタが「FO」と「OT」の存在することを示すため、これらのポインタをたどりn-gramインデックス14とn-gramインデックス15を取得する。ID範囲が１０１〜２００と２０１〜３００に対応するポインタは「FO」と「OT」のどちらか一方の存在しないことを示すため、計算機はこれらのポインタはたどらない。このため、計算機はn-gramインデックス16とn-gramインデックス17の両方を取得せず、処理の対象ともしない。
【００２０】
計算機は、n-gramインデックス14とn-gramインデックス15の両方で値の一致するIDを照合し、照合で見つかったIDの文字位置が隣接するものを照合する。図１に示した例において、計算機はIDの値が５２で一致することを見つけ、文字位置の値が３７と３９で文字位置の隣接を見つける。「F」の文字位置が３７、「FO」の「O」の文字位置が３８、「OT」の「O」の文字位置が３９である。IDの値が５２で一致する文字位置の値が１２２と１２５は文字位置の隣接ではないので、計算機は次に照合対象を進める。
【００２１】
計算機はIDの値が７３で一致することを見つける。文字位置の値が１と２６は文字位置の隣接ではないため、計算機は文字位置の値の小さいn-gramインデックス14の次の文字位置の値へ照合対象を進めて、文字位置の値が２４と２６で文字位置の隣接を見つける。IDの値が７３の文字位置の残りの値は文字位置の隣接ではないので、計算機は次に照合対象を進める。IDの値が８９と９５は不一致であり、IDの値が８９には「OT」が存在しないため、計算機はIDの値が小さいn-gramインデックス14においてIDの値が９５以上になるまで次のIDへ照合対象を進める。そして、図示を省略したn-gramインデックス14の次のIDの値が９５で一致することを見つければ文字位置の値の照合へ進み、次のIDの値が９５より大きければ、そのIDの値以上になるまでn-gramインデックス15において次のIDへ照合対象を進める。このようにして、計算機はn-gramインデックス14とn-gramインデックス15の両方の全てのIDを照合対象とする。
【００２２】
なお、２個のn-gram出現リストを使用した処理を説明したが、検索語18が５文字以上であり、検索キー19が３個以上の場合は、検索キー19の数と同じ個数のn-gram出現リスト全てにおいて同一のID範囲に対応するポインタが存在を示す場合だけ、n-gramインデックスを照合対象にすればよい。
【００２３】
以上で説明したように、計算機は「FO」と「OT」の文字位置の隣接を見つけて「FOOT」をテキスト検索できるとともに、n-gram出現リスト12、13に基づきn-gramインデックス16、17を照合対象とせず、照合を含む検索処理を減らすことができるため、テキスト検索を高速化できる。
【００２４】
図２はn-gram出現リストをID範囲に基づき階層化した例を示す図である。検索語18と検索キー19とn-gramノード11とn-gram出現リスト12、13は図１を用いて説明したものと同じである。ただし、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範囲の各値とは全て同一である。図２に示した例でID範囲は１０を単位とし、１〜１０、１１〜２０、２１〜３０．．．９１〜１００である。
【００２６】
図２において図示を省略したn-gramインデックスは図１を用いて説明したものと同じ情報を含む。n-gramインデックス14とn-gramインデックス15の両方はIDの値が５２を含むので、n-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22の両方でID範囲の値が５１〜６０に対応するポインタは「FO」と「OT」それぞれの存在を示す。これに対し、ID範囲が８１〜９０において「OT」は存在せず、n-gramサブグループ出現リスト22のID範囲が８１〜９０に対応するポインタは「OT」が存在しない場合の所定の値である。
【００２７】
既に説明したとおり、計算機はn-gram出現リスト12とn-gram出現リスト13の両方においてID範囲の１〜１００に対応するポインタが「FO」と「OT」の存在することを示すため、これらのポインタをたどる。そして、n-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22をそれぞれ取得する。n-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22の両方においてID範囲が１〜１０に対応するポインタは「FO」と「OT」のいずれも存在しないことを示すため、計算機は次に照合対象を進める。
【００２８】
ID範囲が５１〜６０まで照合対象が進むと、ID範囲が５１〜６０に対応するポインタは「FO」と「OT」の両方の存在を示すため、計算機はポインタをたどりn-gramインデックス14とn-gramインデックス15を照合する。n-gramインデックス14とn-gramインデックス15の両方においてIDの値が６０までの照合を終了すると、計算機はn-gramサブグループ出現リスト21とn-gramサブグループ出現リスト22の両方のID範囲が６１〜７０へ照合対象を進める。
【００２９】
ID範囲の８１〜９０まで照合対象が進むと、n-gramサブグループ出現リスト21のID範囲が８１〜９０に対応するポインタは「FO」の存在を示すが、n-gramサブグループ出現リスト22のID範囲が８１〜９０に対応するポインタは「OT」の存在しないことを示すため、計算機はポインタをたどらずに次へ照合対象を進める。ここで、n-gram出現リスト12とn-gram出現リスト13のID範囲が１０１〜２００と２０１〜３００に対応するポインタは「FO」と「OT」のどちらか一方の存在しないことを示すため、計算機はこれらのポインタはたどらない。このため、計算機はn-gramサブグループ出現リスト23とn-gramサブグループ出現リスト24の両方を取得せず、処理の対象ともしない。
【００３０】
なお、図２に示した例ではn-gram出現リストとn-gramサブグループ出現リストの２階層としたが、ID範囲をグループ分けしてさらに多くの階層としてもよい。
【００３１】
以上で説明したように計算機はn-gramサブグループ出現リスト21、22に基づきn-gramインデックス14のIDの値が８９を含めて８１〜９０を照合対象とせず、さらに検索処理を減らすことができるため、テキスト検索を高速化できる。
【００３２】
図３はn-gramインデックスの代わりにテキストをスキャンする例を示す図である。この例では検索対象テキストなどのリードがページという単位により管理され、CPUはページ番号を指定することにより特定のページをリードする。１つのページの容量は例えば１回のリードで読める容量であって、例えば8KB（キロバイト）である。一般に計算機のOS（オペレーティングシステム）あるいはファイルシステムは、クラスタサイズなどと呼ばれる所定の容量をまとめて管理してリードの単位としており、ページの容量はクラスタサイズとしてもよい。また、データベースなどのアプリケーションプログラムが所定の容量をまとめて管理してリードの単位とする場合、ページの容量はアプリケーションプログラムの管理する容量としてもよい。
【００３３】
図３に示した検索語18と検索キー19とn-gramノード11は図１を用いて説明したものと同じである。n-gram出現リスト31はページ番号と各ページにおける「FO」の出現有無の情報を含む。n-gram出現リスト32はページ番号と各ページにおける「OT」の出現有無の情報を含む。ここで、n-gram出現リスト31のページ番号とn-gram出現リスト32のページ番号は対応しており、同じページ番号の容量は同じである。なお、ID範囲はこのページ番号の対応関係を説明するために図示したものであり、n-gram出現リスト31、32の内容としては必要がない。
【００３４】
ページ33はページ番号１を指定されることによりリードされるスキャン対象であり、IDが０１〜１５のスキャン対象を含む。この例ではアンケートの回答がテキスト検索の対象となるテキストであり、ページ33はIDと性別と年齢とアンケートの回答を含む。IDが０３のアンケートの回答は「FO」と「OT」の両方を含むため、IDが０３を含むページ番号１においてn-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有となる。ページ34はページ番号２を指定されることによりリードされるスキャン対象であり、ページ33と同じ構造である。ページ34のアンケートの回答は「OT」を含まず、IDが１６のアンケートの回答は「FO」を含むため、ページ番号２においてn-gram出現リスト31の出現有無は有となり、n-gram出現リスト32の出現有無は無となる。
【００３５】
ページ35とページ36もそれぞれページ番号３とページ番号４０を指定されることによりリードされるスキャン対象であり、ページ33と同じ構造である。ページ35のアンケートの回答は「FO」を含まず、IDが３３のアンケートの回答は「OT」を含むため、ページ番号３においてn-gram出現リスト31の出現有無は無となり、n-gram出現リスト32の出現有無は有となる。IDが７９のアンケートの回答は「OT」と「FO」の両方を含むため、IDが７９を含むページ番号４０においてn-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有となる。
【００３６】
テキスト検索の処理を開始すると、図１を用いて説明した処理を同じ処理により、計算機はn-gram出現リスト31とn-gram出現リスト32を取得する。ページ番号１においてn-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有であるため、計算機はページ番号１を指定してページ33をリードし、アンケートの回答をスキャンする。スキャンするために計算機はリードしたページ33のIDが０１のIDと性別と年齢を取得し、アンケートの回答のテキストで検索語18の「FOOT」でスキャンする。このスキャンの処理は１文字ずつ一致するか否かを判定するなどの処理でもよい。
【００３７】
計算機はIDが０１のアンケートの回答をスキャンし終えると、IDが０２へスキャン対象を進める。さらにIDが０３へスキャン対象を進めると、計算機は「FOOTBALL」の「FOOT」を見つける。計算機はIDが１５すなわちページ33の全てをスキャンし終えると、n-gram出現リスト31とn-gram出現リスト32の両方においてページ番号２の出現有無を判定する。この例ではn-gram出現リスト32の出現有無が無であるため、計算機はページ34をスキャン対象とすることなく、ページ番号３の出現有無の判定に進む。ページ番号３ではn-gram出現リスト31の出現有無が無であるので、計算機はページ35をスキャン対象とすることなく、ページ番号４の出現有無の判定へ進む。
【００３８】
このようにしてページ番号４０まで出現有無の判定を進めると、n-gram出現リスト31の出現有無とn-gram出現リスト32の出現有無の両方が有であるため、計算機はページ番号４０を指定してページ36をリードする。計算機はIDが７８のアンケートの回答をスキャン対象とし、次にIDが７９のアンケートの回答をスキャン対象とする。このアンケートの回答は「OT」と「FO」を含むが「FOOT」を含まないため、計算機は検索語18の「FOOT」でスキャンしても「FOOT」を見つけない。
【００３９】
以上で説明したように、計算機はn-gram出現リスト31、32に基づきページ34、35をスキャン対象とせず、検索処理を減らすことができるため、n-gramインデックスの代わりにテキストをスキャンしてもテキスト検索を高速化できる。また、リードの単位であるページで検索キーと一致する文字列の出現有無を管理するため、計算機は個別の検索キーと一致する文字列を含まないリードを行うことがない。
【００４０】
図４はアンケートの回答を分離した例を示す図である。検索語18と検索キー19とn-gramノード11は図１を用いて説明したものと同じである。n-gram出現リスト41は図３を用いて説明したn-gram出現リスト31と同じ構造であり、ページ番号と各ページにおける「FO」の出現有無の情報を含むが、１つのページに対応するIDの範囲が異なる。また、n-gram出現リスト42もn-gram出現リスト32と同じ構造であり、ページ番号と各ページにおける「OT」の出現有無の情報を含むが、１つのページに対応するIDの範囲が異なる。
【００４１】
ページ43はページ番号１を指定されることによりリードされる情報であり、IDが０１〜２０の情報を含む。ページ43はIDと性別と年齢とアンケートの回答へのポインタ（pt）を含む。このポインタはアンケートの回答の含まれるページ番号と、アンケートの回答のテキストそれぞれの先頭文字のページ内における文字位置を含んでもよい。IDとアンケートの回答との対応関係は図３に示したページ33、34と同じである。アンケートの回答をページ44へ分離することにより、ページ33と同じ容量であっても、ページ43はページ33と比較して多くのIDに関する情報を含むことができる。
【００４２】
また、ページ43は可変長のアンケートの回答を含まないため、各ページは同じ量のID範囲の情報を含むことができる。図３に示したn-gram出現リスト31ではページ番号１のID範囲が１〜１５の１５個のIDであり、ページ番号２のID範囲が１６〜２１の６個のIDであるのに対し、図４に示したn-gram出現リスト41ではページ番号１のID範囲もページ番号２のID範囲も２０個のIDである。
【００４３】
ページ44はページ番号５を指定されることによりリードされるスキャン対象であり、アンケートの回答のテキストを含む。ページ44はアンケートの回答以外を含まないため、ページ33と同じ容量であっても、ページ44はページ33と比較して多くのアンケートの回答を含むことができる。ページ45〜48もページ43、44と同じ構造である。なお、図４に示した例ではページ43のIDに対応するアンケートの回答がページ44に存在するが、このような状態に限定されるものではなく、ページの容量とテキストの容量によってはページ43のIDに対応するアンケートの回答の一部がページ44とページ46とに分かれる場合もある。また、ページ45の一部のIDに対応するアンケートの回答とページ47の一部のIDに対応するアンケートの回答とが１つのページ46にまとまる場合もある。
【００４４】
図３を用いて既に説明したページ33をリードする代わりに、計算機はページ43をリードし、ページ43内のポインタをたどってページ44をリードして、アンケートの回答をスキャン対象にする。
【００４５】
以上で説明したように、１回のリードにより多くのIDに関する情報を取得することが可能になる。また、可変長のテキストをポインタで管理するデータ構造は一般に広く採用されており、そのようなデータ構造であっても、計算機はn-gram出現リスト41、42に基づきページ45、46をスキャン対象とせず、検索処理を減らすことができるため、テキスト検索を高速化できる。
【００４６】
図５はn-gramノードを木構造にした例を示す図である。検索語18と検索キー19とn-gram出現リスト12、13は図１を用いて説明したものと同じである。図５に示すn-gramノードの例は木構造であり、根（ルート）となる第１層のn-gramノード51と第２層のn-gramノード52と葉（リーフ）となる第３層のn-gramノード53とから構成される。n-gramノード53はn-gramノード11と同じ内容であり、ｎ文字（２文字）とそのｎ文字に対応するn-gramインデックスへのポインタを含む。
【００４７】
n-gramノード52はn-gramノード53へのポインタを含む。n-gramノード52のｎ文字が「AE」に対応するポインタは、n-gramノード53のｎ文字が「AB」「AC」「AE」へのポインタである。図５に示したポインタは「AB」「AC」「AE」の３つを代表して「AB」への矢印で表す。同様にn-gramノード52のｎ文字が「BR」に対応するポインタは、n-gramノード53のｎ文字が「BE」「BI」「BR」へのポインタであり、n-gramノード52のｎ文字が「OT」に対応するポインタは、n-gramノード53のｎ文字が「FO」「GO」「OT」へのポインタである。
【００４８】
n-gramノード51のｎ文字が「BR」に対応するポインタは、n-gramノード52の「AE」「BR」を含むｎ文字へのポインタであり、n-gramノード51のｎ文字が「SV」に対応するポインタは、n-gramノード52の「OT」「SV」を含むｎ文字へのポインタである。このため、「BR」と「SV」との間に位置するｎ文字は「SV」に対応するポインタの先に存在し、「AE」と「BR」との間に位置するｎ文字は「BR」に対応するポインタの先に存在する。
【００４９】
計算機は検索条件である検索語18の「FOOT」を検索キー19の「FO」と「OT」へ分解すると、「FO」と「OT」のそれぞれをn-gramノード51から検索する。計算機は検索キー19の「FO」とｎ文字の「BR」と比較し、ｎ文字の「SV」と比較して、「FO」が「BR」と「SV」との間に位置すると判断する。そして、計算機は「SV」に対応するポインタをたどり、n-gramノード52の「OT」と「SV」を含むｎ文字を取得する。計算機は検索キー19の「FO」とn-gramノード52のｎ文字の「OT」と比較して、「FO」が「OT」より「BR」の方に存在する、すなわち「FO」が「OT」と「BR」との間に位置すると判断する。
【００５０】
このため、計算機は「OT」に対応するポインタをたどり、n-gramノード53の「FO」を見つけて「FO」に対応するポインタをたどり、n-gram出現リスト12を取得する。この後の処理は図１を用いて既に説明した処理と同じである。また、検索キー19の「OT」に関しても同じくn-gramノード51の「SV」に対応するポインタをたどり、n-gramノード52の「OT」に対応するポインタをたどり、n-gramノード53の「OT」を見つけて「OT」に対応するポインタをたどり、n-gram出現リスト13を取得する。
【００５１】
以上の説明でも明らかなように、計算機が図１に示したn-gramノード11を用いてｎ文字の「AB」「AC」「AE」「BE」などと順番に１つずつ検索キー19と比較して検索するよりも図５に示した木構造のn-gramノードを用いた方が比較の回数が少なく、短い時間で検索キー19と一致するｎ文字を見つけることができる。なお、木構造の階層の数は多いと比較の回数が増加するため、階層の数が均一であって少ない方が比較の回数が少なくなる。このため、いわゆるバランスした木構造の方が好ましい。
【００５２】
以上で説明したように、計算機は木構造のn-gramノードにより検索開始から短時間でn-gram出現リストを取得できる。また、n-gramノードを木構造にしてもn-gram出現リストは使用できるため、図１などを用いて説明した高速化の効果を得ることができる。なお、各階層は同じｎ文字を配置するn-gramノードの木構造すなわちn-gramノード51、52、53は「BR」を含む木構造を説明したが、例えばn-gramノード51のｎ文字が１文字であり、n-gramノード52のｎ文字が２文字であり、n-gramノード53のｎ文字が３文字であるような木構造であってもよい。すなわち、「ABC」を「A」「AB」「ABC」と階層化した木構造であってもよい。
【００５３】
図６はB-treeを用いた検索の例を示す図である。以上で説明した出現リストはテキスト検索のみならず、B-treeを用いた検索でも利用できる。検索対象テーブル61はID、C1、C2、C3の４つの項目に対して値を含むものであり、C1、C2、C3の各項目の値に一致するIDの値を検索されるテーブルである。計算機は検索開始前に検索対象テーブル61からC1のB-treeノードと図示を省略したC2のB-treeノードとC3のB-treeノードを展開する。ここで、B-treeノードは一般的なB-treeの構造であるので、構造そのものの説明は省略する。
【００５４】
図６に示したB-treeノードの各値はC1あるいはC3の値に対応する。そして、B-treeノードからB-tree出現リスト62、63へのポインタはIDの値を特定する情報であるが、C1の１つの値に対し複数のIDの値が検索対象テーブル61では対応する。図６に示した検索対象テーブル61のC1が１２という値に対応するIDの値として１と３があり、検索対象テーブル61では図示を省略したIDの値として８、２２、２９もB-treeインデックス64、66に示すようにC1が１２という値に対応する。
【００５５】
図１を用いて説明した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の値が１２である場合の検索対象テーブル61のIDの値を列挙したものであり、B-treeインデックス64はIDの値が１〜１０の範囲のものを含み、B-treeインデックス66はIDの値が２１〜３０の範囲のものを含む。ここで、IDの値が１１〜２０の範囲のものは存在しない。また、B-treeインデックス65、67はC3の値が３２である場合の検索対象テーブル61のIDの値を列挙したものであり、B-treeインデックス65はIDの値が１〜１０の範囲のものを含み、B-treeインデックス67はIDの値が１１〜２０の範囲のものを含む。
【００５７】
計算機は検索対象テーブル61をB-treeノードへ展開した後、B-treeインデックス64〜67を作成し、B-tree出現リスト62、63を作成してポインタで接続する。計算機は検索を開始すると検索条件68を検索キー69へ変換する。この例では検索条件68がC1の値が１２であることとC3の値が32であることのAND条件である。このため、検索キー69はC1の値である１２とC3の値である３２と変換される。そして、C1の値が検索キー69の値１２に一致するIDが検索され、C3の値が検索キー69の値３２に一致するIDが検索される。
【００５８】
検索キー69の値１２がC1のB-treeノードにおいて値５０以下であり、値１２と一致するため、計算機はB-tree出現リスト62を取得する。また、検索キー69の値３２がC3のB-treeノードにおいて値５２以下であり、値３５以下であり、値３２と一致するため、計算機はB-tree出現リスト63を取得する。既に説明したようにB-tree出現リスト62のID範囲の各値とB-tree出現リスト63のID範囲の各値とは同一である。計算機はID範囲１〜１０において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の値として３を見つける。さらに、計算機は照合対象を進めて、B-treeインデックス64のID 8とB-treeインデックス65のID 5を比較し、これらのIDの値は一致せず、B-treeインデックス64とB-treeインデックス65の末尾であるため、B-tree出現リスト62とB-tree出現リスト63における照合対象をID範囲１１〜２０へ進める。
【００６０】
計算機はB-tree出現リスト62のID範囲１１〜２０に対応するポインタからID範囲１１〜２０にはIDが存在しないと判断し、B-tree出現リスト63のID範囲１１〜２０に対応するポインタの先のB-treeインデックス67を照合対象とすることなく、検索条件68を満たさないと判断する。さらに、計算機はB-tree出現リスト62とB-tree出現リスト63における照合対象をID範囲２１〜３０へ進める。計算機はB-tree出現リスト63のID範囲２１〜３０に対応するポインタからID範囲２１〜３０にはIDが存在しないと判断し、B-tree出現リスト62のID範囲２１〜３０に対応するポインタの先のB-treeインデックス66を照合対象とすることなく、検索条件68を満たさないと判断する。
【００６１】
以上で説明したように、B-treeを用いた検索においても計算機はB-tree出現リストに基づきB-treeインデックス66、67を照合対象とせず、検索処理を減らすことができるため、ID検索を高速化できる。
【００６２】
図７はファイルシステムの例を示す図である。計算機のＯＳあるいはファイルシステムにはiノードを用いてディレクトリとファイルを管理するものがある。このような管理においてディレクトリもファイルであり、データ領域にデータブロックとして管理される。iノードは複数個列挙されてiノードリストを構成する。図７に示すように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ノードリストはリスト番号で管理される。図３を用いた説明と同じように、iノードリストのグループの単位は１回のリードの単位が好ましい。そして、出現リストにおいてリスト番号ごとに検索キーの出現有無を管理する。複数の出現リストは同一のリスト番号を有するため、同一のグループ分けされたiノードリストを管理する。
【００６５】
例えば「main」という検索キーはリスト番号１で管理されるiノードリスト73とリスト番号２で管理されるiノードリスト74との２つのiノードリストに含まれるポインタの先のデータブロックには存在しないため、出現リスト71のリスト番号１と２の出現有無の欄は無となる。これに対し、リスト番号３で管理されるiノードリスト75に含まれるiノード79のポインタの先のtest.cファイル713には「main」が存在するため、出現リスト71のリスト番号３の出現有無の欄は有となる。「src」の出現リスト72も同様である。
【００６６】
「main」と「src」の両方の検索キーを含むディレクトリやファイルなどのデータブロックを検索する場合、計算機は先ず出現リスト71のリスト番号１の出現有無の欄と出現リスト72のリスト番号１の出現有無の欄との両方が無であると判定する。すなわち、計算機はリスト番号１のiノードリスト73に含まれるポインタの先には「main」と「src」の両方が無いことを判定できるため、iノードリスト73を検索対象とせず、リスト番号２へ進む。計算機は出現リスト72のリスト番号２の出現有無の欄は有であるが、出現リスト71のリスト番号２の出現有無の欄は無であると判定する。このため、計算機はiノードリスト74を検索対象とせず、リスト３へ進む。
【００６７】
計算機は出現リスト71と出現リスト72の両方のリスト番号３の出現有無の欄が有であると判定する。この時点では、リスト番号３で管理する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をスキャン対象とせず、検索処理を減らすことができるため、ファイルの検索を高速化できる。
【００６９】
図８は計算機の構成の例を示す図である。計算機はCPU-A81とCPU-B82の２個のCPUを有し、２個のCPUは独立して処理を実行できる。CPU-A81は専用のキャッシュA83が接続され、CPU-B82は専用のキャッシュB84が接続される。さらに、計算機はCPU-A81とCPU-B82が共用するキャッシュC85を有し、メモリ86とHDD（ハードディスクドライブ）やSSD（ソリッドステートドライブ）などのストレージデバイス87を有する。これらはアクセス性能と記憶容量が異なり、キャッシュA83とキャッシュB84のアクセス性能が１番に高く記憶容量が１番に少ない。キャッシュC85のアクセス性能が２番目に高く記憶容量が２番目に少ない。メモリ86のアクセス性能が３番目に高く記憶容量が３番目に少ない。ストレージデバイス87のアクセス性能が４番目に高く記憶容量が４番目に少ない。
【００７０】
出現リストすなわちn-gram出現リスト12、13、21〜24、31、32、41、42と、B-tree出現リスト62、63と、出現リスト71、72は、所定の範囲に検索キーが存在するか否かを示す簡単な情報であり、格納に必要な記憶容量が少ないため、キャッシュA83およびキャッシュB84あるいはキャッシュC85に格納されることにより、検索処理を高速化できる。特に、出現リスト以外の情報は処理対象とならない場合があるのに対し、出現リストの情報は全てが処理対象となるため、出現リストがキャッシュに格納されることにより検索処理の高速化の効果は高くなる。
【００７１】
図３に示すようにページがアンケートの回答のテキストを含む場合、テキストは大きな記憶容量を占めるため、ページはストレージデバイス87に格納され、出現リストに基づきリードされるページが少なくなることにより、ストレージデバイス87へのアクセス回数が減少して検索処理の高速化の効果は高くなる。
【００７２】
図２に示すように出現リストが階層化された場合、階層内の複数の出現リストは異なるCPUで並列に処理されてもよい。例えば、図２に示すn-gramサブグループ出現リスト21、22はキャッシュA83に格納されて、CPU-A81により処理される。これに対して、図示を省略したn-gram出現リスト12、13の両方の同じID範囲にポインタの存在するn-gramサブグループ出現リストはキャッシュB84に格納されて、CPU-B82により処理される。これにより、２つのn-gramサブグループ出現リストは２つのCPU-A81とCPU-B82により並列に処理可能となる。
【００７３】
また、出現リストの異なるID範囲は独立であるため、異なるID範囲は異なるCPUで並列に処理されてもよい。例えば、n-gram出現リスト12、13の両方のID範囲１〜１００はキャッシュA83に格納されて、CPU-A81により処理される。これに対して、n-gram出現リスト12、13の両方のID範囲１０１〜２００はキャッシュB84に格納されて、CPU-B82により処理される。そして、n-gramサブグループ出現リストも異なるID範囲は異なるCPUで処理されてもよく、n-gram出現リスト31、32の異なるページ番号は異なるCPUで処理されてもよい。
【００７４】
なお、計算機がキャッシュA83とキャッシュB84を含まない場合であっても、異なるCPUで並列に処理するために、出現リストがキャッシュC85あるいはメモリ86に格納されて、CPU-A81とCPU-B82に共用されてもよい。
【００７５】
図３、４に示すようにアンケートの回答のテキストがスキャンされる場合、異なるページのアンケートの回答のテキストは異なるCPUで並列にスキャンされてもよい。例えば、図３に示すページ番号１のページ33をCPU-A81がスキャンし、ページ番号４０のページ36をCPU-A82がスキャンしてもよい。図８には計算機が２個のCPUと３個のキャッシュを有する例を示したが、これに限定されるものではなく、３個以上のCPUを有してもよく、４個以上のキャッシュを有してもよい。
【００７６】
計算機は、図示を省略したディスプレイとキーボードとマウスを接続する入出力IF（インターフェイス）88と図示を省略したネットワークに接続するネットワークIF89を有する。計算機が検索を処理するための設定情報を入出力IF88経由で受け取り、検索結果を入出力IF88から出力してディスプレイに表示してもよい。また、計算機はネットワークIF89経由で設定情報を受け取り、検索結果を出力してもよい。さらに、テキストやIDなどの検索対象データおよび検索のために実行するプログラムをネットワークIF89で受け取ってもよい。
【００７７】
図９は出現リストを作成する処理フローの例を示す図である。出現リストは検索開始前のn-gramノード、B-treeノード、iノード作成時に作成されてもよいし、n-gramノードとn-gramインデックスあるいはB-treeノードとB-treeインデックスが予め作成されていて検索を開始し、１回目の検索の時点で作成されてもよい。ここでは検索開始前にノードとともに出現リストを作成する例を説明する。
【００７８】
計算機はステップ91によりグループ作成単位を決定する。図１において１００のID範囲が１つのグループであり、図３において１つのページが１つのグループであり、図６において１０のID範囲が１つのグループである。これらのグループを作成する単位はユーザの入力値を使用してもよいし、ページなどのリードの単位であればＯＳやファイルシステムのパラメタから取得してもよい。次に、計算機はステップ92からステップ911までのステップをループの範囲とし、グループの個数をループの回数としてステップ93へ進む。
【００７９】
計算機はステップ93により１つのグループのデータを取得する。ここで、１つのグループはステップ91で決定した単位のグループであり、ループが実行されるごとに次々と他のグループへ変更される。データは図３、４のテキスト検索においてページ33などのID、性別、年齢、アンケートの回答（テキスト）であり、図６のID検索において検索対象テーブル61であり、図７のファイルシステム検索においてデータブロックである。
【００８０】
ステップ94により計算機はステップ93で取得したデータから全てのIDを取得する。全てのIDは図１において例えば１〜１００に含まれる全てのIDであって５２、７３、８９、９５などであり、図３において例えば１〜１５であり、図６では例えば１〜１０に含まれる全てのIDであって１〜３、５、８などである。次に、計算機はステップ95からステップ910までのステップをループの範囲とし、ステップ94で取得したIDの個数をループの回数としてステップ96へ進む。
【００８１】
計算機はステップ96により１つのIDに対応するテキスト内の全てｎ文字、あるいは１つのIDに対応する値を取得する。ここで、１つのIDはループが実行されるごとに次々と他のIDへ変更される。そして、図３においてIDが０１に対応するテキスト内の全てのｎ文字は、アンケートの回答のテキストから「OU」「UT」「TD」などの全ての２文字である。また、図６においてIDが１に対応する値は、C1の１２とC2のaaaとC3の７８である。
【００８２】
ステップ97により計算機はステップ96で取得した全てのｎ文字あるいは値をn-gramノードあるいはB-treeノードへ登録し、n-gramノードあるいはB-treeノードを作成して行く。ステップ98により計算機はインデックスへIDおよび必要に応じて全ての文字位置を登録する。すなわち、ステップ96でIDの値が５２の場合に図１で計算機はn-gramインデックス14、15にIDの値５２を登録し、このIDの値に対して文字位置３７と１２２および文字位置３９と１２５を登録する。また、ステップ96でIDの値が１の場合に図６で計算機はB-treeインデックス64にIDの値１を登録し、図示を省略したC2がaaaに対応するB-treeインデックスとC3が７８に対応するB-treeインデックスにIDの値１を登録する。
【００８３】
ステップ99により計算機はステップ98で新たなｎ文字あるいは新たな値を登録した場合、登録した新たなｎ文字あるいは新たな値に関する出現リストを作成し、作成した出現リストあるいは既に作成済みの出現リストへインデックスへのポインタあるいは出現有無の情報を登録する。ここで、出現リストを作成するために計算機は図１でIDの値が５２の新たなｎ文字「FO」に対し、ID範囲が１〜１００のみならず１０１以降も含めてグループの数を行数とするn-gram出現リスト12を作成する。そして、計算機はn-gramノード11のｎ文字「FO」に対応するポインタへn-gram出現リスト12を登録し、n-gram出現リスト12のID範囲が１〜１００に対応するポインタへn-gramインデックス14を登録する。計算機はn-gram出現リストのID範囲が１０１以降のポインタへ「FO」が存在しない場合の所定の値を設定する。
【００８４】
その後、計算機はIDの値が２０３の新たではないｎ文字「FO」に対し、既に存在するn-gram出現リスト12のID範囲が２０１〜３００に対応するポインタへn-gramインデックス16を登録する。ID範囲が１０１〜２００において「FO」は存在しないため、n-gram出現リスト12のID範囲が１０１〜２００は作成時に設定された「FO」が存在しない場合の所定の値を維持する。
【００８５】
以上で説明したように、n-gramノードあるいはB-treeノードと、n-gramインデックスあるいはB-treeインデックスを作成するとともに、n-gram出現リストあるいはB-tree出現リストを作成できる。なお、図３、４に示したテキストスキャンと図７に示したファイルシステムではインデックスなどがないため、計算機は必要のないステップを実行しなければよい。
【００８６】
図１０は出現リストを使用した検索の処理フローの例を示す図である。ステップ101により計算機は検索条件である検索語18を検索キー19に変換する、あるいは検索条件68を検索キー69に変換する。ステップ102により計算機はn-gramノードあるいはB-treeノードを検索キーで検索し、検索キーにより見つかったｎ文字列あるいは値に対応するポインタを取得し、取得したポインタにより出現リストを取得する。すなわち、図１において計算機は検索キー19の「FO」に対してn-gramノード11のｎ文字「FO」を見つけ、ｎ文字「FO」に対応するポインタを使用してn-gram出現リスト12を取得する。また、図６において計算機は検索キー69の値１２に対してC1のB-treeノードの値１２を見つけ、値１２に対応するポインタを使用してB-tree出現リスト62を取得する。
【００８７】
計算機はステップ103からステップ107までのステップをループの範囲とし、ステップ102で取得した出現リスト内のグループ数をループの回数としてステップ104へ進む。ここで、グループ数は図１のn-gram出現リスト12の１〜１００と１０１〜２００と２０１〜３００を３個と数えてのID範囲の項目数であり、図３のn-gram出現リスト31のページ番号の項目数の４０である。
【００８８】
ステップ104により計算機は出現リストから１つのグループの全ての出現有無情報あるいは出現有無を示すポインタを取得する。ここで、１つのグループはループが実行されるごとに次々と他のグループへ変更される。１つのグループの全ての出現有無情報は例えば図３のn-gram出現リスト31のページ番号１に対応する出現有無情報とn-gram出現リスト32のページ番号１に対応する出現有無情報である。すなわち、ページ番号１という１つのグループの複数のn-gram出現リスト全ての出現有無情報である。１つのグループの全ての出現有無を示すポインタは例えば図１のn-gram出現リスト12のID範囲が１〜１００に対応するポインタとn-gram出現リスト13のID範囲が１〜１００に対応するポインタである。すなわち、ID範囲が１〜１００という１つのグループの複数のn-gram出現リスト全てのポインタである。
【００８９】
ステップ105により計算機はステップ104で取得した出現有無情報が全て有を示すか否か、あるいは取得したポインタが全て有を示すか否かを判定する。計算機は全て有を示すと判定するとステップ106へ進み、出現有無情報が有に対応する１つのグループについて詳細な検索を行う。例えば図３ではページ番号１という有に対応する１つのグループがあり、計算機はページ番号１であるページ33を取得し、ページ33に含まれるアンケートの回答のテキストの中から「FOOT」をスキャンする。
【００９０】
例えば図１ではID範囲が１〜１００という有に対する１つのグループがあり、計算機はn-gram出現リスト12のID範囲が１〜１００に対応するポインタからn-gramインデックス14を取得し、n-gram出現リスト13のID範囲が１〜１００に対応するポインタからn-gramインデックス15を取得し、図１を用いて既に説明したようにIDの一致と文字位置の隣接を照合する。ステップ103からステップ107までのループにより全てのグループを照合すると、計算機はステップ108により詳細検索の結果をまとめて出力する。
【００９１】
以上で説明したように、計算機は出現リストに基づき１つのグループの全ての出現有無情報が有の場合のみに詳細検索を実行するため、詳細検索の実行対象を絞ることができ、検索を高速化できる。また、図１０においてステップ106を全てのグループの出現有無情報のチェックが終わった後に実行することとし、全出現有無情報が有であるグループの数が多い場合、すなわち詳細検索に時間が掛かる場合には、ユーザに検索条件の見直しを促すようにしてもよい。
【００９２】
図１１は出現リスト作成パラメタの入力の例を示す図である。図９に示したステップ91において計算機は入出力IF88からディスプレイへウインドウ111の表示データを出力し、キーボードとマウスによるパラメタの入力を入出力IF88で受け付けてもよい。また、ネットワークIF89で接続されたネットワークの他の計算機が出力と入力を行い、出力する表示データと入力するパラメタを計算機はネットワークIF89で送受信してもよい。
【００９３】
出現リスト作成の入力欄112は、出現リストを作成しない設定、出現リストを検索開始前に作成する設定、出現リストを１回目の検索時に作成する設定を含む設定を入力する欄である。この欄で出現リストを作成しない設定が入力されると、計算機は図９に示したステップ99を実行せず、対応するインデックスをノードへ登録する。また、出現リストを１回目の検索時に作成する設定が入力されると、計算機はステップ99を実行せず、対応するインデックスをノードへ登録し、１回目の検索時に出現リストを作成して登録する。また、出現リストを検索開始前に作成する設定が入力されると、計算機は図９を用いて説明したとおり処理する。
【００９４】
検索対象の入力欄113は検索対象データのファイルなど、すなわち出現リストを作成する対象のファイルなどを指定する欄である。テキスト検索の対象となるテキストファイルの名称を指定してもよいし、検索の対象となるデータベースなどの名称を指定してもよい。計算機はステップ93により検索対象の入力欄113で指定されたファイルなどからデータを取得する。
【００９５】
ID単位の入力欄114は図１、６を用いて説明したIDを指定される欄である。検索対象の入力欄113で指定されたファイルなどにIDが明示的に含まれる場合、例えば図６を用いて説明した検索対象テーブル61にはIDの項目が存在するため、このIDの項目をID単位の入力欄114は指定される。検索対象の入力欄113で指定されたファイルなどにIDが明示的に含まれていない場合、図１を用いて説明したように項目やパラグラフをID単位の入力欄114は指定されてもよい。また、テキストの行をID単位として指定されてもよい。なお、図３、４を用いて説明した例ではIDを使用しないため、ID単位の入力欄114はIDを指定されないという設定が可能であってもよい。
【００９６】
グループ単位の入力欄115はID単位の入力欄114で指定されたIDを基準にグループを指定したり、OSやファイルシステムからパラメタを取得してグループとすることを指定したりする欄である。図１を用いて説明したn-gram出現リスト12、13とするために、グループ単位の入力欄115は１００という単位が入力され、図６を用いて説明したB-tree出現リスト62、63とするために、グループ単位の入力欄115は１０という単位が入力される。図３、４を用いて説明した例では、OSやファイルシステムから１回のリードという単位が入力される。このグループ単位の入力欄115で入力された指定は複数の出現リスト全てで共通である。これによりグループごとに検索キー19、69で見つかるものの出現有無の判定が可能となる。
【００９７】
階層数の入力欄116は出現リストの階層数を指定される欄である。図１、６の例では出現リストが１層であるため、階層数の入力欄116は１が入力される。あるいは、デフォルトの階層数を１として、計算機は何も入力されないと出現リストが１層であると判断してもよい。図２の例では出現リストがn-gram出現リスト12、13とn-gramサブグループ出現リスト21〜24の２層であるため、階層数の入力欄116は２が入力される。ここで、n-gramサブグループ出現リスト21、23はn-gram出現リスト12の１つのグループをさらにグループ分けするものであるから、そのグループ分けの単位を入力するために、グループ単位の入力欄115を２つに増やす。そして、グループ単位の入力欄115はn-gram出現リスト12のための１００とn-gramサブグループ出現リスト21、23のための１０が入力される。
【００９８】
入力欄112〜116のそれぞれは文字列を入力可能としてもよいし、選択可能な候補が列挙して表示されていわゆるラジオボタンで選択可能としてもよいし、いわゆるプルダウンメニューで選択可能としてもよい。
【００９９】
以上で説明したように、検索対象データを複数のグループに分け、複数の出現リストで同じグループを管理することにより、計算機は出現リストに基づき検索が不要のグループを判断できるため、検索が不要なグループの処理を削減し、検索を高速化できる。
【符号の説明】
【０１００】
１１      ：n-gramノード
１２、１３：n-gram出現リスト
１４〜１７：n-gramインデックス
１８      ：検索語
１９、６９：検索キー
２１〜２４：n-gramサブグループ出現リスト
６２、６３：B-tree出現リスト
６４〜６７：B-treeインデックス
６８      ：検索条件
【図１】
2016001991.tif 000003
【図２】
2016001991.tif 000004
【図３】
2016001991.tif 000005
【図４】
2016001991.tif 000006
【図５】
2016001991.tif 000007
【図６】
2016001991.tif 000008
【図７】
2016001991.tif 000009
【図８】
2016001991.tif 000010
【図９】
2016001991.tif 000011
【図１０】
2016001991.tif 000012
【図１１】
2016001991.tif 000013
【国際調査報告】
2016001991.tif 000014
2016001991.tif 000015
2016001991.tif 000016
2016001991.tif 000017