説明

記号列検索方法、プログラムおよび装置ならびにそのトライの生成方法、プログラムおよび装置

【課題】メモリ容量が少ない機器であっても、トライによる高速な文書検索を実現する。
【解決手段】コンピュータが、トライにおける節を共通化したインデクス階層化節を作成し、この節を境目とし、第1のトライ900と第2のトライ904とに階層化する。このうち、第1のトライ900は主記憶装置の上位部分文字列格納領域に格納する。また、第2のトライ904は二次記憶装置の上位部分文字列格納領域に格納する。そして、このコンピュータは、検索タームの入力を受け付けると、この第1のトライ900および第2のトライ904上における、前記検索タームを構成する文字列の文字を辿って、当該文字列に対応する索引情報に到達する。そして、その索引情報を読み出して、その検索タームを含む文書およびその文書における位置を検索する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、文書検索システムに使用する検索インデクス作成技術に関する。
【背景技術】
【0002】
従来、コンピュータが、大規模な文書データベースから、指定された検索文字列が含まれる文書を高速に検索する技術として、インデクスを用いるものが知られている(以下、方式1と呼ぶ)。このインデクスは、(1)検索される文書に含まれるキーワードを示した索引項目と、(2)その索引項目を含む文書を識別する文書識別情報や、当該文書における索引項目の文書位置等を示した索引情報と、が記録されたものである。また、方式1のようなインデクスを用いた文書検索方法において、文書に対する索引項目はトライ(trie)のような木構造により管理される。
【0003】
このトライとは、検索対象となる文字列すなわちキーワードの集合(以下、キー集合と呼ぶ)における各キーワード(以下、キーと呼ぶ)に共通な部分文字列を、共通の節として括り出して作られる木構造である。このトライは、インデクスの検索の際に用いられ、コンピュータは、検索ターム中の文字列をキーに分解し、このキーで節を辿りトライ上を探索する。そして、コンピュータは、トライの末端の節に到達すると、その末端の節に設定されたポインタ情報を読み取り、検索タームに対応する索引情報を読み出すことができる。
【0004】
このトライの概要を、図1を用いて説明する。図1は、比較例のインデクスを例示した図である。前記したとおり、インデクス105は、索引項目を木構造で構成したトライ100と、その索引項目に対応する索引情報101とを含んで構成される。なお、このトライ100の末端の文字列の節には、索引情報101を読み出すためのポインタ情報102が設定される。
【0005】
図1に例示したトライ100は3グラム(キーの文字数が3個)のトライであり、一例として、「あ」から始まる文字列のトライを示している。例えば、このようなトライにおいて、1グラム目の「あ」の節に続く2グラム目の節として「あ」、「い」、「う」、…、「ん」の節が設定され、そのさらに次に3グラム目の節として、「あ」、…、「ん」の節が設定される。そして、末端の節(つまり、図1の3グラム目の節)には、索引情報101を読み出すためのポインタ情報102が設定されている。
【0006】
ここで、コンピュータが、このトライ100を辿って「あいち」という文字列を含む文書の文書番号およびその文書における文字位置を検索する場合には、以下のようになる。
【0007】
まず、コンピュータは、1グラム目の「あ」の節、この節に繋がる2グラム目の「い」の節、この節に繋がる3グラム目の「ち」の節、というように節を辿る。そして、コンピュータは、末端の節である「ち」の節に設定されたポインタ情報102(「ptr61」)により、記憶装置の所定領域から「あいち」に関する索引情報101を読み出す。つまり、「あいち」を含む文書の文書番号(文書識別情報)103である「001」と、その文書における「あいち」の文字位置104である「21」とを読み出す。
【特許文献1】特開平11−143901号公報
【特許文献2】特開昭59−148922号公報
【発明の開示】
【発明が解決しようとする課題】
【0008】
ここで、コンピュータが、前記したトライを用いてインデクスを管理する場合において、文書の索引情報の検索を高速にするには、個々の索引情報の容量を小さくしてトライにおけるグラム数(キーに共通な部分文字列(記号列)の文字数)を大きくすることが考えられる。しかし、このようにグラム数の大きいトライは、メモリに格納しきれないことがある。このような問題は、特に、携帯電話機やDVD(Digital Versatile Disk)プレイヤ等、メモリ容量の少ない機器に文書検索システムを実装する場合に大きな問題となる。
【0009】
そこで、本発明は、前記した問題を解決し、メモリ容量が少ない機器であっても、トライによる高速な文書検索を実現する手段を提供することを目的とする。
【課題を解決するための手段】
【0010】
前記した課題を解決するため、本発明は、主記憶装置および二次記憶装置を備えるコンピュータ(記号列検索装置)が、まず、トライを作成(生成)する。次に、このトライにより検索される索引情報の必要検索時間を参照して、この生成したトライを構成する節それぞれについて、その節から先に繋がる索引情報の必要検索時間の合計を計算する。そして、この計算した節ごとの必要検索時間が、所定の閾値以下か否かを判断する。ここで、必要検索時間が、所定の閾値以下である節のうち、同じ節を親とする節同士を共通化したインデクス階層化節を生成する。つまり、複数の節を共通化し、まとめた節を生成する。そして、この共通化の対象である節およびこの節から先に繋がる節を、インデクス階層化節に置き換えた第1のトライを生成する。生成した第1のトライは、主記憶装置の所定領域に格納する。なお、共通化の対象である節およびこの節から先に繋がる節については、第2のトライとして二次記憶装置の所定領域に移動する。そして、第1のトライにおけるインデクス階層化節には、この第2のトライの格納領域を示すポインタ情報を設定する。これにより、コンピュータが検索タームに含まれる記号列(文字列を含む)により索引情報の検索を行うとき、主記憶装置に格納される第1のトライを辿った後、二次記憶装置に格納される第2のトライにアクセスして、この記号列(文字列を含む)に対応する索引情報に辿りつくことができる。なお、記号列とは、1バイト文字や2バイト文字の文字コードを、2ビットや4ビットに分割した記号コードの記号を繋げたものである。
【0011】
このように、本発明の記号列検索装置は、トライを第1のトライと第2のトライとに階層化し、それぞれを主記憶装置と二次記憶装置とに格納する。従って、主記憶装置(メモリ)の容量が少ない機器(コンピュータ)であっても、大きな容量のトライを実装することができる。つまり、記号列検索装置は、トライによる高速な文書検索を行うことができる。また、記号列検索装置は、第1のトライを作成するとき、この第1のトライにおける節を共通化するので、主記憶装置に格納される第1のトライの節の数を低減することができる。つまり、第1のトライの容量を低減するので、主記憶装置(メモリ)の容量が少ないコンピュータであっても、より一層トライを搭載しやすくなる。さらに、この第1のトライにおいて、共通化するのは、その節から先に繋がる索引情報の必要検索時間の合計が所定の閾値以下の節を対象とした。つまり、必要検索時間の合計が所定の閾値を超える節については、第2のトライを経由せず、すぐに索引情報に到達するようにした。これにより、トライを用いた索引情報の検索効率を向上させることができる。
【発明の効果】
【0012】
本発明によれば、メモリ容量が少ない機器であっても、トライによる高速な文書検索を行うことができる。
【発明を実施するための最良の形態】
【0013】
以下、図面を参照しながら、本発明を実施するための最良の形態(以下、実施の形態という)を、説明する。
【0014】
<第1の実施の形態>
図2は、本発明の実施の形態である文書登録検索システムの構成例を示した図である。
【0015】
本発明の実施の形態である文書登録検索システム(トライ生成装置および記号列検索装置)200は、図2に示すように、ディスプレイ201、キーボード202、CPU(中央演算装置、Central Processing Unit)203、主記憶装置209、二次記憶装置205およびこれらを接続するバス204を含んで構成される。
【0016】
ディスプレイ(出力装置)201は、CPU203による検索結果を表示する。キーボード202(入力装置)は、テキスト206の登録および検索のコマンドや、検索タームを入力する。CPU203は、後記する各プログラムを実行することで、インデクスの登録処理および検索キーワードの検索処理を実行する。主記憶装置209は、インデクス登録用および検索用プログラム、ならびに入出力されるデータ等を一時的に格納する。二次記憶装置(二次記憶装置)205は、各データおよび各プログラムを格納する。
【0017】
また、この二次記憶装置205には、ディスクキャッシュ(図示せず)を備える。このディスクキャッシュは、HDD等、アクセスが低速な記憶装置に記録されているデータの一部を写し、データの読み出しを高速化する手段である。このディスクキャッシュは、二次記憶装置205が備えるRAM(Random Access Memory)等の半導体メモリにより構成される。また、主記憶装置209も、RAM等により構成され、二次記憶装置205は、HDD(Hard Disk Drive)やフラッシュメモリ等により構成される。
【0018】
二次記憶装置205には、文書登録検索システム200全体の制御を司るシステム制御プログラム212に加え、登録用のプログラムとして文書登録制御プログラム210およびインデクス作成登録プログラム213、検索用のプログラムとして検索制御プログラム211およびインデクス検索プログラム221が格納される。これらのプログラムは、CPU203により、主記憶装置209上に読み出され、実行される。図2は、これらのプログラムが、主記憶装置209上に読み出された状態を示している。また、この主記憶装置209には、各データを一時的に格納するワークエリア225、上位部分文字列格納領域224およびトライ格納領域226が確保されている。
【0019】
ここで各プログラムの概略を説明する。
【0020】
システム制御プログラム212は、ディスプレイ201およびキーボード202を用いたユーザ入出力の制御を行い、その他の各プログラムの実行を制御するプログラムである。
【0021】
文書登録制御プログラム210は、インデクス作成登録プログラム213を制御するプログラムである。
【0022】
インデクス作成登録プログラム213は、トライ初期化プログラム214と、索引情報作成プログラム215と、インデクス階層化プログラム216とを含んで構成される。トライ初期化プログラム214はトライの初期化を行うプログラムである。なお、CPU203がこのトライ初期化プログラム214を実行することで、請求項におけるトライ初期化部の機能を実現する。索引情報作成プログラム215は、索引情報207(後記)を作成するプログラムである。インデクス階層化プログラム216は、インデクスの階層化を行う、つまり、トライを2つの階層に分けるプログラムである。
【0023】
このインデクス階層化プログラム216は、インデクス階層化節作成プログラム217と、インデクス検索時間比較プログラム218と、隣接部分文字列検索プログラム219と、インデクス階層化節分割プログラム220とを含んで構成される。
【0024】
インデクス階層化節作成プログラム217は、インデクス階層化節(詳細は後記)を作成するプログラムである。なお、CPU203がインデクス階層化節作成プログラム217を実行することで請求項におけるインデクス階層化節生成部の機能を実現する。
【0025】
インデクス検索時間比較プログラム218は、索引情報207の必要検索時間と目標検索時間(詳細は後記)とを比較するプログラムである。なお、CPU203がインデクス検索時間比較プログラム218を実行することで請求項におけるインデクス検索時間比較部の機能を実現する。
【0026】
隣接部分文字列検索プログラム219は、トライにおいて同じ節を親とする節(つまり兄弟関係にある節)を探索するプログラムである。なお、CPU203が隣接部分文字列検索プログラム219を実行することで、請求項における隣接部分記号列検索部の機能を実現する。
【0027】
インデクス階層化節分割プログラム220は、階層化されたトライのうち、下位のトライ(第2のトライ)の容量が所定の閾値を超えたときインデクス階層化節を分割するプログラムである。
【0028】
さらに、インデクス検索プログラム221は、上位部分文字列検索プログラム222と、下位部分文字列検索プログラム223とを含んで構成される。上位部分文字列検索プログラム222は、階層化されたトライのうち上位のトライ(第1のトライ)を検索するプログラムである。下位部分文字列検索プログラム223は、階層化されたトライのうち、下位のトライ(第2のトライ)を検索するプログラムである。なお、CPU203がインデクス検索プログラム221を実行することで、請求項におけるインデクス検索部の機能を実現する。
【0029】
なお、二次記憶装置205は、文書データであるテキスト206と、そのテキスト206の索引情報207とを記憶する。さらに、この二次記憶装置205には、前記した第2のトライを格納する下位部分文字列格納領域208が確保されている。
【0030】
また、前記したプログラムの詳細は、本実施の形態における登録処理および検索処理の説明の項において詳細に述べる。
【0031】
<登録処理>
ユーザが入力した文書データ(テキスト206)の登録処理は、CPU203が、システム制御プログラム212経由で、文書登録制御プログラム210を実行することで行われる。
【0032】
<インデクス作成登録プログラム>
次に、インデクス作成登録プログラム213について、図2を参照しつつ、図3のPAD(Program Analysis Diagram)を用いて説明する。図3は、図2のインデクス作成登録プログラムの処理手順を示した図である。
【0033】
まず、図2のCPU203は、トライ初期化プログラム214を起動し、トライ格納領域226の初期設定を行う(S300)。このときのトライ初期化プログラム214による初期設定の詳細については、図4を用いて後記する。
【0034】
次に、CPU203は、索引情報作成プログラム215を起動し、索引情報207を作成し、二次記憶装置205へ格納する(S301)。つまり、CPU203は、二次記憶装置205に格納されているテキスト206から、所定の部分文字列と、テキスト206における文書番号(文書識別情報)227と、その文字位置(出現位置情報)228とを抽出し、索引情報207を作成し、二次記憶装置205へ格納する。
【0035】
例えば、CPU203は、索引情報作成プログラム215により、文書番号「001」の「・・・あいち・・・」というテキスト206から、この「あいち」という文字列が文書番号「001」の文書に含まれ、その文書における「あいち」という文字列の先頭の文字「あ」の文字位置は「21」であることを示す索引情報207を作成する。そして、この作成した索引情報207を二次記憶装置205へ格納する。なお、CPU203は、この索引情報207それぞれに対し、この索引情報207を検索するのに要する検索時間(必要検索時間)を計測し、索引情報207に付加する。
【0036】
次に、CPU203は、インデクス階層化プログラム216を起動する。そして、CPU203は、索引情報作成プログラム215によって作成された索引情報207をもとにインデクス階層化処理を行う(S302)。このときのインデクス階層化処理の詳細は、図6を用いて後記する。
【0037】
<トライ初期化プログラム>
次に、トライ初期化プログラム214について、図2を参照しつつ、図4のPADを用いて詳細に説明する。図4は、図2のトライ初期化プログラムの処理手順を示した図である。
【0038】
まず、図2のCPU203は、既にトライが作成され、主記憶装置209にトライ格納領域226が設定されているか否かを判定する(S400)。ここで、未だトライが作成されておらず、トライ格納領域226が設定されていないとき(S400のNo)、CPU203は、テキスト206で用いられるすべての文字をグラム数分(例えば、3グラム分)の文字列に分割する。例えば、テキスト206において「あいちはく」という文字列が含まれていたとき、CPU203は、この文字列を3グラム分の文字列「あいち」と、「はく_」とに分割する。なお、「_」は空白を表す。そして、CPU203は、この分割した文字列の1文字をキー(節)として、トライを作成し、トライ格納領域226を設定する(S401)。例えば、CPU203は、1グラム目の節に「あ」、2グラム目の節に「い」、3グラム目の節に「ち」を設定したトライを作成し、トライ格納領域226に設定する。このとき、CPU203が作成するトライの具体例は、図5を用いて後記する。
【0039】
そして、CPU203は、トライの末端の節それぞれに、その文字列に対応する索引情報207のポインタ情報を設定する(S402)。
【0040】
ここで、CPU203が、トライ初期化プログラム214により作成するトライを、図5を用いて説明する。図5は、図2のCPUが、トライ初期化プログラムにより作成するトライを含むインデクスを例示した図である。
【0041】
図5に例示するように、インデクス500は、索引項目を木構造で構成したトライ501と、その索引項目に対応する索引情報502とを含んで構成される。なお、このトライ501の末端の文字列の節には、索引情報を読み出すためのポインタ情報503が設定される。なお、図5において、「あ」から始まる文字列のトライのみを示しているが、この他にも「い」から始まる文字列のトライ、「う」から始まる文字列のトライ等も存在する。
【0042】
例えば、図5に例示したトライ501において、1グラム目の「あ」の節に続く2グラム目の節として「あ」、「い」、「う」、…、「ん」の節が設定され、そのさらに次に3グラム目の節として、「あ」、…、「ん」の節が設定される。そして、末端の節(つまり、図5の3グラム目の節)には、索引情報502を読み出すためのポインタ情報503が設定されている。例えば、「あいち」に関する索引情報207のポインタ情報503は「prt61」であり、この索引情報207の必要検索時間は「1.127」であることを示す。
【0043】
なお、図5において説明を省略しているが、CPU203は、トライの初期設定を行うとき、トライを構成する節それぞれに、その節から繋がる索引情報207の必要検索時間を設定しておく。
【0044】
このとき、CPU203は、トライ501の末端の節(例えば、図5に例示したトライ501の3グラム目の節)には、その節に繋がる索引情報207の必要検索時間を設定し、トライ501の末端の節以外の節(例えば、図5に例示したトライ501の1グラム目および2グラム目の節)には、この節に繋がる節に設定された必要検索時間の合計値を設定する。
【0045】
例えば、図5に例示したトライ501の2グラム目の「あ」の節の次に、3グラム目の節として、「あ」〜「ん」の節が繋がっている場合、CPU203は、この2グラム目の「あ」の節の必要検索時間として、3グラム目の「あ」〜「ん」それぞれの節の必要検索時間を合計した値を設定する。また、CPU203は、この1グラム目の「あ」の節の必要検索時間を設定する場合も同様に、2グラム目の「あ」〜「ん」それぞれに設定された必要検索時間を合計した値を設定する。このように、CPU203は、トライ501の末端の節から順に、その1グラム目の節まで、索引情報207の必要検索時間の合計値を計算し、この計算した値を各節に設定する。このようにして節それぞれに設定された必要検索時間は、CPU203がトライの各節を共通化し、階層化するときに参照される。このときの各節の共通化および階層化の処理の詳細については、図6および図7を用いて後記する。
【0046】
なお、図5において1グラム目「あ」の節から始まるトライ501を例示しているが、これ以外にもトライの1グラム目の「い」〜「わ」の節から始まるトライもトライ格納領域226に格納される。また、図示を省略しているが、これら1グラム目の節の親となる節として、0グラム目の節が設定されているものとする。これにより、CPU203により、この1グラム目「あ」の節に隣接する節が検索されると、1グラム目の「い」〜「わ」の節が検索されることになる。
【0047】
<インデクス階層化プログラムおよびインデクス検索時間比較プログラム>
次に、インデクス階層化プログラム216およびインデクス検索時間比較プログラム218について、図2を参照しつつ、図6および図7のPADを用いて詳細に説明する。図6および図7は、図2のインデクス階層化プログラムの処理手順を示した図である。
【0048】
まず、CPU203は、主記憶装置209のトライ格納領域226から、トライ初期化プログラム214により作成されたトライを読み出すと、このインデクス階層化プログラム216の実行処理に用いる変数(total,M,N,L,P)の初期値を設定する。ここで、CPU203は、初期値として、total=0、M=1、N=1、L=1、P=1を設定する(S600)。
【0049】
なお、この変数totalは、トライの各節に設定された必要検索時間の合計値を計算するために用いる変数である。変数Mは、目標検索時間以上の節の数をカウントするために用いる変数である。変数Nは、隣接する節のうち、処理を実行した節の数をカウントするために用いる変数である。変数Lは、目標検索時間未満の節のうち、処理を実行した節の数をカウントするために用いる変数である。変数Pは、変数totalが、目標検索時間未満の節の数をカウントするために用いる変数である。なお、この目標検索時間とは、CPU203が、当該節を、共通化するか否かを判断するために用いる閾値であり、主記憶装置209の所定領域に格納される。
【0050】
次に、CPU203は、隣接部分文字列検索プログラム219を起動し、隣接する節を探索し、その節の数をカウントする(S601)。ここでは、まず、CPU203は、トライの1グラム目の節の数をカウントする。つまり、CPU203は、トライの0グラム目の節(図示せず)を親とし、兄弟関係にある節の数をカウントする。例えば、図5に例示したトライの1グラム目「あ」の節と、トライの1グラム目の「い」〜「わ」の節まで(図5において図示省略)の数をカウントする。
【0051】
次に、CPU203は、変数Nの値が、S601でカウントした数以下であるか否かを判断する(S602)。ここで、変数Nの値が、S601でカウントした数以下であるとき判断したとき、S603へ進む。
【0052】
そして、CPU203は、隣接する節のうち、まだ処理を行っていない節を1つ選択する(S603)。例えば、トライの1グラム目の「あ」〜「わ」の節から、まだ処理を行っていない、「あ」の節を選択する。
【0053】
一方、S602において、変数NがS601でカウントした数を超える数のとき、S607へ進む。つまり、CPU203が、隣接する節のうち、その節における必要検索時間が目標検索時間未満の節(目標検索時間非超過部分文字列の節)すべてについて、階層化が終了すると、S607へ進む。
【0054】
CPU203は、S603で節を選択した後、この選択した節に設定されている必要検索時間を読み出す(S604)。例えば、図5に例示するトライ501の1グラム目の「あ」の節に設定されている必要検索時間を読み出す。そして、CPU203は、この読み出した必要検索時間に基づき、節の共通化処理を実行する(S605)。この後、CPU203は、変数Nの値をインクリメントし(S606)、S607へ進む。このS605における節の共通化処理について、図7を用いて説明する。
【0055】
まず、CPU203は、図6のS603で選択した節における必要検索時間が、目標検索時間以上か否かを判断する(図7のS700)。例えば、図5に例示したトライ501の1グラム目の「あ」の節に設定された必要検索時間が「5.0」のとき、この値が、目標検索時間以上か否かを判断する。なお、このときの判断は、前記したインデクス検索時間比較プログラム218により行う。
【0056】
ここで、S603で選択した節における必要検索時間が、目標検索時間以上であるとき(図7のS700のYes)、CPU203は、変数Mの値をインクリメントする(S701)。このようにして、CPU203は、必要検索時間が、目標検索時間以上である節(目標検索時間超過部分文字列の節)の数をカウントする。また、CPU203は、この目標検索時間超過部分文字列と判断した節を、共通化する節の対象として主記憶装置209の所定領域に記憶しておく。例えば、図5に例示する1グラム目の「あ」の節に設定された必要検索時間が、目標検索時間以上だったとき、この1グラム目の「あ」の節の情報を、共通化する節の対象として主記憶装置209の所定領域に記憶しておく。
【0057】
この後、CPU203は、変数Pの値を「0」、変数totalの値も「0」にして(S702)、図6のS606へ進む。つまり、CPU203は、必要検索時間が目標検索時間以上である節(目標検索時間超過部分文字列の節)については、共通化処理を行わないと判断し、隣接する別の節の処理に移る。例えば、図5に例示するトライの1グラム目の「あ」の節に設定された必要検索時間が、目標検索時間以上だったとき、1グラム目の別の節(「い」の節等)の処理に移る。
【0058】
一方、S700において、S603(図6参照)で選択した節における必要検索時間が、目標検索時間未満のとき(S700のNo)、CPU203は、変数totalに、S603で選択した節における必要検索時間を加算する(S703)。例えば、図5に例示するトライの1グラム目の「あ」の節に設定された必要検索時間「5.0」であり、この必要検索時間が目標検索時間未満のとき、変数totalに、この必要検索時間「5.0」を加算する。また、CPU203は、目標検索時間非超過部分文字列の節を、主記憶装置209の所定領域に記憶しておく。
【0059】
そして、CPU203は、インデクス検索時間比較プログラム218により、この必要検索時間を加算した変数totalが、目標検索時間以上となったか判断する(S704)。ここで、必要検索時間を加算した変数totalが、目標検索時間以上となった場合(S704のYes)、変数Pの値が1を超えるか否かを判断する(S705)。ここで、変数Pが1を超えるとき(S705のYes)、つまり、隣接する節のうち、他にも目標検索時間非超過部分文字列の節があるとき、S706へ進む。例えば、CPU203が、1グラム目の「い」の節に設定された必要検索時間「1.0」を、変数totalに加算したところ、この加算した値が、目標検索時間以上となった場合において、他にも目標検索時間非超過部分文字列の節(例えば、1グラム目の「あ」の節)があったとき、S706へ進む。一方、変数Pが1以下であるとき(S705のNo)、図6のS606へ進む。
【0060】
なお、必要検索時間を加算した変数totalがまだ目標検索時間未満であるとき(S704のNo)、CPU203は、変数Pの値をインクリメントして(S709)、図6のS605へ進む。
【0061】
S706では、CPU203は、インデクス階層化節作成プログラム217を起動する。そして、CPU203は、目標検索時間非超過部分文字列の節を共通化し、この共通化した節によりトライを階層化する。このインデクス階層化節作成プログラム217に基づく、節の共通化およびトライの階層化の詳細は、図8を用いて後記するが、例えば、前記した例でいうと、図5に例示するトライ501の1グラム目の「い」の節と、1グラム目の「あ」の節とを共通化した節を作成する。そして、この共通化した節を節目としてトライを階層化する。
【0062】
次に、CPU203は、インデクス階層化節分割プログラム220を起動する(S707)。そして、CPU203は、共通化した節および階層化したトライの分割を行う。この共通化した節および階層化したトライの分割の詳細は、図9を用いて後記する。
【0063】
そして、CPU203は、変数Pの値を「0」にし、変数totalの値を「0」にする(S708)。そして、図6のS606へ進む。
【0064】
図6に戻ってS606以降の説明を続ける。CPU203は、変数Nの値をインクリメントして(S606)、S602へ戻る。そして、CPU203は、変数Nの値が、S601でカウントした数(隣接する節の数)になるまで、S603〜S606の処理を実行する。つまり、隣接するすべての節に、S603〜S606の処理を実行する。そして、CPU203は、変数Nの値がS601でカウントした数(隣接する節の数)を超えたとき、S607へ進む。つまり、CPU203は、隣接する節のうち、目標検索時間未満の節(目標検索時間非超過部分文字列の節)の処理をすべて終了すると、目標検索時間以上の節(目標検索時間超過部分文字列の節)の処理にとりかかる。
【0065】
まず、CPU203は、変数Lが、変数M(目標検索時間超過部分文字列の節の数+1)以下か否かを判断する(S607)。ここで、変数Lが、変数M以下であるとき、CPU203は、主記憶装置209に記憶された目標検索時間超過部分文字列の節の中から、まだ処理を行っていない節を1つ選択する(S608)。例えば、図5に例示するトライ501において1グラム目の「い」の節が、目標検索時間超過部分文字列の節であるとき、CPU203は、この1グラム目の「い」の節を選択する。
【0066】
そして、CPU203は、変数Lの値をインクリメントし(S609)、S608で選択した節の次に続く節を探索する(S610)。例えば、CPU203は、図5に例示するトライ501において、1グラム目の「う」の節の次に続く、2グラム目の節を探索する。ここで、次に続く節が存在するか否かを判断し(S611)、次に続く節が存在する場合、CPU203は、この節を階層化する(S612)。つまり、CPU203は、トライにおける次のグラムの節について、S600以降の処理を実行する。例えば、図5に例示するトライ501において、1グラム目の「い」の節の次に続く、2グラム目の節があったとき、つまり、1グラム目の「い」の節の子の節があったとき、この2グラム目の節について、S600以降の処理と同様の処理を行う。そして、1グラム目の「い」の節の子の節の処理を終了すると、1グラム目の別の節(1グラム目の「う」の節等)の処理に移る。
【0067】
一方、次に続く節が存在しない場合、S608へ戻り、まだ処理を行っていない節の処理に移る。つまり、図5に例示するトライ501において、1グラム目の「い」の節の子の節がなかったとき、1グラム目の兄弟関係にある別の節(例えば、1グラム目の「う」の節等)の処理に移る。そして、CPU203は、このような処理を、変数Lが、変数Mと同じ値になるまで実行する。つまり、隣接する節のうち、すべての目標検索時間超過部分文字列の節について、処理が完了するまで続ける。すなわち、前記した例でいうと、1グラム目の節のうち、目標検索時間超過部分文字列の節すべてについて、前記した処理を実行する。
【0068】
<インデクス階層化節作成プログラム>
次に、インデクス階層化節作成プログラム217について、図2、図5および図9を参照しつつ、図8のPADを用いて詳細に説明する。図8は、図2のインデクス階層化ノード作成プログラムの処理手順を示した図である。図9は、図5のトライをもとに作成されたトライを例示した図である。
【0069】
CPU203は、主記憶装置209に記憶された共通化の対象である節(目標検索時間非超過部分文字列)を読み出し、この節を共通化したインデクス階層化節を作成する(S800)。
【0070】
例えば、図5に例示するトライ501における2グラム目の「あ」、「い」の以外のすべての節(つまり、2グラム目の「う」〜「ん」の節)が、共通化の対象の節として主記憶装置209に記憶されているとき、CPU203は、この2グラム目の「う」〜「ん」の節を読み出し、これらの節をまとめたインデクス階層化節(符号902参照)を作成する。なお、このときのインデクス階層化節のラベルは、図9の符号902に示すように、例えば、「あ、い以外」等とする。
【0071】
また、CPU203は、この共通化の対象の節およびこの節に繋がる節を、ワークエリア225にコピーする。そして、CPU203は、トライから、この共通化の対象の節およびこの節に繋がる節を削除し、この共通化の対象の節のあった場所に、インデクス階層化節を設置する。つまり、この共通化の対象の節およびこの節に繋がる節を、インデクス階層化節に置き換える。そして、CPU203は、このようにして節を削除し、インデクス階層化節を設置したトライを第1のトライとして、上位部分文字列格納領域224に格納する(S801)。
【0072】
例えば、CPU203は、図5に例示するトライ501において、2グラム目の「う」〜「ん」の節およびその節に繋がる節をすべてワークエリア225にコピーする。そして、トライ501からこれらの節を削除し、2グラム目の「う」〜「ん」の節のかわりに、インデクス階層化節902を設置する。そして、CPU203はこのようにして共通化の対象となる節を削除し、かわりにインデクス階層化節を設置したトライを、第1のトライ(図9の符号900参照)として、図2の上位部分文字列格納領域224に格納する。
【0073】
このようにすることで、CPU203は、節の数が少なく、容量の少ない第1のトライを作成することができる。従って、文書登録検索システム200は、主記憶装置209の記憶容量が少ない場合であっても、トライを実装することができる。
【0074】
また、CPU203は、必要検索時間が短い索引情報207に繋がる節については、階層化するが、必要検索時間が長い索引情報207に繋がる節については、階層化を行わない。これにより、必要検索時間が短い索引情報207を検索する際は、二次記憶装置205の第2のトライを経由するが、必要検索時間が長い索引情報207を検索する際は、主記憶装置209の第1のトライから直に索引情報207へ辿りつくことになるので、システム全体として索引情報207の検索効率を向上させることができる。
【0075】
次に、CPU203は、S800で作成したインデクス階層化節から繋がる第2のトライを作成し、図2の下位部分文字列格納領域208に格納する(S802)。すなわち、CPU203は、まずワークエリア225に格納されている共通化の対象の節およびこの節に繋がる節を読み出す。そして、この読み出した共通化の対象の節に、この節の親となる節(図9の第2のトライの根903参照)を設置する。そして、CPU203は、この第2のトライの根903を頂点とするトライを、インデクス階層化節から繋がる第2のトライ904として、図2の下位部分文字列格納領域208に格納する。
【0076】
なお、このようにして第2のトライの格納領域が決まると、CPU203は、この第2のトライの接続元となるインデクス階層化節に、この第2のトライの格納領域を示すポインタ情報を設定する。
【0077】
例えば、S802において、CPU203は、まず、図5に例示するトライの2グラム目の「う」〜「ん」の節およびその節に繋がる節を、ワークエリア225から読み出す。そして、CPU203は読み出したこれらの節の親となる節(図9の第2のトライの根903参照)を設置する。そして、CPU203は、この第2のトライの根903を頂点とするトライを、インデクス階層化節902から繋がる第2のトライ904として、図2の二次記憶装置205の下位部分文字列格納領域208に格納する。次に、CPU203は、第1のトライ900の2グラム目のインデクス階層化節902(「あ、い以外」)に、この第2のトライ904の格納領域を示すポインタ情報905(「ptr332」)を設定する。
【0078】
このようにすることで、CPU203が、索引情報906の検索を行う場合、第1のトライ900のインデクス階層化節から、この節に続く第2のトライ(あるいは第2のトライの根)へジャンプして、索引情報906へ辿りつくことができる。
【0079】
このような処理の後、CPU203は、インデクス階層化節分割プログラム220を起動し、前記した第2のトライの容量に応じて、インデクス階層化節を分割する。
【0080】
<インデクス階層化節分割プログラム>
次に、インデクス階層化節分割プログラム220について、図2を参照しつつ、図10のPADを用いて詳細に説明する。図10は、図2のインデクス階層化節分割プログラムの処理手順を示した図である。
【0081】
まず、図2のCPU203は、インデクス階層化節から指す第2のトライ、つまりインデクス階層化節から続く第2のトライの容量を計測し、その容量が二次記憶装置205のディスクキャッシュに格納できる容量より大きいか否かを判断する(S1000)。
【0082】
ここで、この第2のトライの容量が二次記憶装置205のディスクキャッシュに格納できる容量以下の場合(S1000のNo)、CPU203は、インデクス階層化節の分割は行わないが、この第2のトライの容量が二次記憶装置205のディスクキャッシュに格納できる容量より大きい場合(S1000のYes)、上位部分文字列格納領域224に格納されている、インデクス階層化節をワークエリア225上に読み出し、このインデクス階層化節を分割する(S1001)。S1001で、分割したインデクス階層化節は、図2の上位部分文字列格納領域224に戻す。なお、このときの分割は、その分割したインデクス階層化節の先にある第2のトライの容量が、ディスクキャッシュに格納できる容量以下となるように行う。このようにすることで、CPU203が、二次記憶装置205に格納される第2のトライを検索する際、高速に検索できる。
【0083】
なお、S1001における、分割の個数は、分割後のインデクス階層化節の先にある第2のトライの容量が、ディスクキャッシュに格納できる容量以下となる範囲で、できるだけ少ない方がよい。つまり、S1001の分割は、分割後の第2のトライの容量が、ディスクキャッシュの容量以下となり、かつ、分割してできる新たな第2のトライの数が最小になるのが好ましい。これは、分割により第2のトライの数が増えると、これに伴い第1のトライにおけるインデクス階層化節の数も増え、第1のトライの容量が大きくなってしまうからである。
【0084】
そして、CPU203は、下位部分文字列格納領域208に格納された第2のトライを、ワークエリア225上に読み出し、S1001のインデクス階層化節の分割に従って、第2のトライを分割する(S1002)。次に、CPU203は、分割した第2のトライそれぞれに第2のトライの根を設置し、下位部分文字列格納領域208に格納する。
【0085】
また、CPU203は、分割した第2のトライの格納領域が決まると、S1001において分割したインデクス階層化節に、この第2のトライの格納領域へのポインタ情報を設定する(S1003)。
【0086】
ここで、図11、図12および図13を用いて、前記したインデクス階層化節の分割処理を具体的に説明する。図11および図12は、本実施の形態のインデクス階層化節の分割手順を概念的に説明した図である。図13は、図11および図12を説明するために引用した図である。以下の説明において、二次記憶装置205のディスクキャッシュに格納できる容量は、6kであるものとして説明する。
【0087】
例えば、図11に例示する第1のトライ1100において、インデクス階層化節1101(「ち、つ以外」)の先にある第2のトライ1102の容量は7kである。そして、この第2のトライ1102の容量は、二次記憶装置205のディスクキャッシュに格納できる容量を超えている。
【0088】
従って、CPU203は、この第2のトライ1102の容量が、6k以下となるように第2のトライ1102を分割し、それに伴いインデクス階層化節1101も分割する。
【0089】
例えば、CPU203は、図11における3グラム目のインデクス階層化節1101(「ち、つ以外」)を、図12に例示するように、インデクス階層化節1200(「あ〜む」)およびインデクス階層化節1201(「め〜ん」)の2つのインデクス階層化節に分割する。このとき、インデクス階層化節1200(「あ〜む」)の先に続く第2のトライの容量は3.8k、インデクス階層化節1201(「め〜ん」)の先に続く第2のトライの容量は3.2kというように、それぞれの容量が、ディスクキャッシュに格納できる容量以下となるように分割する。そして、CPU203は、分割後の第2のトライそれぞれに、第2のトライの根1202,1203を設置する。また、CPU203は、インデクス階層化節1200,1201それぞれに、この分割後の第2のトライの格納領域を示すポインタ情報1204,1205を設定する。
【0090】
つまり、図13のグラフに示すように、図11のインデクス階層化節1101の分割前は、「あ−い−あ」〜「あ−い−た」および「あ−い−て」〜「あ−い−ん」のインデクス階層化節の第2のトライの容量は、ディスクキャッシュに格納できる容量(6k)を超えていたところ、図12の「あ−い−あ」〜「あ−い−む」のインデクス階層化節1200および「あ−い−め」〜「あ−い−ん」のインデクス階層化節1201に分割することで、それぞれの第2のトライの容量は、ディスクキャッシュに格納できる容量(6k)以下とする。
【0091】
CPU203が、このようなインデクス階層化節の分割を行うことで、第2のトライの容量を、二次記憶装置205のディスクキャッシュに格納できる容量以下とすることができる。これにより、CPU203は、ディスクキャッシュを用いて索引情報207の検索を高速に行うことができる。
【0092】
<検索処理>
次に、前記した処理により作成されたインデクスにより、CPU203が索引情報の検索を行う手順について説明する。ユーザが入力した検索タームに関する索引情報207の検索は、CPU203が、システム制御プログラム212から検索制御プログラム211を実行することで行われる。検索制御プログラム211は、インデクス検索プログラム221を実行することで行われる。
【0093】
<インデクス検索プログラム>
インデクス検索プログラム221について、図14のPADを用いて詳細に説明する。図14は、図2のインデクス検索プログラムの処理手順を示した図である。ここでは、CPU203が、図9に例示する第1のトライ900および第2のトライ904の節を辿って、索引情報207を検索する場合について説明する。
【0094】
CPU203は、まず入力された検索タームを、連続するグラム数分の文字列に分割する(S1400)。ここで、分割する文字列の文字数は、インデクスのグラム数(所定長)以下の文字数とする。例えば、検索タームが「あいぬじん」である場合において、図9に例示したインデクスは3グラムなので、CPU203は、「あいぬ」、「じん_」といった3文字以下の文字列に分割する。
【0095】
次に、CPU203は、検索タームを分割した文字列の個数分、以下のS1402〜S1404の処理を繰り返す(S1401)。例えば、検索タームである「あいぬじん」を、「あいぬ」、「じん_」という2個の文字列に分割した場合、S1402〜S1404の処理を2回実行する。
【0096】
次に、CPU203は、上位部分文字列検索プログラム222を起動する。そして、CPU203は、分割した文字列について、前記した第1のトライを辿り、末端の節に設定された第2のトライのポインタ情報を読み出す(S1402)。このようにして、CPU203は、分割した文字列のうち、第1のトライに含まれる文字列(上位部分文字列)の検索を行い、この上位部分文字列に続く下位部分文字列(第2のトライに含まれる文字列)のポインタ情報を読み出す。
【0097】
例えば、CPU203が、図9に例示する第1のトライ900において、1グラム目の「あ」の節、2グラム目の「い」の節、3グラム目の「ち、つ以外」の節というように、節を辿る。そして、末端の節である3グラム目の「ち、つ以外」の節(インデクス階層化節)に設定された第2のトライのポインタ情報(「ptr331」)を読み出す。
【0098】
次に、CPU203は、下位部分文字列検索プログラム223を起動する。続いて、S1402で読み出した第2のトライのポインタ情報をもとに、第2のトライにアクセスする。そして、CPU203は、この第2のトライの節を辿り、この第2のトライの末端に設定されたポインタ情報(索引情報のポインタ情報)が示す索引情報207をワークエリア225へ読み込む(S1403)。
【0099】
例えば、CPU203は、図9に例示する第1のトライ900の3グラム目の「ち、つ以外」の節に設定された第2のトライのポインタ情報「ptr331」をもとに、この「ち、つ以外」の節の次に続く、第2のトライ904にアクセスする。そして、この第2のトライの「ぬ」の節に設定されたポインタ情報「ptr199」が示す索引情報207をワークエリア225へ読み込む。つまり、CPU203は、「あいぬ」を検索項目とする索引情報207をワークエリア225へ読み込む。
【0100】
次に、CPU203は、読み込んだ索引情報207から当該文字列を含む文書番号227および文字位置(位置情報)228を抽出し、ワークエリア225に格納する(S1404)。
【0101】
例えば、CPU203は、図9の符号907に示す「あいぬ」の索引情報に格納されている、「あいぬ」を含む文書番号「001」と、文字位置「21」を抽出し、ワークエリア225に格納する。つまり、「あいぬ」という文字列は、文書番号「001」の文書の文字位置「21」の位置にあるという情報を抽出する。
【0102】
CPU203は、以上の処理を、検索タームを分割した文字列の個数分実行する。つまり、CPU203は「あいぬ」の処理を終了すると、「じん_」についても、同様の処理を実行し、この「じん_」を含む文書番号と文字位置(位置情報)を抽出し、ワークエリア225に格納する。
【0103】
そして、CPU203は、すべての文字列の位置情報の抽出を完了すると、ワークエリア225に格納された文字列ごとの位置情報のうち、同じ位置関係にある位置情報を抽出する(S1405)。つまり、CPU203は、文字列同士が検索タームの並びと同じ位置関係にある位置情報を検索し、この位置情報を出力する。
【0104】
例えば、CPU203は、「あいぬ」の位置情報として、文書番号「001」および文字位置「21」という情報を抽出する。また、図示していないが、「じん_」の位置情報として、文書番号「001」および文字位置「24」という情報を抽出したとする。この場合、両者とも、文書番号が同じであり、かつ、文字位置についても「あいぬ」(先頭の文字「あ」は21番目)のすぐ次に「じん_」(先頭の文字「じ」は24番目)が続く位置関係にあり、文字列同士が検索タームの並びと同じ位置関係にある。従って、「あいぬじん」は、文書番号「001」の文書において、文字位置「21」から始まる位置にある文字列であるという情報を検索することができる。
【0105】
このようにして、CPU203は、文書における検索タームの位置情報を得ることができる。
【0106】
<第2の実施の形態>
第2の実施の形態の文書登録検索システムは、索引情報207の必要検索時間に代えて、索引情報207の容量(索引情報の容量の合計値)をもとに当該節を共通化するか否かを判断することを特徴とする。図15は、本発明の第2の実施の形態における文書登録検索システムの構成例を示した図である。
【0107】
図15に示すように、第2の実施の形態の文書登録検索システム200Aは、図2のトライ初期化プログラム214に代えて、トライ初期化プログラム214Aを備え、また、図2のインデクス階層化プログラム216に代えて、インデクス階層化プログラム216Aを備えることを特徴とする。このインデクス階層化プログラム216Aは、図15に示すように、図2のインデクス検索時間比較プログラム218に代えて、索引情報容量比較プログラム218Aを備えることを特徴とする。前記した第1の実施の形態と同様の構成要素は同じ符号を付して、説明を省略する。なお、CPU203が索引情報容量比較プログラム218Aを実行することで、請求項における索引情報容量比較部の機能を実現する。
【0108】
トライ初期化プログラム214Aは、トライの初期化を行う際、トライの各節に、この節を辿った先にある索引情報207の容量(索引情報の容量の合計値)の情報を付加するプログラムである。
【0109】
また、このインデクス階層化プログラム216Aは、索引情報容量比較プログラムにより、各節の索引情報の容量の値(索引情報の容量の合計値)の比較を行い、この節をインデクス階層化節とするか否かを判断するプログラムである。
【0110】
このインデクス階層化プログラム216Aの処理手順を、図16および図17を用いて説明する。図16および図17は、図15のインデクス階層化プログラムの処理手順を示した図である。図16のS1600〜S1603までの処理は、図6のS600〜S603までの処理と同様なので説明を省略し、S1604から説明する。なお、本フローにおける変数totalは、節に設定されている索引情報の容量の合計値を計算するために用いる変数である。
【0111】
CPU203は、S1603で節を選択した後、この選択した節に設定されている索引情報の容量の情報を読み出す(S1604)。例えば、図5に例示するトライ501の1グラム目の「あ」の節に設定されている索引情報207の容量の情報を読み出す。そして、CPU203は、この読み出した索引情報207の容量の情報に基づき、節の共通化処理を実行する(S1605)。なお、S1606は、図6のS606と同様なので説明を省略する。このS1605における節の共通化処理について、図17を用いて説明する。
【0112】
まず、CPU203は、S1603で選択した節における索引情報207の容量の値が、所定の閾値(索引情報の容量の閾値)以上か否かを判断する(図17のS1700)。このときの判断は、前記した索引情報容量比較プログラム218Aにより行われる。
【0113】
ここで、S1603で選択した節における索引情報の容量が、所定の閾値(索引情報の容量の閾値)以上であるとき(S1700のYes)、S1701およびS1702の処理を実行する。S1701およびS1702の処理は、図7のS701およびS702の処理と同様なので説明を省略する。
【0114】
一方、S1700において、S1603で選択した節における索引情報の容量が、前記した閾値未満のとき(S1700のNo)、CPU203は、変数totalに、S1603で選択した節における索引情報の容量の値を加算する(S1703)。
【0115】
そして、CPU203は、索引情報容量比較プログラム218Aにより、この索引情報の容量を加算した変数totalが、前記した所定の閾値以上か否かを判断する(S1704)。ここで、この索引情報の容量を加算した変数totalが、前記した所定の閾値(索引情報の容量の閾値)以上であるとき(S1704のYes)、変数Pの値が1以上であるか否かを判断する(S1705)。ここで、変数Pが1を超えるとき(S1705のYes)、つまり、隣接する節のうち、他にも容量非超過部分文字列の節があるとき、S1706へ進む。一方、変数Pが1以下であるとき(S1705のNo)、図16のS1606へ進む。
【0116】
なお、索引情報の容量を加算した変数totalが前記した所定の閾値(索引情報の容量の閾値)未満であるとき(S1704のNo)、CPU203は、変数Pの値をインクリメントして(S1709)、図16のS1606へ進む。
【0117】
S1706において、CPU203は、インデクス階層化節作成プログラム217を起動する。そして、CPU203は、容量非超過部分文字列の節を共通化し、この共通化した節によりトライを階層化する(S1706)。この後の、S1707およびS1708の処理は、図7のS707およびS708の処理と同様なので、説明を省略する。
【0118】
また、図16のS1607の処理は、図6のS607と同様なので、説明を省略し、S1608から説明する。S1607において、変数Lが、変数M以下であるとき、CPU203は、主記憶装置209に記憶された容量超過部分文字列の節の中から、まだ処理を行っていない節を1つ選択する(S1608)。そして、このすべての容量超過部分文字列について処理を実行するまで、S1609〜S1612の処理を実行する。このS1609〜S1612の処理は、図6のS609〜S612の処理と同様であるので、説明を省略する。
【0119】
このように、CPU203は、索引情報207の容量(索引情報の容量の合計値)を用いることでも検索効率のよいトライを作成することができる。
【0120】
<その他の実施の形態>
なお、前記した実施の形態において、トライの節はひらがなを用いる場合を例に説明したが、カタカナや漢字を用いるようにしてももちろんよい。また、テキスト206が日本語以外の言語を含むものであれば、その言語の文字をトライの節に用いるようにすればよい。図18は、本実施の形態のインデクスを例示した図である。図19は、図18のインデクスを階層化したものを例示した図である。
【0121】
例えば、テキスト206が、英語の文書であるとき、文書登録検索システム200,200Aが、トライ初期化プログラム214,214Aにより作成したトライは、図18に例示するように、アルファベットの文字1つ1つをトライの節としたものになる。例えば、図18に例示するように「a」の節、「i」の節、「r」の節を辿り、「r」の節に設定されたポインタ情報1802が示す先に「air」という文字列の索引情報1801が置かれる。また、文書登録検索システム200,200Aが、図18に例示するようなアルファベットのトライ1800を階層化して、図19に例示するような第1のトライ1900および第2のトライ1901を作成する場合も、トライの節はアルファベットの文字1つ1つを単位としたものになる。
【0122】
さらに、前記した実施の形態において、索引情報207は、テキスト206に含まれる文字列の索引情報としたが、画像データや映像データの索引情報であってもよい。
【0123】
また、文書登録検索システム200,200Aにおいて、インデクス階層化節分割プログラム220を含まない構成としてもよい。すなわち、文書登録検索システム200,200Aにおいて、インデクス階層化節を作成した後、このインデクス階層化節の分割を行わないようにしてもよい。
【0124】
さらに、文書登録検索システム200,200Aは、インデクス作成登録プログラム213と、インデクス検索プログラム221との両方のプログラムを含む構成としたが、これらを別個の構成としてもよい。すなわち、インデクス作成登録プログラム213によりインデクス作成を行うコンピュータとは別に、インデクス検索プログラム221によりインデクス検索を行うコンピュータを設けるようにしてもよい。
【0125】
また、文書登録検索システム200,200Aの二次記憶装置205は、この文書登録検索システム200,200Aの外部に設置するようにしてもよい。
【0126】
また、前記した実施の形態において、1つの文字コードを1グラムとしてもよい。例えば、2バイト文字コードであれば2バイト(16ビット)を1グラムとし、1バイト文字コードであれば1バイト(8ビット)を1グラムとしてもよい。また、グラムは、文字コードに制限されることなく、任意のビット長を1グラムとしてもよい。このようにすることで、例えば、4ビットまたは2ビットの記号コードを1グラムとしてトライを生成し、記号列の登録および検索を実現することができる。
【0127】
また、前記した実施の形態において、文書登録検索システム200,200Aは共通化節の下に繋がるトライをトライ形式で二次記憶装置205の下位部分文字列格納領域208に格納することとしたが、これに限定されない。例えば、二次記憶装置205において、CPU203がアクセスしやすいよう、B木(B tree)形式で格納するようにしてもよい。さらに、二次記憶装置205において、ディスク容量を削減するために、トライの圧縮を行い、格納するようにしてもよい。
【0128】
本実施の形態に係る各プログラムはコンピュータによる読み取り可能な記憶媒体(CD−ROM等)に記憶して提供することが可能である。また、そのプログラムを、インターネット等のネットワークを通して提供することも可能である。
【図面の簡単な説明】
【0129】
【図1】比較例のインデクスを例示した図である。
【図2】本発明の第1の実施の形態における文書登録検索システムの構成例を示した図である。
【図3】図2のインデクス作成登録プログラムの処理手順を示した図である。
【図4】図2のトライ初期化プログラムの処理手順を示した図である。
【図5】図2のCPUが、トライ初期化プログラムにより作成するトライを含むインデクスを例示した図である。
【図6】図2のインデクス階層化プログラムの処理手順を示した図である。
【図7】図2のインデクス階層化プログラムの処理手順を示した図である。
【図8】図2のインデクス階層化ノード作成プログラムの処理手順を示した図である。
【図9】図5のトライをもとに作成されたトライを例示した図である。
【図10】図2のインデクス階層化節分割プログラムの処理手順を示した図である。
【図11】本実施の形態のインデクス階層化節の分割手順を概念的に説明した図である。
【図12】本実施の形態のインデクス階層化節の分割手順を概念的に説明した図である。
【図13】図11および図12を説明するために引用した図である。
【図14】図2のインデクス検索プログラムの処理手順を示した図である。
【図15】本発明の第2の実施の形態における文書登録検索システムの構成例を示した図である。
【図16】図15のインデクス階層化プログラムの処理手順を示した図である。
【図17】図15のインデクス階層化プログラムの処理手順を示した図である。
【図18】本実施の形態のインデクスを例示した図である。
【図19】図18のインデクスを階層化したものを例示した図である。
【符号の説明】
【0130】
100,501 トライ
101,207,502,906,1801 索引情報
102,503,905,1204,1205,1802 ポインタ情報
103,227 文書番号
104,228 文字位置
105,500 インデクス
200,200A 文書登録検索システム
201 ディスプレイ
202 キーボード
203 CPU
204 バス
205 二次記憶装置
206 テキスト
208 下位部分文字列格納領域
209 主記憶装置
210 文書登録制御プログラム
211 検索制御プログラム
212 システム制御プログラム
213 インデクス作成登録プログラム
214,214A トライ初期化プログラム
215 索引情報作成プログラム
216,216A インデクス階層化プログラム
217 インデクス階層化節作成プログラム(インデクス階層化節生成部)
218 インデクス検索時間比較プログラム
218A 索引情報容量比較プログラム
219 隣接部分文字列検索プログラム
220 インデクス階層化節分割プログラム
221 インデクス検索プログラム
222 上位部分文字列検索プログラム
223 下位部分文字列検索プログラム
224 上位部分文字列格納領域
225 ワークエリア
226 トライ格納領域
900,1100,1900 第1のトライ
902,1101,1200,1201 インデクス階層化節
903,1202,1203 第2のトライの根
904,1102,1901 第2のトライ

【特許請求の範囲】
【請求項1】
索引情報の索引項目の記号列を、記号の節からなる木構造で構成したトライの生成方法であって、
主記憶装置および二次記憶装置を備える記号列検索装置が、
前記トライを生成し、
前記生成したトライを前記主記憶装置に記憶し、
前記索引情報の必要検索時間を参照して、前記生成したトライを構成する節それぞれについて、その節から先に繋がる索引情報の必要検索時間の合計を計算し、前記計算した節ごとの必要検索時間を、前記主記憶装置に記憶し、
前記トライを構成する節ごとに、その節における前記必要検索時間が、所定の閾値以下か否かを判断し、
前記必要検索時間が、前記所定の閾値以下である節のうち、その節の親が同じである節同士を共通化したインデクス階層化節を生成し、
前記共通化の対象である節およびこの節から先に繋がる節を、前記生成したインデクス階層化節に置き換えた第1のトライを生成し、
前記生成した第1のトライを前記主記憶装置の所定領域に格納し、
前記共通化の対象である節およびこの節から先に繋がる節を含む第2のトライを前記二次記憶装置の所定領域に格納し、
前記第1のトライにおける前記インデクス階層化節に、前記第2のトライの格納領域を示すポインタ情報を設定すること
を特徴とするトライの生成方法。
【請求項2】
前記記号列検索装置が、
前記二次記憶装置に格納された索引情報の容量を参照して、前記トライを構成する節それぞれについて、その節から先に繋がる索引情報の容量の合計を計算し、前記計算した節ごとの索引情報の容量を、前記主記憶装置に記憶し、
前記トライを構成する節ごとに、その節における前記索引情報の容量が、所定の閾値以下か否かを判断し、
前記索引情報の容量が、前記所定の閾値以下である節のうち、同じ節を親とする節同士を共通化したインデクス階層化節を生成すること
を特徴とする請求項1に記載のトライの生成方法。
【請求項3】
前記生成した第2のトライの容量が、前記二次記憶装置が備えるディスクキャッシュの容量を超えるとき、
前記記号列検索装置が、
前記第2のトライの容量が前記ディスクキャッシュの容量以下となるよう、前記第2のトライを分割し、
前記分割した第2のトライに繋がる前記インデクス階層化節を分割し、
前記分割したインデクス階層化節に、前記分割した第2のトライの格納領域を示すポインタ情報を設定すること
を特徴とする請求項1または請求項2に記載のトライの生成方法。
【請求項4】
前記記号列検索装置が、
前記第2のトライを分割するとき、
前記第2のトライの容量が前記ディスクキャッシュの容量以下となり、かつ、前記第2のトライの分割数が最小となるよう分割すること
を特徴する請求項3に記載のトライの生成方法。
【請求項5】
請求項1ないし請求項4のいずれか1項に記載のトライ生成方法により生成された前記第1のトライおよび前記第2のトライを用いて、前記索引情報の検索を行う検索方法であって、
記号列の検索を行う記号列検索装置が、
検索対象の記号列である検索タームの入力を受け付け、
前記入力された検索タームを所定長以下の記号列に分割し、
その分割した記号列それぞれについて、前記主記憶装置に格納される第1のトライを辿り、この第1のトライの末端の節に設定されたポインタ情報を読み出し、
前記読み出したポインタ情報をもとに、前記二次記憶装置に格納される前記第2のトライにアクセスし、
前記アクセスした第2のトライの節を辿り、この第2のトライの末端に設定されたポインタ情報が示す索引情報を読み出し、
前記読み出した索引情報から、前記分割した記号列それぞれについて、当該記号列を含む文書およびその文書における当該記号列の記号位置を含む位置情報を読み出し、
前記読み出した位置情報から、当該記号列同士が前記検索タームの並びと同じ位置関係にある位置情報を検索し、
前記検索した位置情報を出力すること
を特徴とする記号列検索方法。
【請求項6】
索引情報の索引項目の記号列を、記号の節からなる木構造で構成したトライを生成するトライ生成プログラムであって、
前記トライを生成し、前記生成したトライを主記憶装置に記憶し、前記索引情報の必要検索時間を参照して、前記トライを構成する節それぞれについて、その節から先に繋がる索引情報の必要検索時間の合計を計算し、前記計算した節ごとの必要検索時間を、前記主記憶装置に記憶し、
前記トライを構成する節ごとに、その節における前記必要検索時間が、所定の閾値以下か否かを判断し、
前記必要検索時間が、前記所定の閾値以下である節のうち、同じ節を親とする節を検索し、
前記検索した節を共通化したインデクス階層化節を生成し、前記共通化の対象である節およびこの節から先に繋がる節を、前記生成したインデクス階層化節に置き換えた第1のトライを生成し、前記生成した第1のトライを主記憶装置の所定領域に格納し、前記共通化の対象である節およびこの節から先に繋がる節を含む第2のトライを二次記憶装置の所定領域に格納し、前記第1のトライにおける前記インデクス階層化節に、前記第2のトライの格納領域を示すポインタ情報を設定する
処理を記号列検索装置であるコンピュータに実行させることを特徴とするトライ生成プログラム。
【請求項7】
前記二次記憶装置に格納された索引情報の容量を参照して、前記トライを構成する節それぞれについて、その節から先に繋がる索引情報の容量の合計を計算し、前記計算した節ごとの索引情報の容量を、前記主記憶装置に記憶し、
前記トライを構成する節ごとに、その節における前記索引情報の容量が、所定の閾値以下か否かを判断し、
前記索引情報の容量が、前記所定の閾値以下である節のうち、同じ節を親とする節同士を共通化したインデクス階層化節を生成する
処理をコンピュータに実行させることを特徴とする請求項6に記載のトライ生成プログラム。
【請求項8】
請求項6または請求項7に記載のトライ生成プログラムにより生成された前記第1のトライおよび前記第2のトライを用いて、前記索引情報の検索を行う検索プログラムであって、
検索タームの入力を受け付け、前記入力された検索タームを所定長以下の記号列に分割し、その分割した記号列それぞれについて、前記主記憶装置に格納される第1のトライを辿り、この第1のトライの末端の節に設定されたポインタ情報を読み出し、前記読み出したポインタ情報をもとに、前記二次記憶装置に格納される前記第2のトライにアクセスし、前記アクセスした第2のトライの節を辿り、この第2のトライの末端に設定されたポインタ情報が示す索引情報を読み出し、前記読み出した索引情報から、前記分割した記号列それぞれについて、当該記号列を含む文書およびその文書における当該記号列の記号位置を含む位置情報を読み出し、前記読み出した位置情報から、当該記号列同士が前記検索タームの並びと同じ位置関係にある位置情報を検索し、
前記検索した位置情報を出力する
処理をコンピュータに実行させることを特徴とする記号列検索プログラム。
【請求項9】
索引情報の索引項目の記号列を、記号の節からなる木構造で構成したトライを生成するトライ生成装置であって、
前記トライを生成し、前記生成したトライを主記憶装置に記憶し、前記索引情報の必要検索時間を参照して、前記トライを構成する節それぞれについて、その節から先に繋がる索引情報の必要検索時間の合計を計算し、前記計算した節ごとの必要検索時間を、前記主記憶装置に記憶するトライ初期化部と、
前記トライを構成する節ごとに、その節における前記必要検索時間が、所定の閾値以下か否かを判断するインデクス検索時間比較部と、
前記必要検索時間が、前記所定の閾値以下である節のうち、その節の親が同じである節を検索する隣接部分記号列検索部と、
前記検索した節を共通化したインデクス階層化節を生成し、前記共通化の対象である節およびこの節から先に繋がる節を、前記生成したインデクス階層化節に置き換えた第1のトライを生成し、前記生成した第1のトライを主記憶装置の所定領域に格納し、前記共通化の対象である節およびこの節から先に繋がる節を含む第2のトライを二次記憶装置の所定領域に格納し、前記第1のトライにおける前記インデクス階層化節に、前記第2のトライの格納領域を示すポインタ情報を設定するインデクス階層化節生成部と、
を備えることを特徴とするトライ生成装置。
【請求項10】
前記トライを構成する節ごとに、その節における前記索引情報の容量が、所定の閾値以下か否かを判断する索引情報容量比較部をさらに備え、
前記トライ初期化部は、
前記トライを生成し、前記生成したトライを主記憶装置に記憶し、前記索引情報の容量を参照して、前記トライを構成する節それぞれについて、その節から先に繋がる索引情報の容量の合計を計算し、前記計算した節ごとの索引情報の容量を、前記主記憶装置に記憶し、
前記隣接部分記号列検索部は、
前記必要検索時間が、前記所定の閾値以下である節のうち、その節の親が同じである節を検索すること
を特徴とする請求項9に記載のトライ生成装置。
【請求項11】
請求項9または請求項10に記載のトライ生成装置により生成された前記第1のトライおよび前記第2のトライを用いて、前記索引情報の検索を行う検索装置であって、
検索タームの入力を受け付ける入力装置と、
前記入力された検索タームを所定長以下の記号列に分割し、その分割した記号列それぞれについて、前記主記憶装置に格納される第1のトライを辿り、この第1のトライの末端の節に設定されたポインタ情報を読み出し、前記読み出したポインタ情報をもとに、前記二次記憶装置に格納される前記第2のトライにアクセスし、前記アクセスした第2のトライの節を辿り、この第2のトライの末端に設定されたポインタ情報が示す索引情報を読み出し、前記読み出した索引情報から、前記分割した記号列それぞれについて、当該記号列を含む文書およびその文書における当該記号列の記号位置を含む位置情報を読み出し、前記読み出した位置情報から、当該記号列同士が前記検索タームの並びと同じ位置関係にある位置情報を検索するインデクス検索部と、
前記検索した位置情報を出力する出力装置と、
を備えることを特徴とする記号列検索装置。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate