以下、検索装置等の実施形態について図面を参照して説明する。なお、実施の形態において同じ符号を付した構成要素は同様の動作を行うので、再度の説明を省略する場合がある。
(実施の形態1)
本実施の形態において、1種類以上のインデックスを用いて、データソースに対して情報検索を行う検索装置を具備する検索システムについて説明する。なお、1種類以上のインデックスは、例えば、後述する配列インデックス、後述する配列ラベル・インデックス、後述するレコード・インデックス、後述する2次インデックス、後述するソース・インデックスである。
また、本実施の形態において、データソースを用いて、当該データソースに対応する1種類以上のインデックスを生成する検索装置を具備する検索システムについて説明する。
さらに、本実施の形態において、インデックスを自動更新する検索装置を具備する検索システムについて説明する。
図1は、本実施の形態における検索システムAの概念図である。検索システムAは、例えば、検索装置1、1または2以上のデータソース管理装置2、1または2以上の端末装置3を備える。
検索装置1は、データソースから情報を検索する装置である。データソース管理装置2は、1または2以上のデータソースが格納されている装置である。端末装置3は、情報を検索するユーザが使用する端末である。
検索装置1、データソース管理装置2は、例えば、いわゆるサーバであり、例えば、クラウドサーバ、ASPサーバ等である。なお、検索装置1、データソース管理装置2の種類は問わない。また、検索装置1は、スタンドアロンの装置でも良い。かかる場合、検索システムAは、データソース管理装置2や端末装置3を有さなくても良い。また、かかる場合、データソースは、検索装置1に格納されている。
図2は、本実施の形態における検索システムAのブロック図である。図3は、検索システムAを構成する検索装置1のブロック図である。
検索装置1は、格納部11、受付部12、処理部13、および出力部14を備える。格納部11は、データソース格納部111、インデックス格納部112を備える。インデックス格納部112は、配列インデックス格納部1121、配列ラベル・インデックス格納部1122、レコード・インデックス格納部1123、2次インデックス格納部1124、およびソース・インデックス格納部1125を備える。受付部12は、条件受付部121を備える。処理部13は、インデックス生成部131、検索部132、およびインデックス更新部133を備える。インデックス生成部131は、配列インデックス生成部1311、配列ラベル・インデックス生成部1312、レコード・インデックス生成部1313、2次インデックス生成部1314、およびソース・インデックス生成部1315を備える。出力部14は、結果出力部141を備える。
データソース管理装置2は、データソース格納部111を備える。
端末装置3は、端末格納部31、端末受付部32、端末処理部33、端末送信部34、端末受信部35、および端末出力部36を備える。
検索装置1を構成する格納部11には、各種の情報が格納される。各種の情報は、例えば、後述するデータソース、後述する1以上の種類のインデックスである。
データソース格納部111には、1または2以上のデータソースが格納される。なお、検索装置1は、データソース格納部111が存在しなくても良い。かかる場合、検索対象のデータソースは、データソース管理装置2に格納されている。
データソースは、検索対象のデータの集合である。データは、情報と言っても良い。データソースは、通常、一つのファイルである。ただし、データソースは、例えば、一つのデータベース、データベース内の一つの表などでも良い。データソースは、通常、1または2以上のレコードを有する。レコードは、例えば、行やタップル等と言っても良い。レコード間は、例えば、第一デリミタにより区切られているなど、その区切りは認識可能である。第一デリミタは、例えば、リターンコード、TABコード、スペース等であるが、問わない。データソースは、検索対象以外のデータを有しても良い。検索対象以外のデータは、例えば、項目ラベル、属性識別子である。項目ラベルは、項目のラベルであるが、項目名でも良い。項目は、例えば、キー項目と明細項目とを有する。キー項目は、キー項目値に対する識別子である。また、1レコード内に、2以上のキー項目が存在しても良い。明細項目は、キー項目を含む項目である。なお、キー項目や明細項目も、属性識別子である、と考えても良い。つまり、キー項目値や明細項目値も、レコードを構成する属性値である、と考えても良い。属性識別子は、属性を識別する情報である。属性識別子は、例えば、属性名、属性のIDである。レコードは、通常、2以上の属性値を有する。レコードは、キー項目値や明細項目値も有しても良い。ただし、レコードは、一つの属性値でも良い。レコードにおける属性値の間は、例えば、第二デリミタにより区切られているなど、その区切りは認識可能である。第二デリミタは、例えば、カンマ「,」、コロン「:」、セミコロン「;」、スペース、TABコード等であるが、問わない。データソースは、ソース識別子に対応付いている。ソース識別子は、データソースを識別する情報であり、例えば、ファイル名、ファイルのIDである。なお、キー項目値は、例えば、予め決められている。なお、予め決められていることは、通常、ユーザの指定により、インデックスの生成時には、決まっていることを意味する。
データソースの中の属性値は、通常、固定長ではなく、可変長である。また、データソースの中のレコードも、通常、固定長ではなく、可変長である。ただし、データソースの中の属性値やレコードは、固定長でも良い。
データソースは、1以上のソース属性値に対応付いていることは好適である。ソース属性値は、データソースの属性値である。ソース属性値は、例えば、最終更新時情報、更新者識別子、サイズ、種類識別子である。最終更新時情報は、データソースの最終更新時を特定する情報であり、例えば、年月日時分秒、月日時分である。更新者識別子は、データソースの更新者(通常、最終更新者)を識別する情報である。サイズは、データソースのデータサイズであり、例えば、バイト数、ビット数である。種類識別子は、データソースの種類を特定する情報であり、例えば、「ファイル」「RDB」「表」である。「ファイル」はデータソースがファイルであることを示す。「RDB」はデータソースがRDB(リレーショナルデータベース)であることを示す。「表」はデータソースが表形式の情報であることを示す。
インデックス格納部112には、1または2以上の種類のインデックスが格納される。インデックスとは、データソースから所望の情報を検索するために参照される情報(通常、索引)である。インデックスは、例えば、後述する配列インデックス、後述する配列ラベル・インデックス、後述するレコード・インデックス、後述する2次インデックス、後述するソース・インデックスである。
1種類以上の各インデックスは、例えば、ファイルである。ただし、インデックスは、RDB等のデータベース内の情報でも良く、その物理的な構造は問わない。データベース内の情報は、例えば、表である。
なお、インデックスには、生成時情報が対応付いていることは好適である。生成時情報は、インデックスが生成された時を特定する情報であり、例えば、年月日時分秒、月日時分である。
配列インデックス格納部1121には、配列インデックスが格納される。配列インデックス格納部1121には、通常、データソースごとに、配列インデックスが格納される。つまり、配列インデックスは、通常、データソースを識別するソース識別子に対応付いている。なお、検索対象のデータソースが一つである場合、配列インデックスは、ソース識別子に対応付いている必要はない。
配列インデックスは、レコード内の属性値の位置を特定するための情報であるである。 配列インデックスは、データソースが有するレコードごとの情報である1以上の配列インデックスレコードを有する。配列インデックスレコードは、各レコードの各属性ごとの属性位置情報を有する。属性位置情報は、属性値が存在する位置を特定する情報である。属性位置情報は、通常、属性値のレコード内におけるオフセットである。ただし、属性位置情報は、データソース内におけるオフセット等でも良い。属性位置情報は、例えば、レコードを識別するレコード識別子、および属性識別子に対応付いている。
配列インデックスは、すべてのレコードに対応する一部の属性値の属性位置情報を有することは好適であるが、データソースが有するすべてのレコードに対応するすべての属性値の属性位置情報を有しても良いし、一部のレコードに対応するすべての属性値の属性位置情報を有しても良いし、一部のレコードに対応する一部の属性値の属性位置情報を有しても良い。
配列インデックスが、一部の属性値の属性位置情報のみを有する場合、データソースのレコード内の属性値の並びの順に、配列インデックスは属性位置情報を有する。
配列ラベル・インデックス格納部1122には、配列ラベル・インデックスが格納される。配列ラベル・インデックス格納部1122には、通常、データソースごとに、配列ラベル・インデックスが格納される。つまり、配列ラベル・インデックスは、通常、ソース識別子に対応付いている。なお、検索対象のデータソースが一つである場合、配列ラベル・インデックスは、ソース識別子に対応付いている必要はない。
配列ラベル・インデックスは、データソースのレコードにおける属性の順番を特定するための情報である。配列ラベル・インデックスは、データソースが有するレコードごとの情報である1以上の配列ラベル・インデックスレコードを有する。配列ラベル・インデックスレコードは、レコード内における属性の順番を示す情報である。配列ラベル・インデックスレコードは、例えば、属性識別子と属性順番情報との組である。2以上の各配列ラベル・インデックスレコードは、例えば、レコード内の順番に配置された属性識別子でも良い。配列ラベル・インデックスは、レコードにおけるすべての属性の順番を特定する情報であることは好適である。配列ラベル・インデックスにおいて、属性識別子はソートされていることは好適である。
レコード・インデックス格納部1123には、レコード・インデックスが格納される。レコード・インデックス格納部1123には、通常、データソースごとに、レコード・インデックスが格納される。つまり、レコード・インデックスは、通常、ソース識別子に対応付いている。なお、検索対象のデータソースが一つである場合、レコード・インデックスは、ソース識別子に対応付いている必要はない。
レコード・インデックスは、データソースのレコードに対応するインデックスである。レコード・インデックスは、データソースのレコードの位置を特定するための1以上のレコード・インデックスレコードを有する。レコード・インデックスレコードは、キー項目値あるいは2以上のキー項目値の組合せと、レコード位置情報とを有する。レコード・インデックスレコードは、キー項目値とレコード位置情報とレコード・インデックスレコード位置情報の組でも良い。
また、同じレコード内の異なるキー項目値、あるいはキー項目値の組合せとレコード位置情報とを有する、別のレコード・インデックスを有することは好適である。
キー項目値は、レコードに含まれる属性値であり、キーとなる属性値である。キー項目値は、レコードを識別可能なユニークな情報であることは好適であるが、ユニークな情報でなくても良い。
レコード位置情報は、キー項目値を含むレコードの位置を特定する情報である。レコード位置情報は、例えば、レコードの位置を特定するデータソースの中のオフセットである。レコード位置情報は、例えば、レコードの先頭のオフセットである。レコード位置情報は、例えば、レコードの最後の情報のオフセットでも良い。
レコード・インデックスレコード位置情報は、レコード・インデックスにおけるレコード・インデックスレコードの位置を特定する情報である。レコード・インデックスレコード位置情報は、例えば、レコード・インデックスにおけるレコード・インデックスレコードのオフセットである。
なお、レコード・インデックスにおいて、キー項目値がソートされていることは好適である。
また、レコード・インデックスレコードと配列インデックスレコードとは、対応付いていることは好適である。レコード・インデックスレコードと配列インデックスレコードとは、例えば、キー項目値により対応付いている。
2次インデックス格納部1124には、2次インデックスが格納される。2次インデックス格納部1124には、通常、データソースごとに、2次インデックスが格納される。つまり、2次インデックスは、通常、ソース識別子に対応付いている。なお、検索対象のデータソースが一つである場合、2次インデックスは、ソース識別子に対応付いている必要はない。
2次インデックスは、レコード・インデックスに高速にアクセスするためのインデックスである。2次インデックスは、データソースが有する2以上のレコードのうちの一部である1以上の各レコードに対応する情報である。2次インデックスは、レコードごとの2次インデックスレコードを有する。2次インデックスレコードは、キー項目値とレコード・インデックスレコード位置情報との組である。レコード・インデックスレコード位置情報は、レコード・インデックス内における箇所であり、レコード位置情報が存在する箇所を特定する情報である。キー項目値は、レコードが有するキー項目値である。
なお、2次インデックスにおけるキー項目値は、ソートされていることは好適である。
ソース・インデックス格納部1125には、ソース・インデックスが格納される。ソース・インデックスは、データソースごとのインデックスである。ソース・インデックスは、例えば、データソースごとのソース・インデックスレコードの集合である。
ソース・インデックスレコードは、例えば、ソース識別子と最小キー項目値と最大キー項目値との組である。最小キー項目値は、ソース識別子で識別されるデータソースが有する最小のキー項目値である。最大キー項目値は、ソース識別子で識別されるデータソースが有する最大のキー項目値である。かかる場合、通常、2以上の各データソースに、異なるレコードが格納されている。
ソース・インデックスレコードは、例えば、ソース識別子と最小属性識別子と最大属性識別子との組である。最小属性識別子は、ソース識別子で識別されるデータソースが有する最小の属性識別子である。最大属性識別子は、ソース識別子で識別されるデータソースが有する最大の属性識別子である。かかる場合、通常、2以上の各データソースに、異なる属性の属性値が格納されている。
ソース・インデックスレコードは、例えば、ソース識別子と最小キー項目値と最大キー項目値と最小属性識別子と最大属性識別子との組である。かかる場合、通常、2以上の各データソースに、一部のレコードの一部の属性の属性値が格納されている。
受付部12は、各種の指示や情報を受け付ける。各種の指示や情報とは、例えば、後述する検索条件、データソース、データソースを構成する一部の情報である。
ここで、受け付けとは、通常、端末装置3からの受信であるが、キーボードやマウス、タッチパネルなどの入力デバイスから入力された情報の受け付け、光ディスクや磁気ディスク、半導体メモリなどの記録媒体から読み出された情報の受け付けなどを含む概念であっても良い。
条件受付部121は、検索条件を受け付ける。検索条件は、例えば、1または2以上の属性識別子を含む。検索条件は、例えば、1または2以上のキー項目値を含む。検索条件は、例えば、1以上の属性識別子および1以上のキー項目値を含む。
処理部13は、各種の処理を行う。各種の処理は、例えば、インデックス生成部131、検索部132、インデックス更新部133が行う処理である。
処理部13は、受付部12がデータソースを受け付けた場合に、当該データソースをデータソース格納部111に蓄積する。その際、処理部13は、図示しない時計から最終更新時情報を取得し、当該最終更新時情報を当該データソースに対応付ける。
処理部13は、受付部12がデータソースを構成する一部の情報を受け付けた場合、当該一部の情報を用いて、データソースを更新する。その際、処理部13は、図示しない時計から最終更新時情報を取得し、当該最終更新時情報を当該データソースに対応付ける。
インデックス生成部131は、1または2以上の各データソースからインデックスを生成する。
配列インデックス生成部1311は、1以上の各データソースごとに、配列インデックスを生成し、配列インデックス格納部1121に蓄積する。
配列インデックス生成部1311は、データソースにおけるレコードごと、および1以上の属性値ごとに、属性位置情報を取得する。
配列インデックス生成部1311は、データソースにおけるすべての各レコードごとに、一部の各属性値の属性位置情報を有する配列インデックスレコードを取得し、当該1以上の配列インデックスレコードを有する配列インデックスを構成し、配列インデックス格納部1121に蓄積することは好適である。ただし、配列インデックス生成部1311は、データソースにおけるすべての各レコードごとに、すべての各各属性値の属性位置情報を有する配列インデックスレコードを取得し、当該1以上の配列インデックスレコードを有する配列インデックスを構成し、配列インデックス格納部1121に蓄積しても良い。
配列インデックスレコードは、レコードにおけるすべての属性値のうちの一部の属性値の属性位置情報のみを有する情報であることは好適である。なお、かかる一部の属性値の選択方法は問わない。一部の属性値は、例えば、所定の値ごと(例えば、1番目、5番目、9番目等の4つごと)に選択されることは好適であるが、ランダムに所定数だけ選択されても良い。
配列インデックス生成部1311は、データソースにおける2以上のレコードのうちの1以上の各レコードごと、および1以上の各属性値ごとに、属性位置情報を取得する。そして、配列インデックス生成部1311は、レコードごと、および属性値ごとの属性位置情報を有する配列インデックスを生成し、配列インデックス格納部1121に蓄積する。
配列インデックス生成部1311は、例えば、取得した属性位置情報を、レコード識別子またはキー項目値、および属性値識別子に対応付くように、配列インデックス格納部1121に蓄積する。
配列インデックス生成部1311は、通常、データソースを走査し、第一デリミタごとにレコードを認識し、当該レコードを走査し、第二デリミタごとに属性値を認識し、例えば、当該レコードの先頭から、各第二デリミタの次の位置を、各属性値の属性位置情報として取得する。
配列ラベル・インデックス生成部1312は、1以上の各データソースごとに、配列ラベル・インデックスを生成し、配列ラベル・インデックス格納部1122に蓄積する。
配列ラベル・インデックス生成部1312は、例えば、データソースから、2以上の各属性ごとに、属性値識別子と属性順番情報とを取得し、当該属性値識別子と属性順番情報との組である配列ラベル・インデックスレコードを取得し、当該2以上の配列ラベル・インデックスレコードを有する配列ラベル・インデックスを構成し、当該配列ラベル・インデックスを配列ラベル・インデックス格納部1122に蓄積する。
なお、配列ラベル・インデックス生成部1312は、属性値識別子キーとして配列ラベル・インデックスレコードをソートし、配列ラベル・インデックスを構成することは好適である。
また、配列インデックスレコードが、すべての属性値の属性位置情報を有する場合、配列ラベル・インデックスは不要である。
レコード・インデックス生成部1313は、データソースを参照し、データソースの2以上の各レコードのキー項目値とレコード位置情報とを有するレコード・インデックスレコードを、レコードごとに取得する。そして、レコード・インデックス生成部1313は、レコードごとのレコード・インデックスレコードの集合を有するレコード・インデックスを生成し、レコード・インデックス格納部1123に蓄積する。
レコード・インデックス生成部1313は、1以上の各レコード・インデックスレコードに、レコード・インデックス内におけるレコード・インデックスレコードの位置を特定するレコード・インデックスレコード位置情報を取得し、当該レコード・インデックスレコード位置情報を有するレコード・インデックスレコードを構成することは好適である。
なお、レコード・インデックス生成部1313は、キー項目値をキーとして該レコード・インデックスレコードをソートし、レコード・インデックスを構成することは好適である。
2次インデックス生成部1314は、データソースごとに、データソースが有する2以上のレコードのうちの一部である1以上の各レコードごとに、レコード・インデックスレコード位置情報とレコードのキー項目値との組である2次インデックスレコードを取得し、当該1以上の2次インデックスレコードを有する2次インデックスを構成し、2次インデックス格納部1124に蓄積する。
また、配列インデックスの属性値位置情報がデータソース内における位置を特定する情報である場合、レコード・インデックスは無くても良い。
2次インデックス生成部1314は、例えば、データソースごとに、データソースに対応するレコード・インデックスを参照し、当該レコード・インデックスが有する一部のレコードであり、2以上の各レコードが有するレコード・インデックスレコード位置情報とキー項目値との組である2次インデックスレコードを取得し、2以上の2次インデックスレコードを有する2次インデックスを生成し、2次インデックス格納部1124に蓄積する。
2次インデックスレコードは、一部のレコード・インデックスレコードに対応するが、その一部のレコード・インデックスレコードの選択方法は問わない。一部のレコード・インデックスレコードは、例えば、所定の値ごと(例えば、1番目、5番目、9番目等の4つごと)に選択されることは好適であるが、ランダムに所定数だけ選択されても良い。
なお、2次インデックスは、レコードの検索を高速にするが、無くても良い。
ソース・インデックス生成部1315は、2以上の各データソースごとに、ソース・インデックスレコードを取得し、2以上のソース・インデックスレコードを有するソース・インデックスを生成し、ソース・インデックス格納部1125に蓄積する。なお、ソース・インデックスレコードは、例えば、ソース識別子と最小キー項目値と最大キー項目値との組である。ソース・インデックスレコードは、例えば、ソース識別子と最小属性識別子と最大属性識別子との組である。ソース・インデックスレコードは、例えば、ソース識別子と最小キー項目値と最大キー項目値と最小属性識別子と最大属性識別子との組である。
なお、データソースが一つである場合、ソース・インデックス生成部1315は、不要である。
検索部132は、検索条件が有する属性識別子に対応する属性位置情報を、配列インデックスから取得し、当該属性位置情報を用いて、検索条件が有する属性識別子に対応する属性値を、キー項目値と2以上の属性値とを有する1または2以上のレコードを含むデータソースから取得する。
検索部132は、例えば、条件受付部121が受け付けた検索条件が有する属性識別子で識別される属性値の前に配置されている属性値を識別する属性識別子に対応する第一の属性位置情報と、検索条件が有する属性識別子で識別される属性値の後に配置されている属性値を識別する属性識別子に対応する第二の属性位置情報とを、配列インデックスから取得する。次に、検索部132は、当該第一の属性位置情報が特定する位置と、当該第二の属性位置情報が特定する位置の間に存在する属性値であり、検索条件が有する属性識別子に対応する属性値を、データソースから取得する。
検索部132は、例えば、条件受付部121が受け付けた検索条件が有する属性識別子に対応する属性順番情報を配列ラベル・インデックスから取得する。次に、検索部132は、当該属性順番情報を用いて、検索条件が有する属性識別子に対応する属性位置情報を、配列インデックスから取得する。次に、検索部132は、当該属性位置情報を用いて、検索条件が有する属性識別子に対応する属性値を、データソースから取得する。
検索部132は、例えば、条件受付部121が受け付けた検索条件が有する属性識別子に対応する属性順番情報を配列ラベル・インデックスから取得する。検索部132は、当該属性順番情報が示す順番の前に配置されている属性値を識別する属性識別子に対応する第一の属性位置情報と、当該属性順番情報が示す順番の後に配置されている属性値を識別する属性識別子に対応する第二の属性位置情報とを、配列インデックスから取得する。次に、検索部132は、当該第一の属性位置情報が特定する位置と、当該第二の属性位置情報が特定する位置の間に存在する属性値であり、検索条件が有する属性識別子に対応する属性値を、データソースから取得する。
検索部132は、例えば、検索条件が有するキー項目値と対になるレコード位置情報をレコード・インデックスから取得する。次に、検索部132は、当該レコード位置情報が特定する位置に対応するレコードを決定し、当該レコードの中の属性値であり、検索条件が有する属性識別子に対応する属性値を、データソースから取得する。なお、検索条件において属性識別子が示されない場合、検索条件が有する属性識別子は、すべての属性識別子である、と考えても良い。
検索部132は、例えば、検索条件が有するキー項目値を挟む2つのキー項目値を2次インデックスから取得する。次に、検索部132は、取得した2つの各キー項目値と対になる第一のレコード・インデックスレコード位置情報と第二のレコード・インデックスレコード位置情報とを、2次インデックスから取得する。次に、検索部132は、当該第一のレコード・インデックスレコード位置情報と当該第二のレコード・インデックスレコード位置情報との間のレコード・インデックスレコードを検索し、検索条件が有するキー項目値を含むレコード・インデックスレコードを決定し、当該レコード・インデックスレコードの中のレコード位置情報を取得する。次に、検索部132は、当該レコード位置情報が特定する位置に対応するレコードの中の属性値であり、検索条件が有する属性識別子に対応する属性値を、データソースから取得する。なお、検索部132は、検索条件が有する属性識別子に対応する属性値の属性位置情報を、配列インデックスを用いて取得し、当該属性位置情報が特定する位置の属性値をデータソースから取得することは好適である。
また、レコード・インデックスにおいて、キー項目値がソートされている場合、検索部132は、二分探索により、検索条件が有するキー項目値を含むレコード・インデックスレコードを決定することは好適であるが、シーケンシャルサーチでも良い。
検索部132は、例えば、検索条件が有するキー項目値と一致する、またはキー項目値を間に挟む最小キー項目値と最大キー項目値と対になるソース識別子を、ソース・インデックスから取得する。次に、検索部132は、当該ソース識別子により識別されるデータソースから、検索条件が有する属性識別子に対応する属性位置情報を、配列インデックスから取得する。次に、検索部132は、当該属性位置情報を用いて、レコードの中の属性値であり、検索条件が有する属性識別子に対応する属性値を取得する。
検索部132は、例えば、検索条件が有する属性識別子と一致する、または属性識別子を間に挟む最小属性識別子と最大属性識別子と対になるソース識別子を、ソース・インデックスから取得する。検索部132は、当該ソース識別子により識別されるデータソースに対応する配列インデックスから、検索条件が有する属性識別子に対応する属性位置情報を取得する。検索部132は、当該属性位置情報を用いて、当該ソース識別子により識別されるデータソースの中のレコードの中の属性値であり、検索条件が有する属性識別子に対応する属性値を取得する。
検索部132は、例えば、検索条件が有するキー項目値と検索条件が有する属性識別子とに対応するソース識別子を、ソース・インデックスから取得する。検索部132は、当該ソース識別子により識別されるデータソースに対応する2次インデックスから、検索条件が有するキー項目値を挟む2つのキー項目値を2次インデックスから取得する。次に、検索部132は、取得した2つの各キー項目値と対になる第一のレコード・インデックスレコード位置情報と第二のレコード・インデックスレコード位置情報とを、2次インデックスから取得する。次に、検索部132は、当該第一のレコード・インデックスレコード位置情報と当該第二のレコード・インデックスレコード位置情報との間のレコード・インデックスレコードを検索し、検索条件が有するキー項目値を含むレコード・インデックスレコードを決定し、当該レコード・インデックスレコードの中のレコード位置情報を取得する。また、検索部132は、検索条件が有する属性識別子に対応する属性順番情報を配列ラベル・インデックスから取得する。次に、検索部132は、当該属性順番情報を用いて、検索条件が有する属性識別子に対応する属性位置情報を、配列インデックスから取得する。次に、検索部132は、取得したレコード位置情報により特定されるレコードの中の属性値であり、当該属性位置情報が特定する属性値をデータソースから取得する。
インデックス更新部133は、予め決められた条件を満たす場合に、データソースから取得した最終更新時情報が示す最終更新時が、1以上の各種類のインデックスに対応する生成時情報が示す生成時より後か否かを判断し、後である場合に、インデックス生成部131を動作させて、1以上の各種類のインデックスを構成する。また、インデックス更新部133は、通常、構成した1以上の各種類のインデックスを、インデックス格納部112の古いインデックスに上書きする。なお、1以上の各種類のインデックスは、配列インデックス、配列ラベル・インデックス、レコード・インデックス、2次インデックス、ソース・インデックスのうちの1種類以上である。また、予め決められた条件は、例えば、ユーザからの指示を受け付けたこと、予め決められた時刻になったこと、データソースが更新されたことである。
出力部14は、各種の情報を取得する。各種の情報は、例えば、後述する検索結果である。なお、ここでの出力とは、通常、端末装置3への送信であるが、ディスプレイへの表示、プロジェクターを用いた投影、プリンタでの印字、記録媒体への蓄積、他の処理装置や他のプログラムなどへの処理結果の引渡しなどを含む概念であっても良い。
結果出力部141は、検索部132が取得した属性値を含む検索結果を出力する。検索結果は、通常、属性値を有する。
データソース管理装置2は、1以上のデータソースを管理する。データソース管理装置2は、データソース格納部111を具備する。
端末装置3を構成する端末格納部31には、各種の情報が格納される。各種の情報は、例えば、検索条件、データソースである。
端末受付部32は、各種の指示や情報を受け付ける。各種の指示や情報は、例えば、検索条件、データソース、データソースの一部の情報である。
なお、ここでの受け付けとは、キーボードやマウス、タッチパネルなどの入力デバイスから入力された情報の受け付け、有線もしくは無線の通信回線を介して送信された情報の受信、光ディスクや磁気ディスク、半導体メモリなどの記録媒体から読み出された情報の受け付けなどを含む概念である。
端末処理部33は、各種の処理を行う。各種の処理とは、例えば、端末受付部32が受け付けた指示や情報を、送信するデータ構造の指示や情報にする処理である。各種の処理とは、例えば、端末受信部35が受信した情報を、出力するデータ構造の情報にする処理である。
端末送信部34は、各種の情報や指示を送信する。端末送信部34は、通常、各種の情報や指示を検索装置1に送信する。各種の情報や指示は、例えば、検索条件、データソースである。
端末受信部35は、各種の情報を受信する。端末受信部35は、各種の情報を検索装置1から受信する。各種の情報は、例えば、検索結果である。
端末出力部36は、各種の情報を出力する。各種の情報は、例えば、検索結果である。
格納部11、データソース格納部111、インデックス格納部112、配列インデックス格納部1121、配列ラベル・インデックス格納部1122、レコード・インデックス格納部1123、2次インデックス格納部1124、ソース・インデックス格納部1125、および端末格納部31は、不揮発性の記録媒体が好適であるが、揮発性の記録媒体でも実現可能である。
格納部11等に情報が記憶される過程は問わない。例えば、記録媒体を介して情報が格納部11等で記憶されるようになってもよく、通信回線等を介して送信された情報が格納部11等で記憶されるようになってもよく、あるいは、入力デバイスを介して入力された情報が格納部11等で記憶されるようになってもよい。
受付部12、条件受付部121、および端末受信部35は、通常、無線または有線の通信手段で実現されるが、放送を受信する手段で実現されても良い。
処理部13、インデックス生成部131、検索部132、インデックス更新部133、配列インデックス生成部1311、配列ラベル・インデックス生成部1312、レコード・インデックス生成部1313、2次インデックス生成部1314、ソース・インデックス生成部1315、および端末処理部33は、通常、プロセッサやメモリ等から実現され得る。処理部13等の処理手順は、通常、ソフトウェアで実現され、当該ソフトウェアはROM等の記録媒体に記録されている。但し、ハードウェア(専用回路)で実現しても良い。なお、プロセッサは、CPU、MPU、GPU等であり、その種類は問わない。
出力部14、結果出力部141、および端末送信部34は、通常、無線または有線の通信手段で実現されるが、放送手段で実現されても良い。
端末受付部32は、タッチパネルやキーボード等の入力手段のデバイスドライバーや、メニュー画面の制御ソフトウェア等で実現され得る。
端末出力部36は、ディスプレイやスピーカー等の出力デバイスを含むと考えても含まないと考えても良い。端末出力部36は、出力デバイスのドライバーソフトまたは、出力デバイスのドライバーソフトと出力デバイス等で実現され得る。
次に、検索システムAの動作例について説明する。まず、検索装置1の動作例について、図4のフローチャートを用いて説明する。
(ステップS401)インデックス生成部131は、インデックスを生成するタイミングであるか否かを判断する。インデックスを生成するタイミングであればステップS402に行き、インデックスを生成するタイミングでなければステップS406に行く。
(ステップS402)インデックス生成部131は、カウンタiに1を代入する。
(ステップS403)インデックス生成部131は、インデックスを生成する対象のi番目のデータソースが存在するか否かを判断する。i番目のデータソースが存在する場合はステップS404に行き、i番目のデータソースが存在しない場合はステップS401に戻る。
(ステップS404)インデックス生成部131は、i番目のデータソースに対応するインデックスを生成する。インデックス生成処理の例について、図5のフローチャートを用いて説明する。
(ステップS405)インデックス生成部131は、カウンタiを1、インクリメントする。ステップS403に戻る。
(ステップS406)インデックス更新部133は、インデックスを更新するタイミングであるか否かを判断する。インデックスを更新するタイミングであればステップS407に行き、インデックスを更新するタイミングでなければステップS414に行く。
(ステップS407)インデックス更新部133は、カウンタiに1を代入する。
(ステップS408)インデックス更新部133は、i番目のデータソースが存在するか否かを判断する。i番目のデータソースが存在する場合はステップS409に行き、i番目のデータソースが存在しない場合はステップS401に戻る。
(ステップS409)インデックス更新部133は、i番目のデータソースの属性値である最終更新時情報を取得する。
(ステップS410)インデックス更新部133は、i番目のデータソースに対応するインデクス(例えば、配列インデックス)の生成時情報を配列インデックス格納部1121から取得する。
(ステップS411)インデックス更新部133は、ステップS409で取得した最終更新時情報が示す時が、ステップS410で取得した生成時情報が示す時より新しいか否かを判断する。新しい場合はステップS412に行き、新しくない場合はステップS413に行く。
(ステップS412)インデックス更新部133は、インデックス生成部131に動作の指示をする。その結果、インデックス生成部131は、インデックスを生成し、i番目のデータソースに対応付けて、インデックスを蓄積する。かかる処理により、i番目のデータソースに対応するインデックスが更新される。なお、インデックス生成処理の例は、図5のフローチャートである。
(ステップS413)カウンタiを1、インクリメントする。ステップS408に戻る。
(ステップS414)条件受付部121は、検索条件を受け付けたか否かを判断する。検索条件を受け付けた場合はステップS415に行き、検索条件を受け付けなかった場合はステップS401に戻る。
(ステップS415)検索部132は、検索条件を用いて検索を行う。かかる検索処理の例について、図11フローチャートを用いて説明する。
(ステップS416)結果出力部141は、ステップS415で取得された検索結果を出力する。ステップS401に戻る。
なお、図4のフローチャートにおいて、電源オフや処理終了の割り込みにより処理は終了する。
次に、ステップS404のインデックス生成処理の例について、図5のフローチャートを用いて説明する。
(ステップS501)ソース・インデックス生成部1315は、ソース・インデックスを生成する。かかるソース・インデックス生成処理の例について、図6フローチャートを用いて説明する。
(ステップS502)配列ラベル・インデックス生成部1312は、配列ラベル・インデックスを生成する。かかる配列ラベル・インデックス生成処理の例について、図7フローチャートを用いて説明する。
(ステップS503)配列インデックス生成部1311は、配列インデックスを生成する。かかる配列インデックス生成処理の例について、図8フローチャートを用いて説明する。
(ステップS504)レコード・インデックス生成部1313は、レコード・インデックスを生成する。かかるレコード・インデックス生成処理の例について、図9フローチャートを用いて説明する。
(ステップS505)2次インデックス生成部1314は、2次インデックスを生成する。かかる2次インデックス生成処理の例について、図10フローチャートを用いて説明する。
なお、図5のフローチャートにおいて、例えば、レコード・インデックスと配列インデックスとは、レコードごとに、一緒に生成されても良い。つまり、各種のインデックスの生成の手順や順序等は問わない。
次に、ステップS501のソース・インデックス生成処理の例について、図6フローチャートを用いて説明する。
(ステップS601)ソース・インデックス生成部1315は、2以上の各データソースに、異なるレコードが存在するか否かを判断する。異なるレコードが存在する場合はステップS602に行き、異なるレコードが存在しない場合はステップS604に行く。
(ステップS602)ソース・インデックス生成部1315は、インデックスの生成の対象のデータソースを参照し、当該データソースの最小キー項目値を取得する。
(ステップS603)ソース・インデックス生成部1315は、インデックスの生成の対象のデータソースを参照し、当該データソースの最大キー項目値を取得する。
(ステップS604)ソース・インデックス生成部1315は、2以上の各データソースに、異なる属性の属性値が存在するか否かを判断する。異なる属性の属性値が存在する場合はステップS605に行き、異なる属性の属性値が存在しない場合はステップS607に行く。
(ステップS605)ソース・インデックス生成部1315は、インデックスの生成の対象のデータソースを参照し、当該データソースの最小属性識別子取得する。
(ステップS606)ソース・インデックス生成部1315は、インデックスの生成の対象のデータソースを参照し、当該データソースの最大属性識別子取得する。
(ステップS607)ソース・インデックス生成部1315は、インデックスの生成の対象のデータソースのソース識別子を取得する。
(ステップS608)ソース・インデックス生成部1315は、ソース・インデックスレコードを構成する。ソース・インデックスレコードは、例えば、最小キー項目値と最大キー項目値とを有する。ソース・インデックスレコードは、例えば、最小属性識別子と最大属性識別子とを有する。ソース・インデックスレコードは、例えば、最小キー項目値と最大キー項目値と最小属性識別子と最大属性識別子とを有する。ソース・インデックスレコードは、ソース識別子に対応している。なお、ソース識別子に対応していることは、ソース識別子を有することでも良いことは言うまでもない。
(ステップS609)ソース・インデックス生成部1315は、ステップS608で構成したソース・インデックスレコードをソース・インデックス格納部1125に追記する。上位処理にリターンする。
次に、ステップS502の配列ラベル・インデックス生成処理の例について、図7フローチャートを用いて説明する。
(ステップS701)配列ラベル・インデックス生成部1312は、カウンタiに1を代入する。
(ステップS702)配列ラベル・インデックス生成部1312は、インデックスの生成の対象のデータソースのi番目の属性の属性識別子を取得する。
なお、配列ラベル・インデックス生成部1312は、例えば、インデックスの生成の対象のデータソースの中の1行目のレコードのi番目の属性の属性識別子を取得する。配列ラベル・インデックス生成部1312は、例えば、格納部11に格納されているデータソーススキーマ情報からi番目の属性の属性識別子を取得しても良い。なお、データソーススキーマ情報とは、データソースの構造を特定する情報であり、例えば、2以上の属性識別子を有する。
(ステップS703)配列ラベル・インデックス生成部1312は、ステップS702でi番目の属性の属性識別子を取得できたか否かを判断する。取得できた場合はステップS704に行き、取得できなかった場合は上位処理にリターンする。
(ステップS704)配列ラベル・インデックス生成部1312は、ステップS702で取得したi番目の属性の属性識別子と、i(属性順番情報)とを有する配列ラベル・インデックスレコードを構成する。なお、配列ラベル・インデックスレコードは、配列ラベル・インデックスを構成する情報である。
(ステップS705)配列ラベル・インデックス生成部1312は、ステップS704で構成した配列ラベル・インデックスレコードを、インデックスの生成の対象のデータソースに対応付けて、配列ラベル・インデックス格納部1122に追記する。
(ステップS706)配列ラベル・インデックス生成部1312は、カウンタiを1、インクリメントする。ステップS702に戻る。
なお、図7のフローチャートにおいて、配列ラベル・インデックスレコードを、属性識別子をキーとしてソートし、配列ラベル・インデックスを構成することは好適である。
次に、ステップS503の配列インデックス生成処理の例について、図8フローチャートを用いて説明する。
(ステップS801)配列インデックス生成部1311は、カウンタiに1を代入する。
(ステップS802)配列インデックス生成部1311は、インデックスの生成の対象のデータソースの中に、i番目のレコードが存在するか否かを判断する。i番目のレコードが存在する場合はステップS803に行き、i番目のレコードが存在しない場合は上位処理にリターンする。
(ステップS803)配列インデックス生成部1311は、カウンタjに1を代入する。
(ステップS804)配列インデックス生成部1311は、インデックスの生成の対象のデータソースに、j番目の属性が存在するか否かを判断する。j番目の属性が存在する場合はステップS805に行き、j番目の属性が存在しない場合はステップS809に行く。
(ステップS805)配列インデックス生成部1311は、j番目の属性を配列インデックスに使用するか否かを判断する。j番目の属性を配列インデックスに使用する場合はステップS806に行き、使用しない場合はステップS808に行く
(ステップS806)配列インデックス生成部1311は、i番目のレコードのj番目の属性の属性値の属性位置情報を、インデックスの生成の対象のデータソースから取得する。
(ステップS807)配列インデックス生成部1311は、ステップS806で取得した属性位置情報を、配列インデックスレコードのバッファに追記する。
(ステップS808)配列インデックス生成部1311は、カウンタjを1、インクリメントする。ステップS804に戻る。
(ステップS809)配列インデックス生成部1311は、配列インデックスレコードのバッファの配列インデックスレコードを、配列インデックス格納部1121に追記する。
(ステップS810)配列インデックス生成部1311は、カウンタiを1、インクリメントする。ステップS802に戻る。
次に、ステップS504のレコード・インデックス生成処理の例について、図9フローチャートを用いて説明する。
(ステップS901)レコード・インデックス生成部1313は、カウンタiに1を代入する。
(ステップS902)レコード・インデックス生成部1313は、インデックスの生成の対象のデータソースの中に、i番目のレコードが存在するか否かを判断する。i番目のレコードが存在する場合はステップS903に行き、i番目のレコードが存在しない場合は上位処理にリターンする。
(ステップS903)レコード・インデックス生成部1313は、インデックスの生成の対象のデータソースを参照し、i番目のレコードのレコード位置情報を取得する。
(ステップS904)レコード・インデックス生成部1313は、インデックスの生成の対象のデータソースを参照し、i番目のレコードのキー項目値を取得する。
(ステップS905)レコード・インデックス生成部1313は、i番目のレコード・インデックスレコードの、レコード・インデックス内における位置情報であるレコード・インデックスレコード位置情報を取得する。
(ステップS906)レコード・インデックス生成部1313は、ステップS903で取得したレコード位置情報、ステップS904で取得したキー項目値、およびステップS905で取得したレコード・インデックスレコード位置情報を有するi番目のレコード・インデックスレコードを構成する。
(ステップS907)レコード・インデックス生成部1313は、ステップS906で構成したレコード・インデックスレコードを、レコード・インデックス格納部1123に追記する。
(ステップS908)レコード・インデックス生成部1313は、カウンタiを1、インクリメントする。ステップ902に戻る。
なお、図9のフローチャートにおいて、レコード・インデックス生成部1313は、キー項目値をキーとして、レコード・インデックスレコードをソートすることは好適である。かかる場合、レコード・インデックス生成部1313は、レコード・インデックスレコードごとに、ソートされた状態のレコード・インデックスレコード位置情報を取得することは言うまでもない。
次に、ステップS505の2次インデックス生成処理の例について、図10フローチャートを用いて説明する。
(ステップS1001)2次インデックス生成部1314は、カウンタiに1を代入する。
(ステップS1002)2次インデックス生成部1314は、レコード・インデックスの中に、i番目のレコード・インデックスレコードが存在するか否かを判断する。i番目のレコード・インデックスレコードが存在する場合はステップS1003に行き、存在しない場合は上位処理にリターンする。
(ステップS1003)2次インデックス生成部1314は、i番目のレコード・インデックスレコードを、2次インデックスに使用するか否かを判断する。2次インデックスに使用する場合はステップS1004に行き、2次インデックスに使用しない場合はステップS1006に行く。
なお、2次インデックス生成部1314は、すべてのレコード・インデックスレコードのうちの一部のレコード・インデックスレコードを使用する。2次インデックス生成部1314は、例えば、すべてのレコード・インデックスレコードの番号をN(Nは2以上の自然数)で割った場合の余りの値がM(Mは整数,0<=M<N−1)の番号に対応するレコード・インデックスレコードを使用する、と判断する。また、2次インデックス生成部1314は、例えば、予め決められている一部のレコード・インデックスレコードを使用する、と判断する。
(ステップS1004)2次インデックス生成部1314は、i番目のレコード・インデックスレコードから、キー項目値とレコード・インデックスレコード位置情報とを取得し、当該情報を有する2次インデックスレコードを構成する。
(ステップS1005)2次インデックス生成部1314は、ステップS1004で構成した2次インデックスレコードを2次インデックス格納部1124に追記する。
(ステップS1006)2次インデックス生成部1314は、カウンタiを1、インクリメントする。ステップ1002に戻る。
なお、図10のフローチャートにおいて、2次インデックスレコードは、キー項目値をキーとしてソートされていることは好適である。
次に、ステップS415の検索処理の例について、図11フローチャートを用いて説明する。
(ステップS1101)検索部132は、受け付けられた検索条件に対応する1以上の属性識別子と1以上のキー項目値を取得する。なお、1以上の属性識別子は、検索結果として取得する属性値を特定する。1以上のキー項目値は、検索結果として情報を取得する対象のレコードを特定する。つまり、検索部132は、ここで取得した1以上のキー項目値のレコードの中の属性値であり、ここで取得した1以上の各属性識別子で識別される属性値を取得することとなる。
(ステップS1102)検索部132は、ソース・インデックスを参照し、ステップS1101で取得した1以上の属性識別子と1以上のキー項目値に対応する1以上のソース識別子を取得する。ここで、検索部132は、取得した1以上の各ソース識別子に、当該ソース識別子で識別されるデータソースに含まれる属性値の1以上の属性識別子と、当該ソース識別子で識別されるデータソースに含まれるレコードの1以上のキー項目値とを対応付ける。
(ステップS1103)検索部132は、カウンタiに1を代入する。
(ステップS1104)検索部132は、ステップS1102で取得した1以上のソース識別子の中に、i番目のソース識別子が存在するか否かを判断する。i番目のソース識別子が存在する場合はステップS1105に行き、存在しない場合はステップS1118に行く。
(ステップS1105)検索部132は、カウンタjに1を代入する。
(ステップS1106)検索部132は、ステップS1102でi番目のソース識別子に対応付けられた1以上のキー項目値の中に、j番目のキー項目値が存在するか否かを判断する。j番目のキー項目値が存在する場合はステップS1107に行き、存在しない場合はステップS1117に行く。
(ステップS1107)検索部132は、i番目のソース識別子に対応する2次インデックスを参照し、j番目のキー項目値に対応する第一のレコード・インデックスレコード位置情報と第二のレコード・インデックスレコード位置情報とを取得する。なお、第一のレコード・インデックスレコード位置情報は、j番目のキー項目値より小さなキー項目値のうちの最大のキー項目値と対になるレコード・インデックスレコード位置情報である。第二のレコード・インデックスレコード位置情報が、j番目のキー項目値より大きなキー項目値のうちの最小のキー項目値と対になるレコード・インデックスレコード位置情報である。また、ここで、検索部132は、j番目のキー項目値と対になる一つのレコード・インデックスレコード位置情報を2次インデックスから取得する場合もあり得る。
(ステップS1108)ステップS1107で第一のレコード・インデックスレコード位置情報と第二のレコード・インデックスレコード位置情報とを取得した場合、検索部132は、当該第一のレコード・インデックスレコード位置情報と第二のレコード・インデックスレコード位置情報との間のレコード・インデックスレコードを検索し(例えば、二分探索、またはシーケンシャルサーチ)、j番目のキー項目値を検出する。次に、検索部132は、当該j番目のキー項目値と対になるレコード位置情報を、レコード・インデックスから取得する。
また、ステップS1107で一つのレコード・インデックスレコード位置情報を取得した場合、検索部132は、当該レコード・インデックスレコード位置情報と対になるレコード位置情報を、レコード・インデックスから取得する。
(ステップS1109)検索部132は、カウンタkに1を代入する。
(ステップS1110)検索部132は、i番目のソース識別子に対応するk番目の属性識別子が存在するか否かを判断する。k番目の属性識別子が存在する場合はステップS1111に行き、存在しない場合はステップS1116に行く。
(ステップS1111)検索部132は、i番目のソース識別子に対応する配列ラベル・インデックスを参照し、k番目の属性識別子と対になる属性順番情報を、当該配列ラベル・インデックスから取得する。
(ステップS1112)検索部132は、i番目のソース識別子に対応する配列インデックスを参照し、当該配列インデックス内に、ステップS1111で取得した属性順番情報と一致する属性順番情報が存在するか否かを判断する。属性順番情報と一致する属性順番情報が存在する場合は、検索部132は、当該属性順番情報と対になり、かつj番目のキー項目値と対になる属性位置情報を当該配列インデックスから取得する。
属性順番情報と一致する属性順番情報が存在しない場合は、検索部132は、当該属性順番情報を挟む2つの属性順番情報を取得する。つまり、検索部132は、当該属性順番情報より小さい値の属性順番情報であり、当該属性順番情報との差が最も小さい第一の属性順番情報を取得する。また、検索部132は、当該属性順番情報より大きい値の属性順番情報であり、当該属性順番情報との差が最も小さい第二の属性順番情報を取得する。なお、第一の属性順番情報と第二の属性順番情報とは、当該属性順番情報を挟む情報である。次に、検索部132は、第一の属性順番情報と対になり、かつj番目のキー項目値と対になる属性位置情報を当該配列インデックスから取得する。また、検索部132は、第二の属性順番情報と対になり、かつj番目のキー項目値と対になる属性位置情報を当該配列インデックスから取得する。
(ステップS1113)ステップS1112で一つの属性位置情報を取得した場合は、検索部132は、ステップS1108で取得したj番目のキー項目値と対になるレコード位置情報が示す位置のレコードの中から、ステップS1112で取得した一つの属性位置情報が示す位置の属性値を、i番目のソース識別子で識別されるデータソースから取得する。
また、ステップS1112で2つの属性位置情報を取得した場合は、検索部132は、ステップS1108で取得したj番目のキー項目値と対になるレコード位置情報が示す位置のレコードの中から、2つの各属性位置情報が特定する位置の属性値を、例えば、シーケンシャルサーチにより検査し、k番目の属性識別子と対になる属性順番情報の順番に存在する属性値を、i番目のソース識別子で識別されるデータソースから取得する。
(ステップS1114)検索部132は、j番目のキー項目値とk番目の属性識別子とに対応付けて、ステップS1113で取得した属性値を、図示しないバッファに一時蓄積する。
(ステップS1115)検索部132は、カウンタkを1、インクリメントする。ステップ1110に戻る。
(ステップS1116)検索部132は、カウンタjを1、インクリメントする。ステップ1106に戻る。
(ステップS1117)検索部132は、カウンタiを1、インクリメントする。ステップ1104に戻る。
(ステップS1118)検索部132は、図示しないバッファに一時蓄積された1以上の属性値を含む検索結果を構成する。上位処理にリターンする。なお、検索結果の構成方法は問わない。検索結果に含まれる属性値に対応する属性識別子は、属性値に対応付くことが明示される態様で、検索結果に含まれることは好適である。また、検索結果は、j番目のキー項目値を含むことは好適である。
次に、データソース管理装置2の動作例について説明する。データソース管理装置2は、検索装置1からのアクセスに応じて、データソース格納部111のデータソースを読み出し、検索装置1に送信する。なお、かかる場合、データソース管理装置2は、データソースの一部のみを読み出し、送信しても良い。
次に、端末装置3の動作例について説明する。端末装置3の端末受付部32は、検索条件を受け付ける。次に、端末処理部33は、送信する検索条件を構成する。次に、端末送信部34は、当該検索条件を検索装置1に送信する。そして、検索条件の送信に応じて、端末受信部35は、検索結果を受信する。次に、端末処理部33は、受信された検索結果を用いて、出力する検索結果を構成する。次に、端末出力部36は、当該検索結果を出力する。
以下、本実施の形態における検索システムAの具体的な動作例について説明する。
今、検索装置1のデータソース格納部111、またはデータソース管理装置2のデータソース格納部111に、図12に示す3つのデータソース(1201、1202、1203)を含む3以上のデータソースが格納されている、とする。なお、3つの各データソースは、ここでは、1つのファイルである、とする。
そして、図12のデータソースは、ヘッダー・レコード、ラベル・レコード、多数のレコードを有する。ラベル・レコード、および各レコードは、第一デリミタにより区切られている。また、第一デリミタは、ここでは、例えば、リターンコードである。
ヘッダー・レコードは、ファイルのいわゆるヘッダーであり、1以上のソース属性値を有する。ソース属性値は、ここでは、ソース識別子、レポート番号、最終更新時情報である。ソース識別子は、図12では、File Nameであり、値は「File1」である。レポート番号は、当該データソースの出所を識別するための番号で、値は「A12345」である。最終更新時情報は、図12では、Dateであり、値は「XXXX−XX−XX」である。
ラベル・レコードは、例えば、ファイルの1行目である。なお、ヘッダー・レコードがファイルの1行目である場合は、ラベル・レコードは、ファイルの2行目である。ラベル・レコードは、項目ラベルの集合と、属性識別子の集合である。項目ラベルは、キー項目のラベルまたは明細項目のラベルである。キー項目は、レコードのキーとなる属性であり、ここでは「PID(パーソナルID)」である。「PID」は、ユーザを識別するIDである。明細項目は、「PID」に対応するユーザの属性値で、ここでは、明細項目は、「No.」「Age」を含む。「No.」は、レコードIDであり、その値は、図12の1201の[1][2][3]等である。また、「No.」の下の(Pos.)は、各レコードのレコード位置情報(ここでは、データソース内のレコードの先頭のオフセット)である。「Age」は、ユーザの年齢である。属性識別子は、図12では、「TestB」「TestE」「TestC」等である。図12では、属性識別子の下に属性順番情報が記載されている。属性順番情報は、属性識別子の下の[1][2][3]等である。
図12の各レコードは、キー項目値、明細項目値、属性値を有する。キー項目値は、キー項目の値であり、ここでは、各ユーザのPID(例えば、236,029)である。なお、どの値をキー項目値とするかはインデックス生成のためのパラメータとして指定できることが好適であり、他の値(例えば、「Age」「PIDとAgeの組」)でも良く、また2以上のキー項目値を持つことも可能である。明細項目値は、ここでは、例えば、「No.」の値、「Age」の値である。「No.」の値は、ここでは、[1][2]等である。「No.」の値([1][2][3]等)の下に存在する値(例えば、(1)(121)(241)等)は、各レコードのレコード位置情報である。
レコード識別子[1]に対応するレコードの属性値は、0.11、0.4、0.57等である。また、図12において、属性値(0.11、0.4、0.57等)の下には、各属性値の属性値位置情報((57)(62)(73)等)が表記されている。
ここでのデータソースは、遺伝子・ゲノム情報の集合を含む、とする。また、一般的な遺伝子・ゲノム情報を取り扱うデータでは、遺伝子の塩基配列やタンパク質のアミノ酸配列などのデータが含むまれ、1レコードの長さが、例えば、数GBになることもある。また、1レコードの中の属性値の数が膨大になり、データサイズは巨大になる場合が多い。また、遺伝子・ゲノム情報を取り扱うデータは、フラットファイル(一般的なテキストファイル)に比較的単純なレイアウトで保存・流通されているケースが多く、本具体例におけるデータソース(図12参照)は、その例である。
かかる状況で、以下の3つの具体例について説明する。具体例1は、インデックスの生成処理の例である。具体例2は、ソース・インデックスが最小キー項目値と最大キー項目値との組を有し、最小属性識別子と最大属性識別子との組を有さない場合における検索処理の例である。具体例3は、ソース・インデックスが最小キー項目値と最大キー項目値と最小属性識別子と最大属性識別子との組を有する場合における検索処理の例である。
(具体例1)
検索装置1のインデックス生成部131が、各種のインデックスの生成処理の例について、図13を用いて説明する。ここでは、キー項目は「PID」である、とする。
(1)ソース・インデックス生成処理
ソース・インデックス生成部1315は、ファイル「データソース1301」にアクセスし、データソース1301のソース識別子(ここでは、ファイル名)「file1」を取得する。また、ソース・インデックス生成部1315は、データソース1301をオープンする。次に、ソース・インデックス生成部1315は、データソース1301のPIDの中の最小のPIDである最小キー項目値「029」と最大のPIDである最大キー項目値「451」とを取得する。なお、データソース1301において、PIDがソートされている場合は、ソース・インデックス生成部1315は、最初のPIDと最後のPIDとを取得する。PIDがソートされていない場合は、ソース・インデックス生成部1315は、シーケンシャルにPIDを検査し、最小キー項目値と最大キー項目値とをデータソース1301から取得する。
また、ソース・インデックス生成部1315は、データソース1301のラベル・レコードの属性値識別子の中の最小属性識別子「TestA」と最大属性識別子「TestE」とを取得する。なお、データソース1301において、属性識別子がソートされている場合は、ソース・インデックス生成部1315は、ラベル・レコードから、最初の属性識別子と最後の属性識別子とを取得する。属性識別子がソートされていない場合は、ソース・インデックス生成部1315は、シーケンシャルに属性識別子を検査し、最小属性識別子と最大属性識別子とをラベル・レコードから取得する。
次に、ソース・インデックス生成部1315は、取得したソース識別子、最小キー項目値、最大キー項目値、最小属性識別子、および最大属性識別子から、ソース・インデックスレコード「file1,029,451,TestA,TestE」を構成し、ソース・インデックス格納部1125に蓄積する。
ソース・インデックス生成部1315は、他のデータソース(ファイル「file2」「file3」等)に対しても、同様に、ソース・インデックスレコードを構成し、ソース・インデックス格納部1125に蓄積する。
以上の処理により、図13の1302のソース・インデックスがソース・インデックス格納部1125に蓄積される。
(2)配列ラベル・インデックス生成処理
配列ラベル・インデックス生成部1312は、ファイル「データソース1301」にアクセスし、データソース1301のソース識別子(ファイル名)「file1」を取得する。また、ソース・インデックス生成部1315は、データソース1301をオープンする。
次に、配列ラベル・インデックス生成部1312は、データソース1301のラベル・インデックス内に配置されている順に、属性識別子をその順番である属性順番情報と共に取得する。そして、属性識別子ごとに、属性識別子と属性順番情報との組である配列ラベル・インデックスレコードを構成する。
次に、配列ラベル・インデックス生成部1312は、属性識別子をキーとして配列ラベル・インデックスレコードを、例えば、昇順にソートする。そして、配列ラベル・インデックス生成部1312は、ソートされた配列ラベル・インデックスレコードを、配列ラベル・インデックス格納部1122に蓄積する。
配列ラベル・インデックス生成部1312は、他のデータソース(ファイル「file2」「file3」等)に対しても、同様に、配列ラベル・インデックスを構成し、配列ラベル・インデックス格納部1122に蓄積する。
以上の処理により、図13の1303の配列ラベル・インデックスが配列ラベル・インデックス格納部1122に蓄積される。
(3)配列インデックス生成処理
配列インデックス生成部1311は、ファイル「データソース1301」にアクセスし、データソース1301のソース識別子(ファイル名)「file1」を取得する。また、ソース・インデックス生成部1315は、データソース1301をオープンする。
配列インデックス生成部1311は、例えば、1番目、4番目、7番目といった具合に、所定数(ここでは、3つ)飛ばしで、データソース1301の属性順番情報を取得する。また、配列インデックス生成部1311は、例えば、レコードごとに、第二デリミタを検出しながら、取得した各属性順番情報の順番の属性値まで、ファイルポインタを進め、例えば、その順番の属性値のレコード内でのオフセットである属性位置情報を取得する。次に、配列インデックス生成部1311は、データソース1301のレコードごとに、レコードのPIDに対応付けて、属性順番情報が示す順番に、取得した属性位置情報を連結し、配列インデックスレコードを構成する。
次に、配列インデックス生成部1311は、例えば、対応するPIDをキーとして、配列インデックスレコードを、例えば、昇順にソートし、配列インデックスを構成し、配列インデックス格納部1121に蓄積する。
また、配列インデックス生成部1311は、他のデータソース(ファイル「file2」「file3」等)に対しても、同様に、配列インデックスを構成し、配列インデックス格納部1121に蓄積する。
以上の処理により、図13の1304の配列インデックスが配列インデックス格納部1121に蓄積される。
(4)レコード・インデックス生成処理
レコード・インデックス生成部1313は、ファイル「データソース1301」にアクセスし、データソース1301のソース識別子(ファイル名)「file1」を取得する。また、ソース・インデックス生成部1315は、データソース1301をオープンする。
レコード・インデックス生成部1313は、データソース1301におけるレコードごとに、キー項目値と、データソース1301内におけるレコードのオフセットであるレコード位置情報とを、データソース1301から取得し、レコード・インデックスレコードを構成する。
そして、レコード・インデックス生成部1313は、キー項目値をキーとして、例えば、昇順に、キー項目値とレコード位置情報との組をソートする。次に、レコード・インデックス生成部1313は、レコード・インデックスにおける各レコード・インデックスレコードの位置情報(Pos.)を取得する。かかる位置情報(Pos.)は、レコード・インデックスレコード位置情報である。
なお、ここで、レコード・インデックスレコード位置情報(Pos.)は、当該位置情報(Pos.)とキー項目値とレコード位置情報との組と配列インデックスレコードとを有するレコードの位置情報(Pos.)であることは好適である。つまり、レコード・インデックスレコードと配列インデックスレコードとは、データソースのレコードごとに、連絡されていることは好適である。
次に、レコード・インデックス生成部1313は、データソース1301におけるレコードごとのレコード・インデックスレコードをレコード・インデックス格納部1123に蓄積する。
また、レコード・インデックス生成部1313は、他のデータソース(ファイル「file2」「file3」等)に対しても、同様に、レコード・インデックスを構成し、レコード・インデックス格納部1123に蓄積する。
以上の処理により、図13の1305のレコード・インデックスがレコード・インデックス格納部1123に蓄積される。
(5)2次インデックス生成処理
2次インデックス生成部1314は、レコード・インデックス格納部1123のレコード・インデックスを読み出す。
次に、2次インデックス生成部1314は、例えば、1番目、4番目、7番目といった具合に、所定数(ここでは、3つ)飛ばしで、レコード・インデックスレコードに含まれるキー項目値(ここでは、PID)とレコード・インデックスレコード位置情報(Pos.)との組である2次インデックスレコードを取得する。
次に、2次インデックス生成部1314は、取得した2次インデックスレコードを2次インデックス格納部1124に追記する。なお、2次インデックスにおいて、PIDをキーとして、2次インデックスレコードはソートされている。
また、2次インデックス生成部1314は、他のデータソース(ファイル「file2」「file3」等)に対しても、同様に、2次インデックスを構成し、2次インデックス格納部1124に蓄積する。
以上の処理により、図13の1306の2次インデックスが2次インデックス格納部1124に蓄積される。
(具体例2)
今、データソース管理装置2のデータソース格納部111、または検索装置1のデータソース格納部111に、図14の1401のデータソースが格納されている、とする。
かかる場合、ユーザは、端末装置3に、検索条件「Select PID,Age,Test,TestValue from データソース where PID=155 AND Test=TestC」を入力した、とする。なお、「PID,Age,Test,TestValue」の「Test」は属性値識別子であり、「TestValue」は属性値である、とする。
すると、端末装置3の端末受付部32は、かかる検索条件を受け付ける。次に、端末処理部33は、送信する検索条件を構成する。次に、端末送信部34は、当該検索条件を検索装置1に送信する。
次に、検索装置1の条件受付部121は、検索条件「Select PID,Age,Test,TestValue from データソース where PID=155 AND Test=TestC」を受信する。
次に、検索装置1の検索部132は、以下のように「PID=155 AND Test=TestC」に合致するレコードの中の「PID」、「Age」、属性識別子「TestC」、およびTestCの属性値を取得する。
つまり、まず、検索部132は、検索条件に含まれる「PID=155」を取得する。また、検索部132は、検索条件に含まれる属性値識別子「TestC」を取得する(図14の1406)。
次に、検索部132は、ソース・インデックス(1402)を参照し、取得した「PID=155」を、Min(最小キー項目値)とMax(最大キー項目値)の間に挟む、ソース・インデックスレコードを検知し、当該ソース・インデックスレコードが有するソース識別子「File1」を取得する。
また、検索部132は、ソース識別子「File1」に対応する2次インデックス(1403)を参照し、「PID=155」を間に挟むPID「029」と「236」とを検知し、当該PID「029」と「236」と対になるレコード・インデックスレコード位置情報(1)と(151)とを、2次インデックス(1403)から取得する。
次に、検索部132は、ソース識別子「File1」に対応するレコード・インデックス(1404)を参照し、レコード・インデックスレコード位置情報(1)と(151)の間を、例えば、「PID=155」をキーとして二分探索し、「PID=155」を含むレコード・インデックスレコードを検出する。そして、検索部132は、当該レコード・インデックスレコードから、「PID=155」と対になるレコード位置情報(241)を取得する。なお、検索部132は、二分探索ではなく、シーケンシャルサーチして、「PID=155」を含むレコード・インデックスレコードを検出しても良い。
次に、検索部132は、取得したレコード位置情報(241)と、レコード・インデックスレコード位置情報(101)とを、図示しないバッファに一時蓄積する。
次に、検索部132は、ソース識別子「File1」に対応する配列ラベル・インデックス(1405)を参照し、検索条件に含まれる属性識別子「TestC」をキーとして、当該配列ラベル・インデックスを二分探索し、属性識別子「TestC」を検知し、当該属性識別子「TestC」と対になる属性順番情報(3)を取得する。なお、ここで、検索部132は、二分探索ではなく、シーケンシャルサーチして、属性順番情報(3)を取得しても良い。
次に、検索部132は、ソース識別子「File1」に対応する配列インデックスを参照し、配列インデックスの中の、属性順番情報(3)を間に挟む、第一の属性順番情報(1)と第二の属性順番情報(4)とを取得する。
次に、検索部132は、図示しないバッファのレコード・インデックスレコード位置情報(101)に対応し、第一の属性順番情報(1)に対応する属性値位置情報(54)をレコード・インデックスから取得し、図示しないバッファに一時蓄積する。また、検索部132は、当該レコード・インデックスレコード位置情報(101)に対応し、第二の属性順番情報(4)に対応する属性値位置情報(84)をレコード・インデックスから取得し、図示しないバッファに一時蓄積する。
次に、検索部132は、ソース識別子「File1」で識別されるデータソースにアクセスし、当該ファイルをオープンする。
次に、検索部132は、図示しないバッファから、レコード位置情報(241)と属性値位置情報(54)と属性値位置情報(84)とを取得し、当該レコード位置情報(241)が特定する位置のレコードの中の、属性値位置情報(54)と属性値位置情報(84)との間の属性値であり、属性順番情報(3)に対応する属性値「0.381」を、当該ファイルから取得する。また、検索部132は、レコード位置情報(241)が特定する位置のレコードの中の、Age「62」を当該ファイルから取得する。
そして、検索部132は、PID「155」、Age「62」、属性値識別子「TestC」、属性値「0.381」を有する検索結果を構成する。
次に、結果出力部141は、構成された検索結果を、端末装置3に送信する。なお、かかる検索結果は、例えば、図14の1407である。
次に、端末装置3の端末受信部35は、検索結果を受信する。次に、端末処理部33は、受信された検索結果を用いて、出力する検索結果を構成する。次に、端末出力部36は、当該検索結果を出力する。
(具体例3)
今、データソース管理装置2のデータソース格納部111、または検索装置1のデータソース格納部111に、図13の1301のデータソースが格納されている、とする。
かかる場合、ユーザは、端末装置3に、検索条件「Select PID,Age,Test,TestValue from データソース where PID=155 AND Test=TestC」を入力した、とする。
すると、端末装置3の端末受付部32は、かかる検索条件を受け付ける。次に、端末処理部33は、送信する検索条件を構成する。次に、端末送信部34は、当該検索条件を検索装置1に送信する。
次に、検索装置1の条件受付部121は、検索条件「Select PID,Age,Test,TestValue from データソース where PID=155 AND Test=TestC」を受信する。
次に、検索装置1の検索部132は、以下のように「PID=155 AND Test=TestC」に合致するレコードの中の「PID」、「Age」、属性識別子「TestC」、およびTestCの属性値を取得する。
つまり、まず、検索部132は、検索条件に含まれる「PID=155」を取得する。また、検索部132は、検索条件に含まれる属性値識別子「TestC」を取得する。
次に、検索部132は、ソース・インデックス(1302)を参照し、取得した「PID=155」および「TestC」に対応するソース識別子「File1」を取得する。
その後、検索部132は、具体例2で説明した処理と同様の処理により、検索結果を得る。
次に、結果出力部141は、構成された検索結果を、端末装置3に送信する。なお、かかる検索結果は、例えば、図13の1307である。
次に、検索条件の送信に応じて、端末受信部35は、検索結果を受信する。次に、端末処理部33は、受信された検索結果を用いて、出力する検索結果を構成する。次に、端末出力部36は、当該検索結果を出力する。
以上、本実施の形態によれば、大きいデータサイズのデータソースから、所望の属性値を高速に検索できる。
また、本実施の形態によれば、特に、1レコードの長さが非常に長いデータソースに対して、所望の属性値を高速に検索できる。
また、本実施の形態によれば、情報検索を高速に行うためのインデックスを自動生成できる。
また、本実施の形態によれば、特に、1レコードの長さが非常に長いデータソースに対して、情報検索を高速に行うためのインデックスを自動生成できる。
さらに、本実施の形態によれば、最新の状態のインデックスを保持できる。
さらに、本実施の形態における処理は、ソフトウェアで実現しても良い。そして、このソフトウェアをソフトウェアダウンロード等により配布しても良い。また、このソフトウェアをCD−ROMなどの記録媒体に記録して流布しても良い。なお、このことは、本明細書における他の実施の形態においても該当する。なお、本実施の形態における検索装置1を実現するソフトウェアは、以下のようなプログラムである。つまり、このプログラムは、キー項目値と2以上の属性値とを有する2以上のレコードを含むデータソースが格納されるデータソース格納部と、2以上のレコードのうちの1以上の各レコードごと、および各レコードの1以上の各属性ごとに、属性値が存在する位置を特定する属性位置情報を有する配列インデックスが格納される配列インデックス格納部とにアクセス可能なコンピュータを、属性識別子を含む検索条件を受け付ける条件受付部と、前記検索条件が有する属性識別子に対応する属性位置情報を、前記配列インデックスから取得し、当該属性位置情報を用いて、前記検索条件が有する前記属性識別子に対応する属性値を、前記データソースから取得する検索部と、前記検索部が取得した前記属性値を含む検索結果を出力する結果出力部として機能させるためのプログラムである。
また、図15は、本明細書で述べたプログラムを実行して、上述した種々の実施の形態の検索装置1等を実現するコンピュータの外観を示す。上述の実施の形態は、コンピュータハードウェア及びその上で実行されるコンピュータプログラムで実現され得る。図15は、このコンピュータシステム300の概観図であり、図16は、システム300のブロック図である。
図15において、コンピュータシステム300は、CD−ROMドライブを含むコンピュータ301と、キーボード302と、マウス303と、モニタ304とを含む。
図16において、コンピュータ301は、CD−ROMドライブ3012に加えて、MPU3013と、CD−ROMドライブ3012等に接続されたバス3014と、ブートアッププログラム等のプログラムを記憶するためのROM3015と、MPU3013に接続され、アプリケーションプログラムの命令を一時的に記憶するとともに一時記憶空間を提供するためのRAM3016と、アプリケーションプログラム、システムプログラム、及びデータを記憶するためのハードディスク3017とを含む。ここでは、図示しないが、コンピュータ301は、さらに、LANへの接続を提供するネットワークカードを含んでも良い。
コンピュータシステム300に、上述した実施の形態の検索装置1等の機能を実行させるプログラムは、CD−ROM3101に記憶されて、CD−ROMドライブ3012に挿入され、さらにハードディスク3017に転送されても良い。これに代えて、プログラムは、図示しないネットワークを介してコンピュータ301に送信され、ハードディスク3017に記憶されても良い。プログラムは実行の際にRAM3016にロードされる。プログラムは、CD−ROM3101またはネットワークから直接、ロードされても良い。
プログラムは、コンピュータ301に、上述した実施の形態の検索装置1等の機能を実行させるオペレーティングシステム(OS)、またはサードパーティープログラム等は、必ずしも含まなくても良い。プログラムは、制御された態様で適切な機能(モジュール)を呼び出し、所望の結果が得られるようにする命令の部分のみを含んでいれば良い。コンピュータシステム300がどのように動作するかは周知であり、詳細な説明は省略する。
なお、上記プログラムにおいて、情報を送信するステップや、情報を受信するステップなどでは、ハードウェアによって行われる処理、例えば、送信ステップにおけるモデムやインターフェースカードなどで行われる処理(ハードウェアでしか行われない処理)は含まれない。
また、上記プログラムを実行するコンピュータは、単数であってもよく、複数であってもよい。すなわち、集中処理を行ってもよく、あるいは分散処理を行ってもよい。
また、上記各実施の形態において、一の装置に存在する2以上の通信手段は、物理的に一の媒体で実現されても良いことは言うまでもない。
また、上記各実施の形態において、各処理は、単一の装置によって集中処理されることによって実現されてもよく、あるいは、複数の装置によって分散処理されることによって実現されてもよい。
本発明は、以上の実施の形態に限定されることなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。