JP4510041B2 - 文書検索システム及びプログラム - Google Patents

文書検索システム及びプログラム Download PDF

Info

Publication number
JP4510041B2
JP4510041B2 JP2007056145A JP2007056145A JP4510041B2 JP 4510041 B2 JP4510041 B2 JP 4510041B2 JP 2007056145 A JP2007056145 A JP 2007056145A JP 2007056145 A JP2007056145 A JP 2007056145A JP 4510041 B2 JP4510041 B2 JP 4510041B2
Authority
JP
Japan
Prior art keywords
character string
record
document
common part
stored
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2007056145A
Other languages
English (en)
Other versions
JP2008217596A (ja
Inventor
克文 藤本
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Toshiba Digital Solutions Corp
Original Assignee
Toshiba Corp
Toshiba Solutions Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Toshiba Corp, Toshiba Solutions Corp filed Critical Toshiba Corp
Priority to JP2007056145A priority Critical patent/JP4510041B2/ja
Publication of JP2008217596A publication Critical patent/JP2008217596A/ja
Application granted granted Critical
Publication of JP4510041B2 publication Critical patent/JP4510041B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Description

本発明は、2次記憶装置の文書記憶領域に格納されている文書を文字列索引を用いて検索する文書検索システムに係り、特に文字列索引を構成するのに用いられる文字列を当該文字列索引に格納するのに好適な文書検索システム及びプログラムに関する。
一般に、データベース管理システム(DBMS)に代表される大規模なデータ検索システムでは、2次記憶装置(データベース)に格納されているデータの検索速度を向上させるために索引(インデックス)が使用される。索引とは、検索対象のデータから抽出される情報を検索に適したデータ構造で保持するものであり、データの検索を高速化する仕組みであるといえる。索引には幾つかの種類がある。索引は、検索対象データから抽出されるデータの種類によって分類されるのが一般的である。代表的な索引として、例えば数値索引及び文字列索引が知られている。
索引のデータ構造には、2次記憶装置(に確保されている索引記憶領域)に記憶された場合に効率的に参照や更新を行うのに適した構造が用いられる。このようなデータ構造として、例えばBTree(B木)が知られている。BTreeのような索引のデータ構造では、例えば特許文献1に記載されているように、2次記憶装置への書き込み及び当該2次記憶装置からの読み出しが、ページと呼ばれる一定サイズのかたまりの単位で行われる。
一般に文字列索引では、当該索引に格納可能な文字列の長さ(格納可能文字列長)Lが予め指定される。格納可能文字列長は文字数で表される。データ検索システム(文書検索システム)は、文字列長がL以下のデータ(文書)については当該データ全体を索引に格納し、Lよりも文字列長が長いデータについては先頭のL文字までを索引に格納する。
特開2004−341926号公報
上述のような文字列索引を適用する文書検索システムでは、文字列索引へ格納可能な文字列の長さ(格納可能文字列長)Lよりも長い文字列をキー(検索条件)として検索を行った場合、当該文字列索引だけでは検索条件に合致するデータを検索することができない。このような場合、文書検索システムは、検索対象のデータ自体を参照して最終的な判定を行う必要がある。つまり、文字列索引以外のデータを参照する必要がある。このため、従来の段書検索システムは、文字列索引だけで検索条件に合致するデータを検索することができない場合、リソース使用量や処理時間が増えてしまうという問題がある。
このような問題を緩和するために、格納可能文字列長Lを大きくすることが考えられる。ところが、格納可能文字列長Lを大きくすると、文字列索引自体のデータ量が増えて、当該文字列索引を格納するのに必要な2次記憶装置の記憶容量(リソース使用量)の増加を招く。つまり、検索高速化のためには格納可能文字列長Lを大きくしたいが、当該格納可能文字列長Lを大きくすると文字列索引に必要なリソース使用量が増加してしまう。
本発明は上記事情を考慮してなされたものでその目的は、文字列索引に格納される文字列の長さを、リソース使用量を増加させることなく実質的に増加することができる文書検索システム及びプログラムを提供することにある。
本発明の1つの観点によれば、文字列索引格納手段に格納された、一定の文字列数を上限とする単位に分割して管理される文字列索引であって、文書格納手段に格納される文書から抽出された文字列が、当該文書に対応付けて、且つ当該文字列を構成する文字の順序に基づいて順序付けされた配列で格納された文字列索引を利用して、文字列をキーとした文書検索を行う文書検索システムが提供される。このシステムは、前記単位毎に、前記文書格納手段に格納される文書から抽出された当該単位内に格納されるべき文字列の間で、先頭から共通する予め定められた一定文字数を上限とする文字列を共通部文字列として検出する共通部文字列検出手段と、前記検出された共通部文字列の文字列長を表す共通部文字列長情報を、当該共通部文字列が検出された前記単位に対応付けて前記文字列索引に格納して管理する共通部文字列長管理手段と、前記単位内に格納されるべき文字列のうち、先頭文字列については当該先頭文字列の先頭から前記一定文字数を上限とする文字列を前記単位内の該当位置に格納し、残りの文字列については前記検出された共通部文字列に後続する前記一定文字数を上限とする文字列を前記単位内の該当位置に格納する文字列処理手段と、前記単位内の先頭位置に格納されている文字列と当該単位に対応付けて前記文字列索引に格納されている共通部文字列長情報とに基づいて、当該共通部文字列長情報の示す前記共通部文字列を取得して、当該共通部文字列の後ろに当該単位内の前記先頭位置以外の位置に格納されている文字列を連結することにより、当該単位内の前記先頭位置以外の位置に本来格納されるべき文字列を復元して、文字列をキーとした文書検索を行う検索手段とを具備する。
本発明によれば、順序付けされた文字の順序に基づいて順序付けされた文字列の配列においては、隣接する文字列同士は文字列の先頭文字が一致する可能性が高いという性質があり、特に文字列数が増加するに従って、このような先頭文字が一致する文字列数が増加するだけでなく、文字列間で一致する文字数も増加する性質を利用して、文字列索引内の一定の単位毎に、当該単位内の先頭位置には、対応する文書から抽出された文字列の先頭から一定文字数を上限とする文字列を格納し、残りの位置には、当該単位内で共通の文字列(共通部文字列)を重複して格納せずに、当該共通の文字列に後続する一定文字数を上限とする文字列を格納することにより、文字列索引に必要なリソース使用量を抑制しながら、当該文字列索引により多くの文字を格納すること、つまり当該文字列索引に格納される文字列の実質的な長さを増加することが可能となり、文字列索引を利用した文書検索速度の向上を図ることができる。
以下、本発明の実施の形態につき図面を参照して説明する。
図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を超えることはない。
なお、本発明は、上記実施形態またはその変形例そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態またはその変形例に開示されている複数の構成要素の適宜な組み合わせにより種々の発明を形成できる。例えば、実施形態またはその変形例に示される全構成要素から幾つかの構成要素を削除してもよい。
本発明の一実施形態に係るクライアント−サーバシステムのハードウェア構成を示すブロック図。 同実施形態で適用される文字列索引のデータ構造例を示す図。 図1に示される文書検索システムの機能構成を示すブロック図。 図3Aに示される文字列格納処理部52の構成を示すブロック図。 同実施形態における文字列索引内のあるページを対象とする文字列格納/削除処理を説明するための当該ページの状態遷移図。 同実施形態における文字列順序判定処理の手順を示すフローチャート。 同実施形態において文字列索引のあるページに対して実行される文字列格納処理の手順を示すフローチャート。 上記文字列格納処理で実行されるレコード挿入処理の詳細な手順を示すフローチャート。 上記文字列格納処理で実行される共通部文字列長減少処理の詳細な手順を示すフローチャート。 同実施形態におけるレコード削除処理の手順を示すフローチャート。 上記レコード削除処理で実行される共通部文字列長増加処理の詳細な手順を示すフローチャート。 上記実施形態の第1の変形例で適用される共通部文字列長増加処理の手順を示すフローチャート。 上記実施形態の第2の変形例で適用される文字列索引内のあるページを対象とする文字列格納処理を説明するための当該ページの状態遷移図。
符号の説明
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…文字列変更部。

Claims (2)

  1. 文字列索引格納手段に格納された文字列索引であって、文書格納手段に格納される文書から抽出された文字列が、当該文書に対応付けて且つ当該文字列を構成する文字の順序に基づいて順序付けされた配列で格納された文字列索引を利用して、文字列をキーとした文書検索を行う文書検索システムにおいて、
    文書格納手段に格納される文書から抽出された、前記文字列索引に格納されるべき隣接する文字列毎に、先頭から共通する予め定められた一定文字数を上限とする文字列を共通部文字列として検出する共通部文字列検出手段と、
    前記検出された共通部文字列の文字列長を表す共通部文字列長情報が設定された共通部文字列長フィールドと、前記文字列索引に格納されるべき隣接する文字列のうち、先頭文字列については当該先頭文字列の先頭から前記一定文字数を上限とする文字列が設定され、残りの各文字列については、先行する隣接文字列との間で先頭から共通する前記検出された共通部文字列に後続する前記一定文字数を上限とする文字列が設定された、前記一定文字数に一致するサイズの文字列フィールドとを含むレコードを、前記文字列索引の該当位置に格納する文字列処理手段と、
    前記文字列索引の第1の位置に先行する第2の位置が存在する場合、前記第2の位置に格納されているレコードの文字列フィールドに設定されている文字列と前記第2の位置に対応付けて前記文字列索引に格納されているレコードの共通部文字列長フィールドに設定されている共通部文字列長情報とに基づいて、当該共通部文字列長情報の示す前記共通部文字列を取得して、前記第1の位置に格納されているレコードの文字列フィールドに設定されている文字列を、前記取得した共通部文字列の後ろに連結することにより、前記第1の位置に本来格納されるべき文字列を復元して、文字列をキーとした文書検索を行う検索手段と
    を具備することを特徴とする文書検索システム。
  2. 文字列索引格納手段に格納された文字列索引であって、文書格納手段に格納される文書から抽出された文字列が、当該文書に対応付けて且つ当該文字列を構成する文字の順序に基づいて順序付けされた配列で格納された文字列索引を利用して、文字列をキーとした文書検索を行うコンピュータを、
    文書格納手段に格納される文書から抽出された、前記文字列索引に格納されるべき隣接する文字列毎に、先頭から共通する予め定められた一定文字数を上限とする文字列を共通部文字列として検出する共通部文字列検出手段と、
    前記検出された共通部文字列の文字列長を表す共通部文字列長情報が設定された共通部文字列長フィールドと、前記文字列索引に格納されるべき隣接する文字列のうち、先頭文字列については当該先頭文字列の先頭から前記一定文字数を上限とする文字列が設定され、残りの各文字列については、先行する隣接文字列との間で先頭から共通する前記検出された共通部文字列に後続する前記一定文字数を上限とする文字列が設定された、前記一定文字数に一致するサイズの文字列フィールドとを含むレコードを、前記文字列索引の該当位置に格納する文字列処理手段と、
    前記文字列索引の第1の位置に先行する第2の位置が存在する場合、前記第2の位置に格納されているレコードの文字列フィールドに設定されている文字列と前記第2の位置に対応付けて前記文字列索引に格納されているレコードの共通部文字列長フィールドに設定されている共通部文字列長情報とに基づいて、当該共通部文字列長情報の示す前記共通部文字列を取得して、前記第1の位置に格納されているレコードの文字列フィールドに設定されている文字列を、前記取得した共通部文字列の後ろに連結することにより、前記第1の位置に本来格納されるべき文字列を復元して、文字列をキーとした文書検索を行う検索手段と
    として機能させるためのプログラム。
JP2007056145A 2007-03-06 2007-03-06 文書検索システム及びプログラム Expired - Fee Related JP4510041B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007056145A JP4510041B2 (ja) 2007-03-06 2007-03-06 文書検索システム及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007056145A JP4510041B2 (ja) 2007-03-06 2007-03-06 文書検索システム及びプログラム

Publications (2)

Publication Number Publication Date
JP2008217596A JP2008217596A (ja) 2008-09-18
JP4510041B2 true JP4510041B2 (ja) 2010-07-21

Family

ID=39837539

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007056145A Expired - Fee Related JP4510041B2 (ja) 2007-03-06 2007-03-06 文書検索システム及びプログラム

Country Status (1)

Country Link
JP (1) JP4510041B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5112416B2 (ja) * 2009-12-28 2013-01-09 ヤフー株式会社 用語抽出装置、方法及び用語辞書のデータ構造
CN117453853A (zh) * 2023-12-26 2024-01-26 天津南大通用数据技术股份有限公司 一种基于bw树的超长字符串跨页索引方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004062475A (ja) * 2002-07-29 2004-02-26 Hitachi Ltd インデクス格納方法

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS5858682A (ja) * 1981-10-02 1983-04-07 Canon Inc 電子機器
JPS62212726A (ja) * 1986-03-13 1987-09-18 Fujitsu Ltd インデツクスキー圧縮処理方法
JPH03127254A (ja) * 1989-10-13 1991-05-30 Matsushita Electric Ind Co Ltd 単語検索装置
JPH04209069A (ja) * 1990-12-03 1992-07-30 Nec Corp 前方一致文字列検索方式
JPH0554077A (ja) * 1991-08-29 1993-03-05 Nec Corp 単語辞書検索装置
JP3003915B2 (ja) * 1994-12-26 2000-01-31 シャープ株式会社 単語辞書検索装置
JPH09212523A (ja) * 1996-01-30 1997-08-15 Oki Electric Ind Co Ltd 全文検索方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004062475A (ja) * 2002-07-29 2004-02-26 Hitachi Ltd インデクス格納方法

Also Published As

Publication number Publication date
JP2008217596A (ja) 2008-09-18

Similar Documents

Publication Publication Date Title
JP3849279B2 (ja) インデクス作成方法および検索方法
US6668263B1 (en) Method and system for efficiently searching for free space in a table of a relational database having a clustering index
US8255398B2 (en) Compression of sorted value indexes using common prefixes
US20070061546A1 (en) Compressibility checking avoidance
JP4314204B2 (ja) 文書管理方法、システム及びプログラム
JP2005302038A (ja) Bツリー中の連続キーの名前を変更する方法およびシステム
US20110078153A1 (en) Efficient retrieval of variable-length character string data
WO2008053583A1 (fr) Procédé et programme de recherche de séquence de bits
US6735600B1 (en) Editing protocol for flexible search engines
JP2009512950A (ja) パトリシア・トライを効率的にバルク・ロードするアーキテクチャ及び方法
CN100535889C (zh) 文件处理方法和数据处理装置
US6976025B2 (en) Database and method for storing a searchable set of keywords
JP4510041B2 (ja) 文書検索システム及びプログラム
US6640225B1 (en) Search method using an index file and an apparatus therefor
CN1402156A (zh) 网站信息提取系统与方法
CN116150093B (zh) 一种对象存储列举对象的实现方法及电子设备
KR20100022565A (ko) 해시트리를 이용한 url 검색방법
CN113065419B (zh) 一种基于流量高频内容的模式匹配算法及系统
CN110362669B (zh) 一种适用于关键字快速检索的方法
JP2675958B2 (ja) 情報検索用計算機システム及びその記憶装置の動作方法
CN103838760B (zh) 一种查询好友信息的方法和系统
CN101930451B (zh) 用于存储高效地搜索至少一个询问数据元素的方法和装置
JP3649472B2 (ja) 情報検索装置
JP3282089B2 (ja) 情報空間探索方法及び装置
JP2004062475A (ja) インデクス格納方法

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20091021

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20091027

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091221

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20100406

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100428

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130514

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130514

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140514

Year of fee payment: 4

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees