インターネット等のネットワークに接続されたデータベースに格納されている文書を検索するためのシステムとして、検索エンジンがある。この検索エンジンには、複数の文書から特定の文字列を検索する全文検索機能を備えるものがある。
全文検索機能を備える全文検索エンジンは、複数の文書の内容を順次走査し、検索対象となる文字列を探索する逐次検索型と、検索対象となる文書数が膨大で、逐次検索では検索時間がかかることから、事前に、文字列、その文書の場所、更新日、出現頻度といったデータからなるテーブル構造のインデックスを作成しておき、検索時にはこのインデックスにアクセスすることで、高速に検索を可能にした索引型とがある。
索引型で使用されるインデックスには、様々な形式があり、一般的なものとしては、単語と、その単語を含む文書ファイルIDとで構成された可変長のレコードをもつ転置インデックスと呼ばれるものがある。
ここで、3つの文書と、それらに対する転置インデックスと、収集された文書を保管するデータ構造の例を、図1および2に示す。図1(a)〜(c)に示す文書は、順に、文書ファイルIDが1〜3とされ、いずれも電子メールとされている。図2(a)に示す転置インデックスは、キーとなる単語と、その単語を含むIDとで構成され、この図2(a)では「PHP」、「鈴木」、「コード」という単語を含む文書が対応付けられている。図2(b)に示す収集された文書を保管するデータ構造のエントリ例では、キーとなる単語と、その単語に対応する文書の内容とが対応付けられ、この図2(b)では、単語が左欄に配列され、選択された単語に対応する文書内容が右欄に表示されている。
全文検索エンジンでは、検索語と一致した単語が出現する文書群が検索結果として返される。このように文書全体の類似性を判定する技術として、例えば、特許文献1〜3に記載された技術がある。
これらの技術では、検索語と一致した単語が文書中のどのような文字列の中で出現したかは考慮されない。これでは、検索結果の中に文書が大量に存在する場合、その検索結果の中から真に必要となる文書を見つけ出すのは難しく、労力がかかる。例えば、検索語が文書のテンプレートに存在すると、そのテンプレートを使用している文書が全て返されてしまい、本来の目的となる検索語を本文中にもつ文書を検索結果から探し出す労力が必要となる。なお、テンプレートは、文書のヘッダやフッタ、Webサイトのメニュー、電子メールのシグニチャー等である。
電子メールでは、返信・転送する際、オリジナルのメールを末尾に追加することが多いが、その追加したメールに検索語が含まれていると、返信・転送するメールの本文中にその検索語が出現しなくても、検索結果として返される。このため、検索語を本文の話題としているメールを探したい場合にはノイズとなってしまう。
したがって、検索語が本文の同一の文字列中に出現する文書を1つのグループにまとめることができれば、評価すべき文書数が少なくなるので、真に必要となる文書を見つけやすくなる。
例えば、検索時に検索結果の文書それぞれについて、検索キーワードが含まれる文字列を作成し、比較することで、検索語の出現位置を考慮して、内容が重複する文書を検出する技術が提案されている(特許文献4参照)。
特許文献4に記載されている検索エンジンの構成を、図3に示す。この検索エンジン10は、検索対象となる文書を保持するデータソース20と接続され、また、ユーザが検索結果を得るために入力した問合せ(クエリ)を出力するクライアント装置30と接続されている。
検索エンジン10は、検索エンジン10自身がもつデータベース11に文書を登録し、インデックスを作成するためにデータソース20上の文書を周期的に取得するクローラー12を備える。このクローラー12は、インデックス作成に用いられる文書のコピーを要求し、その文書中に含まれるリンクをたどり、別の文書を収集するという動作を繰り返す。また、クローラー12は、新しい文書を見つけた場合は、データベース11に登録し、文書が存在しないことを検出した場合は、データベース11からその文書を削除する。
検索エンジン10は、クローラー12が取得し、データベース11に登録された文書からテキストを抽出し、段落等のフォーマット情報を抽出するパーサー13を備える。パーサー13は、構文解析を行うもので、構文解析され抽出されたテキストやフォーマット情報を、ストア14と呼ばれる収集された文書を保管するデータ構造へ入力する。
検索エンジン10は、パーサー13により抽出されたテキストやフォーマット情報からインデックスを作成するインデクサー15を備える。インデクサー15は、上述したように、キーとなる単語とその単語を含む文書のIDとを対応付けて索引16に保管する。
検索エンジン10は、さらに、クライアント装置30から受信したクエリに応答して、クエリに含まれる検索語をキーとして、その検索語を含む文書を検索する検索サーバとしてのサーチ・ランタイム17と、サーチ・ランタイム17から検索結果を受け取り、その検索語を含む文書をストア14から取得し、その検索語を含む文字列を生成するクエリ関連情報作成装置18と、生成された文字列を検索結果の文書と比較するクエリ関連情報比較装置19とを備える。
この検索エンジン10では、検索毎、検索結果毎に、クエリ関連情報作成装置18により検索語を含む文字列を生成し、クエリ関連情報比較装置19によりその文字列を比較することで、文章全体が一致したものや、サンプリングされた文書の数箇所が一致したものを、関連する文書として検出する。
以下、本発明を図面に示した具体的な実施の形態に沿って説明するが、本発明は、後述する実施の形態に限定されるものではない。
図4は、検索対象となる文書を保持するデータソースと、検索要求を行うクライアント装置と、検索要求を受けて検索処理を行う検索エンジンを備えるサーバ装置とから構成されるネットワーク・システムを例示した図である。ここでは、データソース100、クライアント装置200、サーバ装置300がそれぞれ1つずつしか示されていないが、2つ以上がネットワーク400に接続されていてもよい。また、データソース100とサーバ装置300は、直接接続されていてもよい。
データソース100は、文書を保持する装置であればいかなる装置であってもよく、項目毎にデータを集めて管理するデータベースや他のサーバ装置とすることができる。データソース100は、文書を保持する、他のユーザが使用するPC等であってもよい。
データソース100がデータベースである場合、そのデータベースとしては、複数の関係(リレーション)を基本的なデータ型とし、格納されたデータを取得するための問合せが、等号や不等号等の関係演算子や、論理積や論理和や否定等の論理演算子を用いて行われるリレーショナル・データベースを用いることができる。なお、データベースは、オペレーティング・システム(OS)が提供するファイル・システム上に直接構築されたものでも、データベース管理システム(DBMS)を用いて構築されたものであってもよい。
クライアント装置200は、検索要求を出力することができるものであればいかなる装置であってもよく、ユーザが入力した検索語について検索要求を生成し、ネットワークを介した問合せを可能にするアプリケーションを備えるPCとすることができる。このPCは、ユーザが検索語を入力するためのキーボード、入力位置を指定し、検索開始の指示を与えるマウス、入力画面や検索結果を表示する表示装置、ネットワークに接続するためのネットワークI/F、アプリケーションを記憶するHDD、それらが実行のために読み出されるRAM、それらを実行するCPU等を備える。また、アプリケーションのほか、ネットワークを介した通信を可能にするために、Webブラウザを用いることができる。
サーバ装置300も、クライアント装置200と同様のハードウェア構成とすることができるが、Webブラウザと通信を行うためにWebサーバと、クライアント装置200から受信した検索要求を処理するための検索エンジンとを備える。
サーバ装置300は、上述したクライアント装置200と同様のハードウェア構成とすることができるが、図5を参照して、サーバ装置300のハードウェア構成の一例について簡単に説明する。図5に示すハードウェア構成では、メモリ310と、少なくとも1つのプロセッサ320と、メモリ制御部330と、チャネル・サブシステム340と、少なくとも1つの制御装置350と、少なくとも1つの入出力デバイス360とを備えている。
メモリ310は、入出力デバイス360から入力されたデータやプログラムを格納し、プロセッサ320およびチャネル・サブシステム340からのアドレス指定に応答して、そのアドレスに格納しているデータ等をプロセッサ320およびチャネル・サブシステム340へ送る。
プロセッサ320は、装置全体を制御し、少なくとも1つのOSを実行する。OSは、装置におけるプログラムの実行や入出力処理を制御する。メモリ制御部330は、バスを経由してメモリ310、プロセッサ320、チャネル・サブシステム340のそれぞれに接続される。このメモリ制御部330は、プロセッサ320やチャネル・サブシステム340が出したリクエストを一時的にキューに格納し、所定のタイミングでメモリ310へ送る。
チャネル・サブシステム340は、各制御装置350へ接続され、プロセッサ320の処理負荷を軽減するために、入出力デバイス360とメモリ310との間のデータ転送を制御する。これにより、プロセッサ320による演算処理と、入出力デバイス360による入出力処理とを並列に実行させることができ、処理効率を向上させることができる。
制御装置350は、入出力デバイス360のデータ転送のタイミング等を制御する。入出力デバイス360は、制御装置350、チャネル・サブシステム340、メモリ制御部330を経由し、メモリ310との間でデータ転送を行う。入出力デバイス360としては、HDD、ディスプレイ、キーボード、プリンタ、通信デバイス、他の記憶装置を挙げることができ、入出力デバイス360の1つには、データソース100が直接に、またはネットワーク400を介して接続される。
サーバ装置300による検索処理を実現するために、プログラムが記録された記録媒体が提供され、その記録媒体が入出力デバイス360の1つに接続され、そのプログラムが、制御装置350、チャネル・サブシステム340、メモリ制御部330を経由して、メモリ310へ送られ、メモリ310に格納される。格納されたプログラムは、再度それらを経由して入出力デバイス360に接続されたHDDへインストールされ、適宜プロセッサ320により読み出され、実行される。
プログラムが格納される記録媒体としては、フレキシブル・ディスク、CD-ROM、DVD、SDカード、フラッシュメモリ等を挙げることができる。このプログラムは、検索処理を実行し、検索結果を出力する処理を実現するプログラムを含む。このプログラムは、同じHDDにインストールされ、適宜プロセッサ320が読み出し、実行することにより検索エンジンとして機能する。
図6は、サーバ装置300を検索システムとして構成した場合の機能ブロック図である。この検索システムは、図3に示した従来の検索エンジンと同様、文書を周期的に取得する取得部としてのクローラー500、取得した文書を格納する格納部としてのデータベース505、文書からテキストを抽出し、段落等のフォーマット情報を抽出する抽出部としてのパーサー510、抽出したテキストおよびフォーマット情報を蓄積する蓄積部としてのストア515、テキストやフォーマット情報からインデックスを作成する作成部としてのインデクサー520、作成したインデックスを保管する保管部としての索引525、クライアント装置200から受信した検索要求に応答して、その検索要求に含まれる検索語をキーとして、その検索語を含む文書を検索する検索部としてのサーチ・ランタイム530を含む。
図3に示した従来の検索エンジンでは、クエリ関連情報作成装置18、クエリ関連情報比較装置19を含んでいたが、図6に示す検索システムでは、分割部535、計算部540、記憶部545、文書グループ化部550を含む。
クローラー500、データベース505、パーサー510、ストア515、インデクサー520、索引525、サーチ・ランタイム530の各機能については、既に述べたので、ここでは、分割部535、計算部540、記憶部545、文書グループ化部550について詳述する。
分割部535は、パーサー510により抽出されたテキストやフォーマット情報を受け取り、ユーザにより指定された分割情報に基づき、テキストを複数のブロックに分割する。分割情報は、テキストをどのように分割するかを示す情報で、センテンス毎、パラグラフ毎、空行、文書に付加された付加情報の少なくとも1つを選択することができる。センテンス毎を選択した場合は、テキストは、センテンス毎に分割される。複数の分割情報を選択して使用することもでき、例えば、特定の検索語が使用された場合は、パラグラフ毎の分割情報を使用し、その特定の検索語以外が使用された場合は、センテンス毎の分割情報を使用することができる。また、複数の分割情報を設定しておき、それらを使用して分割することができるようにすることで、ユーザやシステムがセンテンス毎の分割によるグループ化が適当ではないと判断した場合、パラグラフ毎の分割情報を使用してグループ化することできる。このように、複数の基準で分割できるようにすることで、検索時にグループ化の粒度を調整することができ、有用である。ここで、付加情報としては、HTML文書におけるHTMLタグを挙げることができる。なお、この分割は、インデックス作成時に行われる。
計算部540は、各ブロックに含まれる文字列にハッシュ関数を適用して各ブロックのハッシュ値を計算する。ハッシュ関数は、データからある一定範囲の数値を生成する関数で、ハッシュ関数を適用して得られるハッシュ値は、それぞれの文字列に対応する数値である。ハッシュ値は、Java(登録商標)言語の標準的なメソッド、例えばhashCode()等を使用して算出することができる。なお、hashCode()は、ハッシュ値を返すメソッドである。
ハッシュ関数の1つの例としては、文字列の1文字毎に割り当てられた文字コード、例えば数値を加算して求める関数を挙げることができる。この場合の文字コードとしては、ASCII文字コードを挙げることができる。上記例は一例であるので、ハッシュ値を求めるために、これまでに知られたいかなる計算式やアルゴリズムでも用いることができる。
記憶部545は、計算部540が計算して得たハッシュ値を、文書におけるブロックの位置情報とともに記憶する。ブロックの位置情報については下記に詳述する。
文書グループ化部550は、検索語に基づき検索されて得られた各文書につき、検索語を含むブロックの位置情報を基に、対応するハッシュ値を記憶部545から取り出す。そして、文書グループ化部550は、ハッシュ値が一致する文書をグループ化して、検索結果として出力する。出力された検索結果は、サーチ・ランタイム530へ送られ、サーチ・ランタイム530がクライアント装置200へ返す。クライアント装置200では、Webブラウザが検索結果を受信すると、表示装置へその検索結果を表示させる。
これらの詳細な処理を、図7〜図11を参照して説明する。図7(a)〜(c)は、文書例として、3つの電子メールが示されている。これらの電子メールはいずれも、本文と署名等からなるシグニチャーとから構成され、本文とシグニチャーとの間には空行がある。ここでは、分割情報として「空行」が指定されており、分割部535は、インデックス作成時に、この指定された「空行」という分割情報に基づき、電子メールを、空行で、本文とシグニチャーとの2つに分割する。具体的には、分割部535は、クローラー500が周期的に文書を取得し、パーサー510が構文解析した後、構文解析された文書を、複数のブロックに分割する。
図8は、分割された各ブロックに含まれる文字列にハッシュ関数を適用して各ブロックのハッシュ値を計算したところを示した図である。ブロックに含まれる文字列は、パーサー510によりトークン(分かち書きされた単語)列とされている。ここで、分かち書きとは、日本語の文章において語の区切りに空白を挟んで記述することをいう。図8(a)では、本文の「PHPのソースコードを添付します。よろしくお願いします。」と、シグニチャーの「------ 鈴木 Example Corp Japan XXX@example.co.jp」との間に空行があり、この空行によって2つのトークン列に分割されている。
計算部540は、各トークン列にハッシュ関数を適用し、対応する数値であるハッシュ値を計算する。上記の例でいうと、「PHPのソースコードを添付します。よろしくお願いします。」から計算により「1234567890」を、「------ 鈴木 Example Corp Japan XXX@example.co.jp」から計算により「0987654321」を算出する。ここでは、10桁の数値としてハッシュ値を算出しているが、10桁に限られるものではなく、いかなる桁の数値であってもよい。
文書中の文字は、行方向に、左から右へと配列し、その行が終了すると、その下の行に、左から右へと配列している。このことから、文書中のトークンは、左上隅にあるトークンを先頭に、右下隅にあるトークンまで順に並んでいる。位置情報としては、文書中の先頭トークンから各ブロックに含まれる文字列の先頭トークンまでのトークンの順番を含むことができる。ブロックの位置は、例えば、この順番と、文書中の先頭トークンから各ブロックに含まれる文字列の末尾トークンまでのトークンの順番とを用いて範囲で表すことができ、位置情報としては、その範囲を採用することもできる。
上記の例の「PHPのソースコードを添付します。よろしくお願いします。」では、「PHP」、「の」、「ソースコード」、「を」、「添付」、「し」、「ます」、「。」、「よろしく」、「お願い」、「し」、「ます」、「。」という13のトークンから構成され、「PHP」は最初のトークンであるから0トークンであり、最後の「。」は13トークン目であるから、その位置情報は「0トークン〜12トークン」とすることができる。図8(a)では、これらを「@」という記号を使用して結合し、「1234567890@0トークン〜12トークン」、「0987654321@13トークン〜24トークン」で表されている。これらの情報は、記憶部545に記憶される。
上記例では、位置情報に、文書中の先頭トークンから各ブロックの先頭トークンまでのトークン数を、各ブロックの先頭トークンまでのトークンの順番として用いた。ところが、実際にパーサー510では、同じ単語から複数のトークンが生成される場合がある。例えば、活用形でも検索を行うことができるように、5つの単語しかないのに、6つのトークンが生成されることがある。その一方、検索システムは、何番目のトークンでヒットしたという情報を返すので、上記のようにトークン数から計算した位置情報では、取り出すブロックがずれてしまうことがある。
この場合について「PHPのソースコードを添付します。よろしくお願いします。」という文を、センテンス毎にブロックに分け、その位置情報を計算する場合について説明する。パーサー510では、先頭から順に、「PHP」、「の」、「ソースコード」、「を」、「添付」、「し」、「ます」、「ました」、「。」、「よろしく」、「お願い」、「し」、「ます」、「ました」、「。」という15のトークンを生成したとする。ここで、2つの「ました」は、活用形として生成されたものであり、実際の文には含まれないものである。分割部535は、この文をセンテンス毎に分ける場合、「PHPのソースコードを添付します。」と「よろしくお願いします。」という2つのブロックに分ける。
計算部540は、ハッシュ値を計算するとともに位置情報を計算すると、パーサー510から得られた先頭トークンからのトークン数として「ます」を7番目、13番目、「ました」を8番目、14番目と計算するのではなく、実際に文に含まれない「ました」についてはその直前にある「ます」とトークンが重複する形で配列に並び、「ます」と「ました」の両方を7番目、12番目のトークンとして計算する。
そして、計算部540は、「PHPのソースコードを添付します。」というブロックに対しては、そのブロックの先頭トークンまでの順番と末尾トークンまでの順番とを使用して「ハッシュ値@0−7」、「よろしくお願いします。」というブロックに対しても、同様の順番を使用して「ハッシュ値@8−12」を求め、それらを記憶部545に記憶する。
算出されるハッシュ値は、同じトークンの並びであれば必ず同じものになり、1つのトークンでも異なると、異なったハッシュ値になる。図8(a)、(b)を参照してみると、本文は、一部のトークンが異なっているため、ハッシュ値が「1234567890」と「2345678901」のように異なった値となっており、その一方で、シグニチャーは、いずれのトークンも同じであるため、「0987654321」で同じハッシュ値となっている。図8(c)は、図8(a)、(b)の本文、シグニチャーのいずれも、少なくとも一部のトークンが異なっているため、ハッシュ値が異なった値となっている。
特定の文字種である記号からなるトークンについては、ハッシュ値の計算を行わないようにすることができる。このようにすることで、「こんにちは」という文字列と「>こんにちは」という文字列は、記号「>」の部分が異なるのみで、文字列「こんにちは」の部分が同じであるため、同じハッシュ値を算出することができる。この記号「>」は、電子メールの内容が引用された場合に追加されるものである。したがって、受信した電子メールの内容が引用されて記号「>」が追加されていたとしても、その他のトークンの並びが同じであれば、同じハッシュ値となる。これは、電子メールを検索する場合に有用である。これまでの処理は、インデックス作成時に行われる。なお、ハッシュ値の計算時に除かれる文字種としては、電子メールにおいて内容が引用された場合に追加される「>」や「>>」に限られるものではなく、ユーザが予め指定しておくことにより、その文字種を除いて計算することができる。
クライアント装置200が検索要求を出力すると、サーチ・ランタイム530は、検索要求に含まれる検索語を基に、インデクサー520が作成したインデックスを索引525の中から検索し、検索して得られた文書のテキストやフォーマット情報をストア515から取得する。サーチ・ランタイム530は、これらの情報を文書グループ化部550へ渡す。
文書グループ化部550は、検索結果の文書毎にヒットしたトークンが含まれていたブロックのハッシュ値を、検索語を含むブロックの位置情報を基に記憶部545から取り出し、同一のハッシュ値をもつ文書を1つのグループとしてグループ化する。
サーチ・ランタイム530は、入力された検索語に基づき検索を実行した場合、何番目のトークンでヒットしたという結果を返すが、計算部540がトークン列のトークンの順番を位置情報として計算し、記憶部545に記憶しているので、文書グループ化部550は、サーチ・ランタイム530から返されたトークンの順番に基づきハッシュ値を取り出すことで、適切なハッシュ値を取り出すことができる。
複数のトークン列を含む文書は、分割部535により、複数のブロックに分割され、計算部540により、各ブロックに含まれるトークン列から各ハッシュ値が計算され、各々が記憶部545に記憶されるが、2以上のブロックに検索語が含まれる場合、それら2以上のブロックに含まれるトークン列から計算されたハッシュ値を合計したものを、その文書のハッシュ値として計算し、記憶することができる。
ユーザがクライアント装置200において「鈴木」という検索語を入力し、検索要求を出力した場合、サーチ・ランタイム530は、索引525を検索し、図8(a)〜(c)に示す3つの文書を検索結果として得る。図8(a)〜(c)に示す文書を順に、文書1〜3として参照すると、文書1では、検索語「鈴木」が15トークン目にあり、そのトークンを含むブロックのハッシュ値は、「0987654321」である。文書2では、検索語「鈴木」が17トークン目にあり、そのトークンを含むブロックのハッシュ値は、「0987654321」で、上記文書1と同じである。このため、文書1と文書2は、同じグループとしてグループ化される。
文書3では、検索語「鈴木」が1トークン目にあり、そのトークンを含むブロックのハッシュ値は、「3456789012」で、文書1および文書2とは異なる。このため、文書3は、文書1や文書2とは別のグループとしてグループ化される。
グループ化された文書を検索結果として表示する場合、その文書があるグループに含まれていることが判断できればいかなる表示であってもよく、例えば、図9(b)に示すような表示とすることができる。この図9(b)に示す検索結果は、同じグループにグループ化された文書は、1番目の文書は、通常通り表示されるが、2番目以降は、右にインデントされ、その先頭に縦棒が表示されている。このようにすることで、ユーザは、検索結果の文書間の関連性を一見して判断することができる。なお、グループ化された文書の表示は、上記の縦棒およびインデントに限られるものではなく、字体を変える、識別記号を付する等により識別することができる。
グループ化された文書の配列は、検索スコアを基に行うことができる。検索スコアは、検索語が出現する文書数と全文書数とから、全文書中のどの程度の文書に検索語が出現するかを表す値を求め、その値と検索語の出現回数とを乗じて得られる値とすることができる。このため、出現回数が多い文書ほど高スコアとなり、出現回数が少ない文書ほど低スコアとなる。
図9(a)には、図9(b)との比較のために、グループ化をしない従来の単に検索語「鈴木」に基づいてサーチ・ランタイム530により検索を行った結果を表示している。図9(a)に示す検索結果では、ユーザは、それぞれの検索結果を評価する必要があるが、図9(b)に示す検索結果では、ユーザは、どの結果が重複しているかを一見して判断することができるので、そのうちの1つを評価すればよく、必要な文書を容易に探し出すことが可能となる。
これまで説明してきた実施形態では、ブロックの位置情報をトークンの順番により表してきた。しかしながら、位置情報は、トークンの順番で表すものに限らず、配列する文字の順番によって表すこともできる。図10(a)〜(d)は、電子メールの4つの例、それらをブロックに分けたところ、ハッシュ値と位置情報とを対応付けて表したところを示した図である。
図10に示す実施形態も、分割部535により、空行で、各ブロックに分割されている。図10(a)および(b)に示す文書1および文書2では、本文とシグニチャーの2つに、図10(c)および(d)に示す文書3および文書4では、引用された文章およびシグニチャーに記号「>」や「>>」が追加され、複数の本文とシグニチャーの4および6つに分割されている。
計算部540は、各ブロックに含まれる文字列からハッシュ値を計算し、文書の先頭文字からその文字列の先頭文字までの文字数と、文書の先頭文字からその文字列の末尾文字までの文字数とを使用して表される範囲を位置情報として用い、その位置情報とハッシュ値と対応付けて記憶部545に記憶する。図10(a)に示す文書でいえば、本文の「db2jcc.jarを明日、チェックインします。」と、シグニチャーの「---- 田中」とに分割され、本文に対し「11111111」が算出され、シグニチャーに対し「22222222」が算出されている。この本文は、それ以前に文字が存在しないため、1文字目から開始し、文字数が24文字であることから、位置情報は「1〜24」とされ、シグニチャーが25文字目から開始し、文字数が6文字であることから、位置情報は「25〜30」とされている。
クライアント装置200からの検索要求を受けて、サーチ・ランタイム530が索引525の中から文書を検索する。ここでは、検索語として「db2jcc.jar」が入力されている。サーチ・ランタイム530は、この「db2jcc.jar」を含む文書を検索し、検索結果を文書グループ化部550へ渡す。文書グループ化部550は、その「db2jcc.jar」を含むブロックのハッシュ値が同じ文書を1つのグループにグループ化する。この実施形態では、文書1、3、4が同じ「11111111」というハッシュ値をもつため、文書グループ化部550は、これらを同じグループにグループ化する。文書2については、「db2jcc.jar」を含むブロックのハッシュ値が「33333333」と異なるため、文書グループ化部550は、異なるグループにグループ化する。
文書グループ化部550は、グループ化した検索結果をサーチ・ランタイム530へ返し、サーチ・ランタイム530がクライアント装置200へその検索結果を送信する。このときのグループ化した検索結果の一例を、図11(a)、(b)に例示する。検索結果は、一見して分かるように、同じグループに属する文書の2番目以降がインデントされている。図11では、文書1、3、4が、同じグループとされ、文書2が別のグループとされている。
本発明では、検索対象となる文書を、複数のブロックに分割し、各ブロックに含まれる文字列からハッシュ値を計算し、計算したハッシュ値にそのブロックの位置情報を対応付けて記憶している。このため、ハッシュ値と位置情報を記憶する分だけ、メモリ使用量が増加する。メモリ使用量の大幅な増加は、プロセッサの処理速度の大幅な低下を招いてしまう。
そこで、どの程度メモリ使用量が増加するかについて検討した。格納される文書(電子メール)の数が11830、センテンス数が512127のメール・コーパスをデータソースとして使用した。文書の分割は、センテンス毎で行い、ハッシュ値は、8バイトの長さ、位置情報は、文書の先頭トークンからセンテンスの先頭トークンまでの順番を表すトークン番号と、文書の先頭トークンからセンテンスの末尾トークンまでの順番を表すトークン番号とした。
この条件の下、インデックスを格納するために使用されるメモリ使用量は、従来のインデックスを格納するのみで、ハッシュ値を記憶しない場合には、93995008バイトとなり、本発明のインデックスに加えてハッシュ値も記憶する場合には、98820096バイトとなった。これは、1センテンス当たり、9.42バイトの増加で、メモリ使用量は、約5%増加しただけであった。このことから、メモリ使用量が大幅に増加することはなく、プロセッサの処理速度に影響はないものと考えられる。
検索対象となる文書は、テキストが抽出できる文書であればいかなる文書であってもよく、テキストファイル、オフィス文書、電子メール等を挙げることができる。なお、データ・フォーマットが異なる文書でも、抽出されたテキストと分割情報が同一であれば、関連する文書であるか否かを検出することができる。このため、ブロックの分割は、同じ区切り方でなければならない。区切り方が異なれば、関連する文書の判断が変わるからである。
検索システムが文書毎に持つべき情報としては、上記の文書を構成するトークン列、どのように分割するかを示す分割情報のほか、文書の識別情報(例えば、文書番号)、ハッシュ値に含める文字情報等を挙げることができる。トークン列および文書の識別情報は、パーサー510から受け取るが、分割情報は分割部535が、ハッシュ値に含める文字情報は計算部540がそれぞれ保持する。
また、インデックス作成時に記憶し、検索時に使用する情報としては、ハッシュ値、ブロックの位置情報のほか、文書の識別情報を挙げることができる。これらは、記憶部545に記憶され、検索時に、文書グループ化部550により読み出される。
これまで、本発明の検索システムおよびその検索システムにより実行される検索方法を、図面を参照して詳細に説明してきたが、本発明は上記実施の形態に限定されるものではなく、他の実施形態や、追加、変更、削除など、当業者が想到することができる範囲内で変更することができ、いずれの態様においても本発明の作用・効果を奏する限り、本発明の範囲に含まれるものである。本発明は、コンピュータ読み取り可能なプログラムとして構成し、コンピュータにそのプログラムを実行させることにより、検索システムとして実現することができ、そのプログラムは、記録媒体に格納して提供することができる。