以下、本発明の実施の形態につき図面を参照して説明する。
図1は本発明の一実施形態に係るクライアント−サーバシステムのハードウェア構成を示すブロック図である。クライアント−サーバシステムは、主として、データベースサーバ(データベースサーバコンピュータ)10と、複数のクライアント端末とから構成される。複数のクライアント端末はクライアント端末20を含む。クライアント端末20上では、データベースサーバ10を利用するアプリケーション(アプリケーションプログラム)が動作する。クライアント端末20を含む複数のクライアント端末は、ローカルエリアネットワーク(LAN)のようなネットワーク30を介してデータベースサーバ10と接続されている。なお、図1にはクライアント端末20以外のクライアント端末は省略されている。
データベースサーバ10は、ハードディスクドライブのような2次記憶装置40と接続されている。この2次記憶装置40は、データベース管理プログラム41及びデータベース42を格納する。
データベース管理プログラム41は、データベースサーバ10によるデータベース42の管理、及びクライアント端末からの検索要求に基づく検索処理(文書検索処理)に用いられる。本実施形態では、データベースサーバ10によってデータベース管理システム50が実現される。
データベース42は、文書部421と索引部422とを含む。文書部421は、検索の対象となる複数の文書(電子化文書)を格納するのに用いられる記憶領域(文書記憶領域)である。文書は、文字列を含むデータである。索引部422は、文書部421に格納されている文書を検索するための文字列索引を格納するのに用いられる記憶領域(索引記憶領域)。この索引部422に、文字列索引に加えて数値索引が格納されても構わない。
図2は、本実施形態で適用される文字列索引のデータ構造例を示す。文字列索引に格納される文字列は、データベース42の文書部421に格納される文書から抽出される。文字列を構成する文字間には、例えば対応する文字コードの大小に基づき順序関係が決められている。この文字間の順序関係に基づき、文字列の順序関係が決められる。本実施形態では以下に述べるように、このような順序関係に従って整列された文字列の並びにおいては、隣接する文字列同士は共通の文字列(開始文字列)で始まる確率が高いという性質を利用している。このような性質は、例えば電話帳における氏名の配列からも容易に理解される。
図2の例では、文字列索引はBTreeを用いて格納される。文字列索引内では、各文字列はその順序関係に従って昇順に整列される。この整列された文字列は、ページと呼ばれる複数の領域に分割して格納される。ページは、2次記憶装置40から/への読み出し/書き込みの単位である。
各ページはヘッダのみ、またはヘッダ及び1個以上のレコードから構成される。ここで、ヘッダのみから構成されるページを、便宜的にヘッダ及び0個のレコードから構成されると表現するならば、ページはヘッダ及び0個以上のレコードから構成されると表現できる。
ヘッダは、当該ヘッダを含むページに関する情報(ヘッダ情報)を格納する。本実施形態では、ヘッダは、格納可能文字列長L、レコード数及び共通部文字列長Nの各情報を格納(設定)するフィールド、即ち格納可能文字列長フィールド201、レコード数フィールド202及び共通部文字列長フィールド203を含む。レコードは、文書位置、文字列長及び文字列の各情報を格納(設定)するフィールド、即ち文書位置フィールド211、文字列長フィールド212、及び文字列フィールド213を含む。レコードは固定長である。
格納可能文字列長Lは、対応する文字列索引(ページ)内のレコード1つに格納可能な文字列の最大文字数を示す。レコード数は、対応するページに格納されているレコードの数を示す。共通部文字列長Nは本実施形態に特徴的な情報であり、対応するページに格納されている各レコード内の文書位置の情報(文書位置フィールド211の情報)で示される文書(各レコードの指す文書)間で共通の開始文字列(共通部文字列)の文字数を示す。
文書位置は、レコード内で当該文書位置(の情報)と組をなす文字列を含む(文字列が使われている)文書及び当該文字列の文書内の位置を表す識別子である。ここでは簡単のため、文書位置が上記文字列を含む文書を特定する文書番号であるとする。文字列長(文字列長フィールド212に格納される文字列長)は、レコード内で当該文字列長と組をなす文書位置(の情報)で示される文書の文字数である。
文字列は、レコード内で当該文字列と組をなす文書位置(の情報)で示される文書の例えば先頭からL文字である。Lよりも短い文字列をレコード中に格納する場合には、当該レコード中の余っている領域に、文字が格納されていないことを示す特別な値が格納される。この特別な値を終端文字と呼ぶ。ここでは、レコード中の上記余っている領域に、その領域に対応する文字数分の終端文字が格納される。
文字列索引を用いた検索処理においては、検索条件(キー)となる文字列(検索条件文字列)の文字列長がL以下であれば、文字列索引を用いて検索条件文字列と各レコード内の文字列とを比較するだけで、目的の検索条件文字列で始まる文書の文書位置を特定することができる。
一方、検索条件文字列の文字列長がLを超えている場合、従来技術では、文字列索引を用いるだけでは、検索条件文字列のうちの先頭からのL文字で始まる文書の文書位置しか特定できない。このため従来技術では、特定された文書位置で示される文書と検索条件文字列とを比較することで、当該文書が検索条件文字列で始まるか否かを判定する必要がある。つまり従来技術では、文字列索引を用いるだけでは目的の文書の文書位置の候補しか求めることができず、最終判定には文字列索引の文書位置で示される文書の内容を参照する必要がある。したがって従来技術では、文字列索引に加えて文書を参照する分だけ処理時間が長くなる。
これに対して本実施形態では、共通部文字列長Nの適用により、後述するように格納可能文字列長Lを増やすことなく、つまり文字列索引に文字列を格納するのに必要なリソース使用量を増やすことなく、文字列索引に格納される文字列の文字数を実質的(等価的)にN文字増やすことができる。これにより、検索条件文字列の文字列長がL+Nまでは、文字列索引を用いるだけで目的の文書の文書位置を特定することが可能となる。
BTreeでは、各ページ(または各ページの格納場所を示す情報)は木構造の葉をなしており、木構造の索引によって管理される。このため、データベース42の文書部421に格納される文書を指すレコードを格納するのに用いられるページは、周知のように、BTreeの木構造を、当該木構造の最上位の索引(ルート索引)から、索引(文字列)と文書の内容(文字列)との間の順序関係に基づいて辿ることにより決定することができる。
図3Aは図1に示されるデータベース管理システム50の機能構成を示すブロック図である。データベース管理システム50は、文書格納処理部51、文字列格納処理部52、検索処理部53、要求処理部54及びデータベース操作部55の各処理部を含む。これらの各部51乃至55は、図1のデータベースサーバ10が2次記憶装置40に格納されているデータベース管理プログラム41を読み込んで実行することにより実現される。このプログラム41は、コンピュータ読み取り可能な記憶媒体に予め格納して頒布可能である。また、このプログラム41が、ネットワーク30を介してデータベースサーバ10にダウンロードされても構わない。
文書格納処理部51は、クライアント端末20からの文書格納要求に応じてデータベース42の文書部421に文書を格納するための処理を行う。文字列格納処理部52は、データベース42の索引部422に構築(格納)されている索引(文字列索引)に、文書部421に格納される文書を検索するのに用いられる文字列(索引文字列)を格納(設定)するための処理を主として行う。
検索部53は、クライアント端末20からの検索要求(問い合わせ)に応じて、当該検索要求(問い合わせ)で指定された検索条件(キーワード)を含む文書(の位置)を、索引部422に格納されている文字列索引に基づいて検索する。
要求処理部54は、クライアント端末20からの各種の要求(コマンド)を解釈し、当該要求を文書格納処理部51、文字列格納処理部52または検索部53に送出する。データベース操作部55は、文書格納処理部51、文字列格納処理部52及び検索部53がデータベース42にアクセスするのを可能とするインタフェースとして機能する。但し、以下では説明の簡略化のために、文書格納処理部51、文字列格納処理部52及び検索部53が直接データベース42にアクセスするものとする。
データベース管理システム50は文書検索処理機能を有している点で、文書検索システムであるといえる。
図3Bは、図3Aに示される文字列格納処理部52の構成を示すブロック図である。文字列格納処理部52は、文字列順序判定部61、ヘッダ処理部62、レコード処理部63、共通部文字列検出部64及び文書読込部65を含む。
文字列順序判定部61は、文書格納処理部51によってデータベース42の文書部421に文書が格納される際に、当該文書から抽出された当該文書を検索するのに用いられる文字列(索引文字列)と、既に文字列索引に格納されている文字列との間の順序関係を、当該両文字列を構成する文字の間の順序関係に基づいて判定する。
ヘッダ処理部62は、レコードの追加(挿入)/レコードの削除時に当該レコードに対応するページのヘッダを処理する。ヘッダ処理部62は、共通部文字列長管理部620を含む。共通部文字列長管理部620は、各ページのヘッダに含まれている共通部文字列長フィールド203の値(共通部文字列長)を管理する。
共通部文字列長管理部620は、レコード処理部63によるレコードの挿入/削除時に、共通部文字列検出部64による共通部文字列長検出に応じて当該レコードに対応するページのヘッダに含まれている共通部文字列長フィールド203の値(共通部文字列長)を変更する。共通部文字列長管理部620は、共通部文字列長減少部621と共通部文字列長増加部622とを含む。共通部文字列長減少部621は、レコード処理部63(レコード挿入部631)によるレコードの挿入時に共通部文字列長を減少変更する。共通部文字列長増加部622は、レコード処理部63(レコード削除部632)によるレコードの削除時に共通部文字列長を増加変更する。
レコード処理部63は、レコードを追加(挿入)する処理(レコード挿入処理)、レコードを削除する処理(レコード削除処理)、及びレコードの追加/削除に伴って既登録のレコードの文字列フィールド213の値(文字列)を変更する処理(文字列変更処理)を実行するための文字列処理手段として機能する。レコード処理部63は、レコード挿入処理を実行するレコード挿入部631とレコード削除処理を実行するレコード削除部632と文字列変更処理を実行する文字列変更部633とを含む。
共通部文字列検出部64はレコード処理部63によるレコード挿入/削除に応じて前記共通部文字列を検出する。文書読込部65は、既登録レコードの文字列フィールド213の値を変更する必要がある場合に、当該既登録レコードの文書位置フィールド211によって指定される文書(つまり既登録レコードが指す文書)をデータベース42の文書部421から読み込む。文字列フィールド213の値の変更が必要な既登録レコードは、後述するように、レコード挿入部631による先頭レコード位置に新規レコードが挿入(追加)される場合の、当該先頭レコード位置の旧レコード(レコード0)である。文字列フィールド213の値の変更が必要な既登録レコードはまた、レコード削除部632によって削除されるレコードに対応するページ内の残りのレコードのうち、共通部文字列長増加部622による増加前の共通部文字列長と文字列フィールド213に格納されている文字列の長さとを加えた長さが文字列長フィールド212の示す文字列長より短いレコードである。
次に、データベース管理システム50において、データベース42へ/からの文書の格納(追加)/削除時に実行される、文字列索引内のあるページPを対象とする文字列格納(追加)/削除処理について、図4に示すページPの状態遷移図を参照して説明する。なお、図4(a)に、ページPにおけるヘッダ及びレコードのフォーマットを示す。
まず、時刻t0おいて、文書番号が「0」で内容が「ABCDE」という1個目の文書がデータベース42の文書部421に格納(登録)されたものとする。この場合、レコード数は1個であることから、図4(b)に示すように、ページPのヘッダ内のレコード数フィールド202に「1」が格納される。
本実施形態では、格納可能文字列長Lが「3」である場合を前提としているものとする。この場合、図4(b)に示すように、ページPのヘッダ内の格納可能文字列長」フィールド201には「3」が格納される。
また、ページP内のi番目(i=0,1,2…)のレコード位置に格納されるレコードをレコードiと表現すると、文書番号0の文書に対応するレコードは、図4(b)に示すように、ページPの先頭レコード位置(0番目のレコード位置)にレコード0として格納される。レコード0の文字位置フィールド211には、当該レコード0に対応する文書の文書番号である「0」が格納される。また、レコード0の文字列長フィールド212及び文字列フィールド213には、それぞれ、文書番号0の文書の文字数である「5」及び当該文書の先頭から格納可能文字列長Lで指定される文字数(3文字)の文字列「ABC」が格納される。
時刻t0ではページP内のレコード数はレコード0の1個のみであり、ページP内のレコード数がレコード0の1個である間、当該レコード0の文字列フィールド213の値「ABC」(つまりレコード0に格納されている文字列「ABC」)全体がページP内の全レコード(に対応する文書)の間に共通の文字列(共通部文字列)となる。このため、ページPのヘッダの共通部文字列長フィールド203には、図4(b)に示すように、共通部文字列長Nとして「3」が格納される。このように、ページPにおけるレコード0(先頭レコード)の文字列フィールド213には、文書内容の一部を格納するという他のレコードと同様の役割に加え、共通部文字列を保持するという役割がある。なお、以降の説明では、レコードの文字列フィールド213の値、つまりレコード(の文字列フィールド213)に格納されている文字列を、レコードの文字列と表現することもある。
次に、時刻t0より後の時刻t1において、文書番号が「1」で内容が「ABCDEF」という2個目の文書がデータベース42の文書部421に格納されたものとする。この文書番号1の文書に対応するレコードは、図4(c)に示すようにページP内のレコード0の次のレコード位置(1番目のレコード位置)にレコード1として格納(挿入)される。このレコード挿入位置は、詳細を後述する文字列順序判定処理によって決定される。
なお、文書番号1の文書の内容が例えば「ABCD」であるならば、文字列順序判定処理により、ページP内のレコードの配列は、図4(c)とは逆となる。即ち、文書番号0の文書に対応するレコード0は先頭レコード位置(0番目のレコード位置)から次のレコード位置(1番目のレコード位置)に移動され、文書番号1の文書に対応するレコードがレコード0として先頭レコード位置に格納される。
時刻t1ではページP内のレコード数はレコード0及びレコード1の2個となる。この場合、図4(c)に示すように、ページPのヘッダ内のレコード数フィールド202の値が「1」から「2」に変更される。
レコード1の文字列フィールド213には、従来技術であれば、当該レコード1に対応する文書の内容のうちの先頭3文字である「ABC」が格納されることになる。しかし本実施形態では、先頭レコードであるレコード0の文字列「ABC」と共通部文字列長フィールド203の値「3」とから現時点の共通部文字列が「ABC」であることがわかるので、以下に述べる処理の実行によって、共通部文字列「ABC」に後続する3文字「DEF」が、レコード1の文字列フィールド213に格納される。
まず、現時点の共通部文字列「ABC」とレコード1の文書位置フィールド211が指す文書番号1の文書(レコード1に対応する文書)の内容「ABCDEF」とが先頭文字から順に比較される。この比較により、新たな共通部文字列は現時点の共通部文字列と同じ「ABC」であると認識される。したがって、ページPのヘッダの共通部文字列長フィールド203の値は、図4(c)に示されるように「3」のままである。
一方、レコード1の文書位置フィールド211及び文字列長フィールド212には、それぞれ、当該レコード1に対応する文書の文書番号である「1」及び当該文書の文字数である「6」が格納される。また、レコード1の文字列フィールド213には、レコード1に対応する文書から共通部文字列(共通文字列)である「ABC」を取り除いて残った部分の先頭3文字である「DEF」、つまり共通部文字列「ABC」に後続する、格納可能文字列長Lで指定される文字数(3文字)の文字列「DEF」が格納される。
ここで、レコード1の文字列「DEF」は、当該レコード1に対応する文書の先頭から6(L+N=3+3)文字の文字列のうちの共通部文字列「ABC」が省略された文字列であるといえる。この共通部文字列「ABC」は、上記したように、レコード0の文字列「ABC」と共通部文字列長フィールド203の値「3」とから特定される。
検索部53は、共通部文字列「ABC」とレコード1の文字列「DEF」(文字列フィールド213の値)とを連結することにより、当該レコード1に対応する文書の先頭から6文字「ABCDEF」を復元して、当該復元された文字列を用いて、当該レコード1に対応する文書(の位置)を検索することができる。よって、レコード1(を含むページP)は、格納可能文字列長L(=3)により当該レコード1(の文字列フィールド213)に格納される文字列が3文字に制限されながら、当該レコード1に対応する文書を検索するのに用いることが可能な文字列(実効文字列)として、当該文書の先頭から共通部文字列長N(=3)だけ拡張された6文字の文字列「ABCDEF」を実質的に保持しているといえる。
次に、時刻t1より後の時刻t2において、文書番号が「2」で内容が「ABG」という3個目の文書がデータベース42の文書部421に格納されたものとする。この文書番号2の文書に対応するレコードは、図4(d)に示すようにページP内のレコード1の次のレコード位置(2番目のレコード位置)にレコード2として格納(挿入)される。このレコード挿入位置は、文字列順序判定処理によって決定される。
時刻t2ではページP内のレコード数はレコード0、レコード1及びレコード2の3個となる。この場合、図12(d)に示すように、ページPのヘッダ内のレコード数フィールド202の値が「2」から「3」に変更される。
また時刻t2では、先頭レコードであるレコード0の文字列ABCと共通部文字列長フィールド203の値「3」とから現時点の共通部文字列が「ABC」であることがわかる。そこで、現時点の共通部文字列「ABC」とレコード2に対応する文書(文書番号2の文書)の内容「ABG」とが先頭文字から順に比較される。この比較により、新たな共通部文字列は「AB」であると認識される。したがって、ページPのヘッダの共通部文字列長フィールド203の値は、図4(d)に示されるように「3」から「2」に変更される。明らかなように、格納可能文字列長Lと共通部文字列長Nとの間には、N≦Lの関係が成立する。
一方、レコード2の文書位置フィールド211及び文字列長フィールド212には、それぞれ、当該レコード2に対応する文書の文書番号である「2」及び当該文書の文字数である「3」が、図4(d)に示されるように格納される。ここで、レコード2に対応する文書から共通部文字列である「AB」を取り除いて残った部分は「G」の1文字であり、格納可能文字列長Lで指定される文字数(3文字)より少ない。このため、この「G」1文字及び終端文字2文字がレコード2の文字列フィールド213に格納される。なお、図4(d)では、終端文字は省略されている。
上述のように、時刻t2では、共通部文字列長Nが「3」から「2」に1減少する。この時点において、レコード1の文字列フィールド213の値は、当該レコード1に対応する文書の先頭からの文字列のうち旧共通部文字列長である3文字「ABC」に後続する3文字「DEF」である。このレコード1の文字列フィールド213の値が、共通部文字列長Nが1減少されるのに応じて、レコード1に対応する文書の先頭からの文字列のうち新共通部文字列長である2文字「AB」に後続する3文字「CDE」に変更される。この変更後の文字列「CDE」は、データベース42の文書部421に格納されている、レコード1に対応する文書を参照することなく、旧共通部文字列「ABC」及びレコード1の旧文字列(文字列フィールド213の旧値)「DEF」から簡単に特定できる。
次に、時刻t2より後の時刻t3において、文書番号が「2」の文書が削除され、図4(e)に示すようにレコード2が削除されたものとする。この場合、ページP内のレコード数はレコード0及びレコード1の2個となり、ページPのヘッダ内のレコード数フィールド202の値が「3」から「2」に変更される。
ここで、ページP内に残されているレコード0及びレコード1各々の文字列フィールド213の値を比較することにより、図4(e)に示すように、共通部文字列長フィールド203の値を「3」に戻すことができる。この仕組みについては後述する。
共通部文字列長が増加した場合、ページP内のレコード0を除くレコード(ここではレコード1)の文字列フィールド213に格納されている文字列が左にシフトされる。シフト数は、共通部文字列長の増加文字数、つまり新共通部文字列長「3」と旧共通部文字列長「2」との差である1文字である。図4(e)には、レコード1の文字列フィールド213の内容が1文字だけ左シフトされた状態が示されている。このシフトにより空きとなった文字列フィールド213の領域(ここでは1文字分の領域)には、終端文字が格納される。
また、データベース42の文書部421からレコード1に対応する文書の内容「ABCDEF」を読み込むならば、上述の空きとなった領域に当該文書の先頭から6文字目の文字「F」を格納することもできる。これによりページP内の状態を時刻t1と全く同じ状態に復元することができる。
上述のように、文書を削除した場合には、共通部文字列長を増加させる処理、更には共通部文字列長を増加させたことに伴って生じた文字列フィールド213内の空き領域へ該当する文書内の文字列を格納する処理を行うことができる。これらの処理により、文書の検索に用いることが可能な文字列の長さを格納可能文字列長Lよりも増やせるため、検索部53による当該文字列をキーワードとする文書検索速度が一層向上する。但し、これらの処理は、実行されなくてもページP内に矛盾は生じないので、省略可能である。つまり、文書検索速度を優先させる場合にのみ、これらの処理を実行しても良い。
以上のように処理された文字列索引のページPにおいては、レコード0の文字列フィールド213の先頭からN(N≦L)文字の文字列(つまり共通部文字列)と、他のレコードi(iは0より大きい整数)の文字列フィールド213に格納されている最大L文字の文字列とを連結することにより、最低で当該レコードiに対応する文書の先頭からL文字の文字列、最高で当該文書の先頭からL×2文字の文字列を、当該ページP内の情報だけで復元することができる。つまりレコードi(を含むページP)は、最高で当該レコードiに対応する文書の先頭L×2文字までの情報を保持することができるといえる。これにより、最大で長さがL×2文字までの検索条件文字列での検索を文字列索引内だけで完結させることができる。よって本実施形態においては、従来技術と比較して、格納可能文字列長Lよりも長い文字列をキーとする検索時の文書参照回数が削減して検索速度が向上する。
次に、文字列順序判定部61による文字列順序判定処理について、図5のフローチャートを参照して説明する。まず、順序判定の対象となる文字列が文字列#1及び#2であり、当該文字列#1及び#2の長さ(文字数)が、それぞれL1及びL2であるものとする。また、L1及びL2のうち小さい方の値をmin(L1,L2)で表すものとする。明らかなように、L1=L2の場合には、L1及びL2のいずれをmin(L1,L2)で表しても構わない。
文字列順序判定部61は、変数Lkにmin(L1,L2)を代入すると共に、変数iを初期値1に設定する(ステップS1)。次に文字列順序判定部61は、Lkがi以上であるかを判定する(ステップS2)。もし、Lkがi以上である場合、文字列順序判定部61は文字列#1のi文字目(i番目の文字)と文字列#2のi文字目(i番目の文字)との間の順序関係を、次のように判定する。
まず文字列順序判定部61は、例えば文字列#1のi文字目の順序が文字列#2のi文字目よりも前であるか(文字列#1のi文字目<文字列#2のi文字目)を判定する(ステップS3)。一般に文字列を表現するのに用いられる文字(文字コード)の間には、例えば文字コードの大小に基づく順序関係が予め定められている。このため、ステップS3の判定は可能である。
もし、文字列#1のi文字目の順序が文字列#2のi文字目り文字よりも前でないならば(ステップS3)、文字列順序判定部61は、文字列#1のi文字目の順序が文字列#2のi文字目よりも後であるか(文字列#1のi文字目>文字列#2のi文字目)を判定する(ステップS4)。
もし、文字列#1のi文字目の順序が文字列#2のi文字目よりも後でないならば(ステップS4)、つまり文字列#1のi文字目と文字列#2のi文字目とが同一順序ならば、文字列順序判定部61は、変数iを1増加して(ステップS5)、ステップS2に戻る。
一方、文字列#1のi文字目の順序が文字列#2のi文字目よりも前であるならば(ステップS3)、文字列順序判定部61は、文字列#1の順序が文字列#2よりも前である(文字列#1<文字列#2)と判定する(ステップS6)。
また、文字列#1のi文字目の順序が文字列#2のi文字目よりも後であるならば(ステップS4)、文字列順序判定部61は、文字列#1の順序が文字列#2よりも後である(文字列#1>文字列#2)と判定する(ステップS7)。
次に、ステップS2において変数iがLk以下でないと判定されたならば、文字列順序判定部61は、文字列#1及び#2のi文字目同士が先頭からL文字目まで全て同一順序であると判定する。この場合、文字列順序判定部61は、L1とL2とが等しいかを判定する(ステップS8)。
もし、L1とL2とが等しいならば、文字列順序判定部61は、文字列#1及び文字列#2は同一順序である(文字列#1=文字列#2)と判定する(ステップS9)。これに対し、L1とL2とが等しくないならば、文字列順序判定部61はL1とL2との大小を判定する(ステップS10)。
もし、L1の方が小さいならば、文字列順序判定部61は文字列#1の順序が文字列#2よりも前であると判定する(ステップS6)。これに対してL1の方が小さくないならば、つまりL2の方が小さいならば、文字列順序判定部61は文字列#1の順序が文字列#2よりも後であると判定する(ステップS7)。
文字列順序判定部61は、上述の順序判定を、データベース42の文書部421に文書が格納される際に、当該文書の文字列とページP内のレコードの文字列との間で、例えばページP内の先頭レコードから順に実行する。これにより、文書部421に格納される文書を指す新規レコードの挿入位置を決定することができる。なお、文書の文字列との間の順序判定に用いられるページP内のレコードの順番を例えば2分探索法によって決定することも可能である。この2分探索法は、順序判定を効率的に行うための手法として従来から良く知られているため、説明を省略する。
次に、クライアント端末20からの要求に応じて、データベース管理システム50内の文書格納処理部51がデータベース42の文書部421に新たに文書(新規文書)を格納(追加)する場合に、文字列格納処理部52によって実行される文書格納時処理について、図6のフローチャートを参照して説明する。
まず、文字列格納処理部52内の文字列順序判定部61は、データベース42の索引部422に格納されている文字列索引内のいずれのページを対象として文書格納時処理を行うかを従来技術と同様に決定する。ここでは、新規文書の先頭の文字列に最も近い順序関係の文字列を先頭文字列とする文書を指すレコードが格納されるページ、例えばページPが文書格納時処理の対象となるページとして決定されたものとする。
文字列格納処理部52のヘッダ処理部62は、ページPのヘッダのレコード数フィールド202を参照して、レコード数が「0」であるかを判定する(ステップS11)。
もし、レコード数が「0」である場合、ヘッダ処理部62はページPのヘッダの共通部文字列長フィールド203の新たな値(共通部文字列長)を示す変数N_newに、格納可能文字列長L及び新規文書の文字数のうち小さい方の値min(L,新規文書の文字数)を代入する(ステップS12)。この値min(L,新規文書の文字数)は、共通部文字列検出部64によって検出される。
レコード挿入部631は、新規文書に対応する(新規文書を指す)レコードをページPに挿入するためのレコード挿入処理(ステップS13)を実行する。図4の例では、文書番号が「0」の文書#0の格納時に、ステップS12及びS13が実行される。ステップS13(レコード挿入処理)の詳細は後述する。
一方、レコード数が「0」でない場合、つまりページPに1つ以上のレコードが格納されている場合、共通部文字列検出部64はページP内のレコード0(先頭レコード)の文字列(文字列フィールド213の内容)と新規文書の先頭からL文字の文字列とを先頭文字から順に比較することにより、先頭から共通する文字列部分の文字数を求め、その文字数をN_new(変更後の共通部文字列長)とする(ステップS14)。次に共通部文字列検出部64は、N_newが、ページPのヘッダの共通部文字列長フィールド203の現在の値(つまり変更前の共通部文字列長)N_old以上であるかを判定する(ステップS15)。
もし、N_newがN_old以上である場合、共通部文字列検出部64は、N_newへN_oldを代入する(ステップS16)。即ち共通部文字列検出部64は、共通部文字列長フィールド203の現在の値(旧値)N_oldをそのまま新値N_newとする。これに対し、N_newがN_old未満である場合、共通部文字列長管理部620内の共通部文字列長減少部621は後述する共通部文字列長減少処理(ステップS17)を実行する。
ステップS16及びS17のいずれが実行された場合にも、レコード処理部63のレコード挿入部631は、ステップS12が実行された場合と同様にレコード挿入処理(ステップS13)を実行する。図4の例では、文書番号が「1」の文書の格納時には、ステップS16及びS13が実行されて、文書番号が「2」の文書の格納時には、ステップS17及びS13が実行される。
次に、レコード挿入処理(ステップS13)の詳細な手順について、図7のフローチャートを参照して説明する。
まず本実施形態では、図1に示されるデータベースサーバ10が有する主メモリのようなメモリ(図示せず)内に、新規レコード用の一時領域が確保されているものとする。この一時領域は、文書位置フィールド211、文字列長フィールド212及び文字列フィールド213を有する。
レコード挿入部631は、新規レコード用一時領域の文字列長フィールド212及び文書位置フィールド211に、それぞれ、新規文書の文字数及び文書番号を格納する(ステップS21)。次にレコード挿入部631は、新規レコードの挿入位置(挿入レコード位置)が0番目のレコード位置(先頭レコード位置)であるかを判定する(ステップS22)。ページPに格納されているレコードの数が0の場合、つまりページPのヘッダ部のレコード数フィールド202の値が0の場合、新規レコードの挿入位置は0番目のレコード位置となる。これに対し、レコード数が0を超えている場合(つまりページPに既に1つ以上のレコードが格納されている場合)の新規レコードの挿入位置は、文字列順序判定部61による順序判定処理により決定される。
もし、新規レコードの挿入位置が0番目のレコード位置(先頭レコード位置)の場合(ステップS22)、レコード挿入部631は、新規レコード用一時領域の文字列フィールド213に新規文書の先頭からL文字の文字列を格納する(ステップS23)。このLの値は、ページPのヘッダ部の格納可能文字列長フィールド201の値(格納可能文字列長)によって示される。
次にレコード挿入部631は、現在のレコード数が0を超えているかを判定する(ステップS24)。もし、現在のレコード数が0を超えていない場合、つまり0の場合、レコード挿入部631はページPのヘッダのレコード数フィールド202の値を1増加して(ステップS30)、レコード挿入処理を終了する。図4の例では、文書番号0の文書の格納時には、上記ステップS21乃至S23及びS30が実行されて、0番目のレコード位置に新規レコードがレコード0として格納される。
これに対し、現在のレコード数が0を超えている場合、つまり新規レコードが現在のレコード0(旧レコード0)に代わって新レコード0となる場合(ステップS24)、レコード挿入部631は旧レコード0の文字列長(文字列長フィールド212の値)がLを超えているかを判定する(ステップS25)。
もし、旧レコード0の文字列長がLを超えているならば(ステップS25)、レコード挿入部631は文書読込部65及び文字列変更部633を起動する。文書読込部65は、旧レコード0の文書位置フィールド211で指定される文書番号の文書、つまり旧レコード0が指す文書(旧レコード0に対応する文書)の内容をデータベース42の文書部421から読み込む(ステップS26a)。すると文字列変更部633は、旧レコード0の文字列フィールド213に、文書読込部65によって読み込まれた文書の先頭からN_new+1文字目以降のL文字を格納する(ステップS26b)。ここで、読み込まれた文書の先頭からN_new+1文字目以降の文字数がL文字に満たない場合、旧レコード0の文字列フィールド213に生じる空き領域に終端文字が格納される。
これに対し、旧レコード0の文字列長がLを超えていないならば(ステップS25)、レコード挿入部631は文字列変更部633のみを起動する。文字列変更部633は、旧レコード0の文字列フィールド213の内容を左へN_new文字だけシフトし、その右側に生じた空き領域に終端文字を格納する(ステップS27)。
一方、ステップS22で新規レコードの挿入位置が0番目のレコード位置(先頭レコード位置)でないと判定された場合、レコード挿入部631は新規レコード用一時領域の文字列フィールド213に、新規文書の先頭からN_new+1文字目以降のL文字を格納する(ステップS23)。
レコード挿入部631は、ステップS26b、ステップS27及びステップS28のいずれが実行された場合にも、ステップS29に進む。このステップS29においてレコード挿入部631は、ページPにおける新規レコードの挿入位置以降のレコードを1つずつ次のレコード位置へ移動し、当該挿入位置へ上記一時領域内の文書位置フィールド211、文字列長フィールド212及び文字列フィールド213から構成される新規レコードを格納する。そしてレコード挿入部631は、ページPのヘッダのレコード数フィールド202の値を1増加して(ステップS30)、レコード挿入処理を終了する。
図4の例では、文書番号が「1」の文書及び文書番号が「2」の文書のそれぞれの格納時に、ステップS21,S22,S28,S29及びS30が実行される。これにより、文書番号1の文書の格納時には、新規レコード1の文字列フィールド213に、当該文書の文字列「ABCDEF」におけるN_new+1(=3+1=4)文字目以降の文字列して、図4(c)に示されるように「DEF」が格納される。同様に文書番号2の文書の格納時には、新規レコード2の文字列フィールド213に、当該文書の文字列「ABG」におけるN_new+1(=2+1=3)文字目以降の文字列して、図4(d)に示されるように「G」が格納される。
次に、共通部文字列長減少処理(ステップS17)の詳細な手順について、図8のフローチャートを参照して説明する。図4の例では、この共通部文字列長減少処理(ステップS17)は、文書番号が「2」の文書の格納時に実行される。
まず共通部文字列長減少部621は、処理対象レコードの位置を表す変数iに初期値1を代入する(ステップS31)。次に共通部文字列長減少部621は、変数iが、ページPのヘッダのレコード数フィールド202の値、つまりレコード数よりも小さいかを判定する(ステップS32)。
もし、変数iがレコード数よりも小さいならば、共通部文字列長減少部621はページPには未処理のレコードが存在すると判定する。この場合、共通部文字列長減少部621は文字列変更部633を起動する。
すると文字列変更部633は、「N_old−N_new」の値を「diff」と表現するものとすると、ページP内のレコードi(i番目のレコード)の文字列フィールド213の内容(つまりレコードiの文字列)を右へdiff文字だけシフトする(ステップS33)。本実施形態において、先頭レコードはレコード0(0番目のレコード)であり、ステップS33の処理の対象外となる。
次に文字列変更部633は、レコードiの文字列のシフトで生じた、当該レコードiの文字列フィールド213の空き領域(diff文字分の空き領域)へ、レコード0の文字列フィールド213に格納されている文字列の先頭N_old文字のうちdiffで示される文字数の終端側の文字を格納する(ステップS34)。これにより、図4における文書番号2の文書の格納時の例では、レコード1(i=1)の文字列フィールド213の内容が、図4(c)に示される「DEF」から図4(d)に示される「CDE」に変更される。
すると共通部文字列長減少部621は変数iを1インクリメントして(ステップS35)、ステップS32の判定処理を再び実行する。共通部文字列長減少部621は、上記ステップS33乃至S35がページP内のレコード0を除く全レコードについて実行された結果、変数iがレコード数以上となると(ステップS32)、ステップS36に進む。
ステップS36において共通部文字列長減少部621は、ページPのヘッダの共通部文字列長フィールド203をN_newに変更する。図4における文書番号2の文書の格納時の例では、ヘッダの共通部文字列長フィールド203が、図4(c)に示される「3」から図4(d)に示される「2」に変更される。共通部文字列長減少部621は、ステップS36を実行すると、共通部文字列長減少処理を終了する。
次に、文書の削除に伴って当該文書に対応するページP内のレコードを削除するレコード削除処理の手順について、図9のフローチャートを参照して説明する。このレコード削除処理は、図4の例では、文書番号が「2」の文書の削除時に実行される。
まずヘッダ処理部62は、ページPのヘッダのレコード数フィールド202の値を「1」減らす(ステップS41)。レコード削除部632は、削除対象のレコードより後ろにレコードが存在するならば、当該後ろの全レコードを、それぞれ1つ前のレコード位置に移動する(ステップS42)。これにより、削除対象のレコードが削除される。
なお、削除対象のレコードがレコード0の場合、レコード削除部632はレコード移動に先行して、文字列変更部633により文字列変更処理を行わせる。この文字列変更処理では、レコード0の文字列の先頭のN_old文字(現在の共通部文字列長Nによって示される数の文字)と次のレコード1の文字列とが連結される。そして、レコード1の文字列フィールド213の内容が、連結された文字列の先頭L文字に変更される。このL文字は、レコード1が指す文書の先頭からL文字の文字列を表す。
レコード削除部632はレコード移動(ステップS42)を実行すると、共通部文字列検出部64を起動する。すると共通部文字列検出部64は、変更後の共通部文字列長を表す変数N_newにLを代入すると共に、処理対象レコードの位置を表す変数iに初期値1を代入する(ステップS43)。
次に共通部文字列検出部64は、変数iが、ページPのヘッダのレコード数フィールド202の値(つまりレコード数)よりも小さいかを判定する(ステップS44)。もし、変数iがレコード数よりも小さいならば、共通部文字列検出部64はページPには未処理のレコードが存在すると判定する。この場合、共通部文字列検出部64は、ページPにおけるレコード0の文字列フィールド213の内容のうちN_old+1文字目以降の文字列とレコードiの文字列フィールド213の内容(レコードiの文字列)とを比較することによって、両者の先頭部分の共通文字列の文字数を検出し、当該検出された文字数を「temp」とする(ステップS45)。
次に共通部文字列検出部64は、N_old+tempの値がN_newよりも小さいかを判定する(ステップS46)。もし、N_old+tempの値がN_newよりも小さいならば、共通部文字列検出部64は当該N_newをN_old+tempに代入する(ステップS47)。そして共通部文字列検出部64は、変数iを1インクリメントして(ステップS48)、ステップS44に戻る。これに対し、N_old+tempの値がN_new以上であるならば、共通部文字列検出部64はステップS47をスキップして、ステップS48を実行する。
共通部文字列検出部64は、上記ステップS45以降の処理をページP内のレコード0を除く全レコードについて実行した結果、変数iがレコード数以上となると(ステップS44)、ステップS49に進む。このステップS49において共通部文字列検出部64は、現在のN_newがN_oldを超えているかを判定する。
レコード削除部632は、共通部文字列検出部64によるステップS49での判定の結果を受けて、N_newがN_oldを超えているならば共通部文字列長増加部622を起動する。すると共通部文字列長増加部622は、ページPのヘッダの共通部文字列長フィールド203の値(共通部文字列長N)を増加するための共通部文字列長増加処理(ステップS50)を実行する。これにより、レコード削除処理は終了する。これに対し、N_newがN_oldを超えていないならば、そのままレコード削除処理は終了する。
図4の例では、文書番号2の文書が削除された場合、レコード0のN_old+1(=2+1=3)文字目以降の文字列「C」とレコード1(i=1)の文字列「CDE」との間の先頭部分の共通文字列の文字数tempとして「1」が取得される(ステップS46)。この場合、N_old+tempの値は「3」であり、その時点の変数N_newの値「L」、つまり「3」に一致する。したがって、ステップS47の判定結果は「NO」となり、変数N_newの値は「3」に維持される。この場合、ステップS49の判定結果は「YES」となって、共通部文字列長増加処理(ステップS50)が実行され、後述するようにヘッダの文字列フィールド213がN_newの値「3」に変更される。
次に、共通部文字列長増加処理(ステップS50)の詳細な手順について、図10のフローチャートを参照して説明する。
まず共通部文字列長増加部622は、処理対象レコードの位置を表す変数iに初期値1を代入する(ステップS61)。次に共通部文字列長増加部622は、変数iが、ページPのヘッダのレコード数フィールド202の値(レコード数)よりも小さいかを判定する(ステップS62)。
もし、変数iがレコード数よりも小さいならば(ステップS62)、共通部文字列長増加部622はページPには未処理のレコードが存在すると判定する。この場合、共通部文字列長増加部622は文字列変更部633を起動する。
すると文字列変更部633は、「N_new−N_old」の値を「diff」と表現するものとすると、ページP内のレコードiの文字列フィールド213の内容(レコードiの文字列)を左にdiff文字だけシフトする(ステップS63)。このステップS63において文字列変更部633は、レコードiの文字列のシフトで生じた、当該レコードiの文字列フィールド213の空き領域(diff文字分の空き領域)へdiffで示される文字数の終端文字を格納する。
文字列変更部633はステップS63を実行すると、共通部文字列長増加部622に制御を戻す。すると共通部文字列長増加部622は、変数iを1インクリメントして(ステップS64)、ステップS62に戻る。
共通部文字列長増加部622は、文字列変更部633による上記ステップS63の処理がページP内のレコードiを除く全レコードについて実行された結果、変数iがレコード数以上となると(ステップS62)、ステップS65に進む。このステップS65において共通部文字列長増加部622は、ページPのヘッダの共通部文字列長フィールド203をN_newに変更する。これにより、共通部文字列長増加処理は終了する。
図4の例では、文書番号2の文書が削除された場合、diffの値は、N_new−N_old=3−2=1であることから、図4(d)に示されるレコード1の文字列「CDE」がdiffで示される文字数、即ち1文字だけ、左へシフトされる(ステップS63)。これにより、レコード1の文字列は、図4(e)に示されるように「DE」となる。また、N_new=3であることから、ヘッダの共通部文字列長フィールド203は、図4(e)に示されるように「3」に変更される。
[第1の変形例]
次に、上記実施形態の第1の変形例について説明する。
上記実施形態では、共通部文字列長増加処理において、レコードiの文字列の左シフトで生じた、当該レコードiの文字列フィールド213の空き領域に終端文字が格納される。この場合、レコードiは、最高でも当該レコードiが指す文書の先頭からL×2文字までの情報を保持することができない。
そこで、レコードiが、最高で当該レコードiが指す文書の先頭からL×2文字までの情報を実質的に保持することを可能とするための、第1の変形例で適用される共通部文字列長増加処理について、図11のフローチャートを参照して説明する。
まず共通部文字列長増加部622は、図10のフローチャート中のステップS61及びS62とそれぞれ同一の処理ステップS71及びS72を実行する。ステップS72において、変数iがレコード数よりも小さいと判定された場合、共通部文字列長増加部622は、レコードiの文字列長フィールド212の値(つまりレコードiが指す文書の文字数)が「現在の共通部文字列長(旧共通部文字列長)N_old+レコードiの文字列の長さ」を超えているかを判定する(ステップS73)。
もし、レコードiの文字列長フィールド212の値が「N_old+レコードiの文字列の長さ」を超えているならば(ステップS73)、共通部文字列長増加部622は文書読込部65及び文字列変更部633を起動する。文書読込部65は、レコードiの文書位置フィールド211が指す文書の内容をデータベース42の文書部421から読み込む(ステップS74)。すると文字列変更部633は、読み込まれた文書の内容のうち先頭N_new文字に後続する文字列の先頭L文字を、レコードiの文字列フィールド213へ格納する(ステップS75)。もし、先頭N_new文字に後続する文字列が格納可能文字列長Lに満たない場合、文字列変更部633は、文字列フィールド213の空き領域にその空き領域の文字数分の終端文字を格納する。
これに対し、レコードiの文字列長フィールド212の値が「N_old+レコードiの文字列の長さ」を超えていないならば(ステップS73)、共通部文字列長増加部622は文字列変更部633のみを起動する。文字列変更部633は、「N_new−N_old」の値を「diff」と表現するものとすると、図10のフローチャートのステップS63と同様に、レコードiの文字列フィールド213の内容を左へdiff文字だけシフトし、その右側に生じた空き領域に終端文字を格納する(ステップS76)。
文字列変更部633はステップS75及びS76のいずれを実行した場合にも、共通部文字列長増加部622に制御を戻す。すると共通部文字列長増加部622は変数iを1インクリメントして(ステップS77)、ステップS72に戻る。
共通部文字列長増加部622は、文字列変更部633による上記ステップS75またはS76の処理がページP内のレコード0を除く全レコードについて実行された結果、変数iがレコード数以上となると(ステップS72)、ステップS78に進む。このステップS78において共通部文字列長増加部622は、ページPのヘッダの共通部文字列長フィールド203の値をN_newに変更する。これにより、共通部文字列長増加処理は終了する。
このように上記実施形態の第1の変形例で適用される共通部文字列長増加処理では、レコードi(i>0)の文字列長フィールド212の値が「N_old+レコードiの文字列の長さ」を超えている場合、当該レコードiが指す文書を読み込む必要はあるものの、レコードiは、共通部文字列長フィールド203の示す共通部文字列長N(N_new)とレコード0の文字列とから特定される最大L文字の共通部文字列、及び当該レコードiの最大L文字の文字列とから、最高で当該レコードiが指す文書の先頭からL×2文字までの情報を格納可能文字列長Lを増やすことなく実質的に保持することが可能となる。これにより、検索部53による文字列索引を利用した文書検索速度が一層向上する。
[第2の変形例]
次に、上記実施形態の第2の変形例について説明する。
上記実施形態では、共通部文字列は、同一ページ内の先頭のレコード0(が指す文書)の文字列を基準に、ヘッダの共通部文字列長フィールド203と当該レコード0の文字列フィールド213とによって、当該ページ内の全レコードに共通の文字列(共通部文字列)が管理される。この場合、ページ内の例えば1つのレコードが指す文書の文字列によって、共通部文字列長が制限される可能性がある。図4の例では、文書番号2の文書の格納時には、当該文書の文字列「ABG」により、共通部文字列長が格納可能文字列長Lに一致する「3」から「2」に減少する。
第2の変形例の特徴は、同一ページ内で隣接するレコードs及びs+1(s=0,1,2…)毎に、レコードs(が指す文書)の文字列を基準に、当該両レコードs及びs+1に共通の文字列(共通部文字列)が管理される点にある。
図12は、第2の変形例におけるページPの状態遷移図を示す。図12において、図4と同様の部分には同一符号を付してある。
図12(a)は、ページPにおけるヘッダ及びレコードのフォーマットを示す。図12の例では、ヘッダには共通部文字列長フィールドが存在せず、各レコードに共通部文字列長フィールド210が設けられている。
図12(b)は、時刻t0において、文書番号が「0」で内容が「ABCDE」という1個目の文書がデータベース42の文書部421に格納された場合の、ページPの状態を示す。時刻t0では、ページ内の0番目のレコード位置(先頭レコード位置)に文書番号0の文書を指すレコード0が格納される。この図12(b)の状態は、図4(b)に示されるヘッダの共通部文字列長フィールド203の値が、レコード0の共通部文字列長フィールド210の値となった点を除いて、図4(b)と同様である。
図12(c)は、時刻t1において文書番号が「1」で内容が「ABCDEF」という2個目の文書が文書部421に格納された場合のページPの状態を示す。時刻t1では、ページ内の1番目のレコード位置に文書番号1の文書を指すレコード1が格納される。文書番号1の文書の先頭の5文字の文字列「ABCDE」は、先行するレコード0が指す文書の文字列「ABCDE」と一致する。しかし、この文字列「ABCDE」の文字数5は格納可能文字列長L=3を超えている。このため、レコード0の共通部文字列長フィールド210の値は格納可能文字列長L=3に一致する「3」のままであり、レコード0の文字列フィールド213の値は「ABC」のままである。一方、レコード1の文字列フィールド213には、文書番号1の文書の先頭からL+1文字(つまり4文字)以降のL文字(3文字)「DEF」が格納される。また、レコード1の共通部文字列長フィールド210には「3」が格納される。
図12(c)から明らかなように、レコード1は、先行するレコード0の共通部文字列長フィールド210の値「3」及び当該レコード0の文字列フィールド213の値「ABC」から特定される共通部文字列「ABC」と、当該レコード1の文字列フィールド213の値「DEF」とにより、実質的に文字列「ABCDEF」を保持しているといえる。
なお、時刻t0では、レコード0の共通部文字列長フィールド210に値を格納せずに、時刻t1で、当該フィールド210に共通部文字列長として「3」を格納しても良い。
図12(d)は、上記実施形態と同様に、時刻t2において文書番号が「2」で内容が「ABG」という2個目の文書が文書部421に格納された場合のページPの状態を示す。時刻t2では、ページ内の2番目のレコード位置に文書番号2の文書を指すレコード2が格納される。
時刻t2ではページP内のレコード数はレコード0、レコード1及びレコード2の3個となる。この場合、図12(d)に示すように、ページPのヘッダ内のレコード数フィールド202の値が「2」から「3」に変更される。この時点において、レコード2に先行するレコード1は、前記したように文字列「ABCDEF」を実質的に保持している
そこで時刻t2では、レコード2に先行するレコード1が実質的に保持している文字列「ABCDEF」と、当該レコード2に対応する文書(文書番号2の文書)の内容「ABG」とが先頭文字から順に比較される。この比較により、隣接するレコード1及び2(がそれぞれ指す文書)に共通な文字列(共通部文字列)は「AB」であると認識される。この場合、レコード1の共通部文字列長フィールド210の値は図12(d)に示されるように「2」に変更される。このとき、レコード0の共通部文字列長フィールド210の値は変更されない点に注意する。なお、時刻t1では、レコード1の共通部文字列長フィールド210に値を格納せずに、時刻t2で、当該フィールド210に共通部文字列長として「2」を格納しても良い。
一方、レコード2の文書位置フィールド211及び文字列長フィールド212には、それぞれ、当該レコード2に対応する文書の文書番号である「2」及び当該文書の文字数である「3」が、図12(d)に示されるように格納される。またレコード2の文字列フィールド213には、先行するレコード1との間で共通する文字列(共通部文字列)「AB」に後続する1文字「G」が格納される。
上述したように第2の変形例では、隣接するレコード毎に共通部文字列(共通部文字列長)を管理することにより、新規レコードが挿入(追加)されても、既登録の隣接するレコードの共通部文字列に何ら影響を及ぼすことはない。このため第2の変形例によれば、上記実施形態に比べて、ページP内のレコード数−1だけ余分に共通部文字列長フィールドを必要とするものの、各レコードが実質的に保持可能な文字列長を増やすことが可能となる。特にレコード数が多い場合には、隣接するレコード、即ちレコードs及びレコードs+1(s=0,1,2…)の間で、先頭1文字が共通の文字列数が増えるだけでなく、先頭2文字目以降が共通の文字列数も増え、つまり共通の文字列長も増加する可能性が高くなるため、この効果は大きくなる。しかも、各レコードに格納される文字列の長さは、格納可能文字列長Lを超えることはない。
なお、本発明は、上記実施形態またはその変形例そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態またはその変形例に開示されている複数の構成要素の適宜な組み合わせにより種々の発明を形成できる。例えば、実施形態またはその変形例に示される全構成要素から幾つかの構成要素を削除してもよい。
10…データベースサーバ、20…クライアント端末、40…2次記憶装置、41…データベース管理プログラム、42…データベース、50…データベース管理システム(文書検索システム)、51…文書格納処理部、52…文字列格納処理部、53…検索部、54…要求処理部、61…文字列順序判定部、62…ヘッダ処理部、63…レコード処理部(文字列処理手段)、64…共通部文字列検出部、65…文書読込部、201…格納可能文字列長フィールド、202…レコード数フィールド、203,210…共通部文字列長フィールド、211…文書位置フィールド、212…文字列長フィールド、213…文字列フィールド、421…文書部、422…索引部、620…共通部文字列長管理部、621…共通部文字列長減少部、622…共通部文字列長増加部、631…レコード挿入部(文字列挿入手段)、632…レコード削除部(文字列削除手段)、633…文字列変更部。