以下、本発明の実施形態について、図面を参照して説明する。
図1は、構造化文書データ(構造化データ)の一例である。構造化文書を記述するための代表的な言語としてXML(eXtensible Markup Language)が挙げられる。図1に示す構造化文書はXMLで記述されたものである。XMLでは、文書構造を構成する個々のパーツを「要素」(エレメント:Element)と呼び、要素はタグ(tag)を使って記述する。具体的には、要素の始まりを示すタグ(開始タグ)と、終わりを示すタグ「終了タグ」)の2つのタグでテキストデータを挟み込んで、1つの要素を表現している。なお、開始タグと終了タグで挟み込まれたテキストデータは、当該開始タグと終了タグで表された1つの要素に含まれるテキスト要素である。
図1に示す構造化データは、<book>というタグで囲まれた要素をルート要素とする。この「book」要素は、<title>、<authors>、<abstract>の各タグで囲まれた3つの子要素を有する。「authors」要素は、<author>というタグをもつ2つの子要素を有する。各「author」要素には、<first>、<last>という各タグで囲まれた子要素が存在する。「first」要素と「last」要素は、それぞれ「太郎」や「田中」といったテキスト要素を持っている。
図2は、本実施形態に関る構造化文書管理システムの機能的な構成例を示したものである。構造化文書管理システムは、大きく分けてクライアント201とサーバ101とから構成されている。クライアント201からの格納要求や検索要求を受けて、サーバ101が各要求に対応する処理を行う。
クライアント201は、主に、構造化文書登録部202と検索部201と入力部204と表示部205を有する。キーボードやマウス等の入力装置からなる入力部204は、構造化文書を入力したり、各種指示入力を行うためのものである。構造化文書登録部202は、入力部204から入力された構造化文書や、クライアント201のもつ記憶装置などに予め記憶された構造化文書を構造化文書データベース111に登録するためのものである。構造化文書登録部202は、格納要求とともに登録すべき構造化文書をサーバ101へ送信し、また、更新要求とともに、更新された構造化文書をサーバ101へ送信する。検索部203は、入力部204からユーザにより入力された指示に従って、構造化文書データベース111から所望のデータを検索するための検索条件などが記述された問合せデータを作成し、当該問合せデータを含む検索要求をサーバ101へ送信する。また、サーバ101から送信された当該検索要求に対応する結果データを受け取り、それを表示部205に表示する。
サーバ101は、要求処理部102、格納処理部103、検索処理部104から構成されている。また、サーバ101には構造化文書データベース(構造化文書DB)111が接続されている。構造化文書データベース111は、構造化文書データ記憶部112と構造テンプレート記憶部113と索引データ記憶部114とから構成されている。
要求処理部102は、クライアント201から送信される格納要求、更新要求、検索要求を判別し、格納処理部103や検索処理部104などへ処理の振り分けを行い、格納処理部103や検索処理部104での処理結果をクライアント201に返す。
格納処理部103は、クライアント201からの格納要求を受けて、クライアント201から送信された新たな構造化文書を構造化文書データベース111に格納する処理を行う。また、クライアント201からの更新要求を受けて、クライアント201から送信された更新された構造化文書を基に、既に構造化文書DB111に登録されている元の構造化文書のデータを更新するための処理を行う。
格納処理部103は、構造化文書構文解析部31と構造化文書構造抽出部32と構造化文書構造照合部33と構造化文書格納部34から構成される。
新たな構造化文書を構造化文書DB111に登録する場合には、構造化文書構文解析部31は、要求処理部102から渡された新たな構造化文書を構文解析し、その解析結果を基に構造化文書構造抽出部32では当該構造化文書の(文書)構造を抽出する。構造化文書構造照合部33は、抽出された構造と構造化文書データベース111に記憶された構造テンプレートとを照合する。構造化文書格納部34は、構造化文書構造照合部33での照合結果を基に、当該新たな構造化文書の各要素にオブジェクトID及び更新フラグ(後述するように、新規登録の場合は常に値は「0」)を与えて、構造化文書データベース111の構造化文書データ記憶部112に格納するとともに、索引データを索引データ記憶部114に格納する。
既に構造化文書DB111に登録されている構造化文書を更新する場合(例えば、当該構造化文書に新たな要素を追加する場合)には、構造化文書構文解析部31は、要求処理部102から渡された更新された構造化文書を構文解析し、その解析結果を基に構造化文書構造抽出部32では当該更新された構造化文書の(文書)構造を抽出する。構造化文書構造照合部33は、抽出された構造と構造化文書データベース111に記憶された構造テンプレートとを照合する。構造化文書格納部34は、構造化文書構造照合部33での照合結果と、既に構造化文書データ記憶部112に記憶されている元の構造化文書のデータと、その各要素のOIDとを基に、新たに追加された要素にオブジェクトID及び更新フラグ(後述するように、更新により新たな追加された要素の場合には、値「1」)を与えて、構造化文書データベース111の構造化文書データ記憶部112に格納するとともに、索引データを索引データ記憶部114に格納する。
検索処理部104は、クライアント201からの検索要求を受けて、指定された条件(問合せデータ)に合致するデータを構造化文書データベース111から探し出し、得られたデータを結果データとして返す処理を行う。検索処理部104は、問合せ構文解析部41と問合せ構造抽出部42と問合せ構造照合部43と問合せ実行部44から構成される。
問合せ構文解析部41は、要求処理部102から渡された問合せデータを構文解析し、その解析結果を基に問合せ構造抽出部42では、当該問合せデータの構造を抽出する。問合せ構造照合部43は、抽出された構造と構造化文書データベース111に記憶されている構造テンプレートとを照合する。問合せ実行部44は、問合せ構造照合部43での照合結果を基に、構造化文書データベース111に記憶されている構造化文書データや構造テンプレートや索引データにアクセスして、問合せデータに記述された条件に合致する結果データを生成する。
図3は、サーバ101のハードウエア的な構成例を示したもので、バス1に通信I/F装置2、可搬記録媒体ドライブ装置3、表示装置4、入力装置5、出力装置6、演算装置(CPU)7および外部記憶装置8並びにメモリ9が接続されて構成されている。さらに、図3に示す構成では、バス1に、図2の構造化文書データベース111が接続されている。
図2の要求処理部102と格納処理部103と検索処理部104のそれぞれの機能を実現するためのプログラムは、図3の外部記憶装置8に予め記憶され、必要に応じて、各プログラムがメモリ9に読み込まれて実行される。
以下、図2を参照して説明する。
まず、構造化文文書DB111での構造化文書の格納方法について説明する。
図4は、構造化文書データ記憶部112のデータ構造を模式的に表したものである。構造化文書データ記憶部112には、論理的には、大量の構造化文書が「root」ノード301をルートする1つの構造化文書の部分文書として記憶されている。図4では、この「root」ノード301をルートする1つの構造化文書の構造をノードとアークから構成される階層木で表している。各ノードは構造化文書の要素(テキスト要素を含む)を示し、要素間の親子関係をアークで示している。実装上は、ノードはオブジェクトデータのファイルとして構造化文書データ記憶部112に格納される。各ノードには、オブジェクトID(OID)と呼ばれる識別子が割当てられている。なお、図4では、説明の簡単のため、OIDを「0」〜「47」の数字で表している。OIDを指定することで所望のオブジェクトデータを取り出すことができる。
ノード間の親子関係を表わすアークは、オブジェクトデータ間のリンクであり、このリンクはオブジェクトデータ内に子要素及び親要素のオブジェクト集合を指すOID配列として、構造化文書データ記憶部112に記憶される。
「root」ノード301の下には「bookFolder」、「paperFolder」の2つのノード302、303が存在する。「bookFolder」ノードの下には、2つの「book」ノード304、305が存在する。OIDが「2」の「book」ノードには、図1で示した構造化文書データが格納されている。
このように「root」ノード以下のデータは、複数の構造化文書のそれぞれの各要素からなる1つの大きな構造化文書データであり、図1で示した構造化文書データは、当該大きな構造化文書データの一部分として格納されている。例えば、図1の構造化文書<book>…</book>は、図4の構造化文書では、<root><bookFolder><book>…</book><bookFolder><root>と表すことができる。
なお、このような複数のノードからなる階層構造は、汎用のOSで広く採用されているディレクトリ構造に当てはめると、これら各ノードは、ディレクトリ構造のフォルダとファイルに対応する。すなわち、図4に示す階層構造は、「root」フォルダの下に、「bookFolder」、「paperFolder」という2つの子フォルダがあり、「bookFolder」フォルダの下に、「book」という要素をルートに持つ2つのドキュメントファイル311、312が存在し、「paperFolder」フォルダの下に、「paper」という要素をルートに持つ1つのドキュメントファイル313が存在するディレクトリ構造で構造化文書データ記憶部112に記憶される。
以下、「root」ノード、「bookFolder」ノード、「paperFolder」ノードをフォルダと解釈し、フォルダ以下のデータをまとめてドキュメントファイルと解釈する。例えば、図4の場合、「bookFolder」フォルダに2つの「book」ドキュメント(ファイル311、312)が格納され、「paperFolder」フォルダに1つの「paper」ドキュメント(ファイル313)が格納されていると解釈することができる。
図5は、従来の構造化文書DBの構成例である。構造化文書DBに対する検索を行うには、問合せデータを与える必要がある。問合せデータには、テキスト(単語などの文字列)を検索条件として指定したもの、構造化文書の構造を検索条件として指定したもの、あるいは両者を組み合わせて検索条件として指定したものがある。問合せデータに単語などの文字列が検索条件として含まれる場合、構造化文書管理システムでは高速に検索を行うため、語彙索引データを用いる。語彙索引データとは、格納された構造化文書データに含まれるテキスト要素のテキストデータ(文字列)を抽出し、テキストデータと当該テキストデータを含む構造化文書データ中の要素のオブジェクトID(OID)との対応関係を表す情報である。
図5に示す構造化文書DBには、構造化文書データを格納する構造化文書データ記憶部と、索引データを格納する索引データ記憶部から構成されている。
図1で示した構造化文書データには、「XMLデータベース」、「XMLデータの検索技術」、「田中」、などのテキストデータが含まれている。これらのテキストデータを字句解析することで「XML」、「データ」、「データベース」などの語彙(文字列)に分解している。
索引データ記憶部には、語彙テーブルと当該語彙テーブル中の各語彙にリンクされた当該語彙を含むテキスト要素のOIDを記録する複数のテーブルが記憶されている。語彙テーブル中の語彙からリンクをたどることで、その語彙を含むテキスト要素の出現位置、つまりOIDが得られる。
図6は、本実施形態に関る構造化文書DB111の構成例である。構造化文書データ記憶部112は図5と同じであるが、新たに構造テンプレート記憶部113及び文書ID記憶部115が追加されている。また、索引データ記憶部114は、語彙テーブルと当該語彙テーブル中の各語彙にリンクされた当該語彙を含むテキスト要素のOID及び更新フラグ(後述)を記録する複数のテーブルが記憶されている。語彙テーブル中の語彙からリンクをたどることで、その語彙を含むテキスト要素の出現位置、つまりOIDと、更新フラグの値が得られる。
構造テンプレート記憶部113には、構造テンプレートデータが格納されている。構造テンプレートデータには、構造化文書データ記憶部112に格納されている構造化文書データから抽出された構造データが格納されている。
図4に示したように、構造化文書DB111に、2つの「book」ドキュメントファイル311、312と、1つの「paper」ドキュメントファイル313が記憶されている場合に、構造テンプレート記憶部113に記憶されている構造テンプレートデータを図7に示す。図4では、フォルダやドキュメントファイルが階層的に配置されていた。図7の構造テンプレートデータは、「root」、「bookFolder」、「paperFolder」という3つのフォルダ351〜353からなる階層構造と、「bookFolder」というフォルダに格納されている2つのドキュメントの文書構造のベース(基準)となる文書構造(要素(テキスト要素を含む)361〜369で構成される階層構造)と、「paperFolder」というフォルダに格納されている1つのドキュメントの文書構造のベース(基準)となる文書構造(要素(テキスト要素を含む)381〜389で構成される階層構造)を表したものである。
図4では、「book」ドキュメントファイル311は、その先頭のノードである「book」ノード304直下に「authors」ノードがあり、その下には2つの「author」ノードがあったが、図7に示し構造テンプレートでは、「author」ノードは1つにまとめられて、テキストノード(テキスト要素)は「#text」ノードとして表されている。
図7の構造テンプレートデータの六角形で表された各ノード(各ノードは、フォルダ、ファイル、要素、テキスト要素に対応する)には、「F0」、「D2」、「E3」、「T4」などのユニークなIDが割り振られている。構造テンプレートデータの各ノードの種別や構造上の位置を識別するために、各ノードに割り振られたIDをテンプレートID(TId)と呼ぶ。
テンプレートIDについて説明する。テンプレートIDは、構造テンプレート上の当該ノードの種類を表す情報と、同じ種類のノードのなかで各ノードを識別するための番号とから構成されている。ノードの種類は、「F」「D」「E」「T」という4種の文字により表されている。「F」はフォルダ、「D」はドキュメントファイル、「E」は要素(テキスト要素ではない要素)、「T」はテキスト要素を表す。ノードの種類を表す文字とそれに続く番号「x」とからなるテンプレートIDにより、当該ノードの種類と、当該テンプレートIDを持つノードが構造テンプレート上のどのノードであるかを識別することができる。
テンプレートIDが「Fx」であるノードはフォルダを表し、これをフォルダ型構造テンプレートノードと呼ぶ。テンプレートIDが「Dx」であるノードはドキュメントを表し、ドキュメント型構造テンプレートノードと呼ぶ。テンプレートIDが「Ex」であるノードはドキュメント内の要素(テキスト要素でない要素)を表し、エレメント型構造テンプレートノードと呼ぶ。テンプレートIDが「Tx」であるノードはドキュメント内のテキスト要素を表し、テキスト型構造テンプレートノードと呼ぶ。なお、ここでは、「x」は、構造テンプレートデータの各ノードにユニークなシリアルな整数とする。
本実施形態に関る構造化文書データ記憶部112には、図4の「root」ノード301や「bookfolder」ノード302、「paperfolder」ノード303、「book」ドキュメントや「paper」ドキュメントの各要素(テキスト要素を含む)に対応する各ノードを識別するためのOIDには、上記テンプレートIDが含まれている。
図8は、図4と同様、構造化文書データ記憶部112に格納されている構造化文書データの記憶例を模式的に示したものである。図8では、各ノードのOIDを図4よりも詳細に示している。すなわち、本実施形態では、データファイルに格納されている構造化文書データの各ノードのOIDは、ドキュメントID(DocID)、要素ID(ElemId)、上記テンプレートID(TId)から構成されている。さらに、各要素にはOIDとともに、更新フラグが付加されている。ここでは、OIDを<DocId,ElemId,TId>と表し、このOIDに次に、更新フラグを示している。すなわち、図8では、各要素が、「<DocId,ElemId,TId>,更新フラグ」という情報を有していることを示している。
DocIdとは、ドキュメント、フォルダに割当てられるデータファイル内でユニークなIDであり、ドキュメントファイルの識別子、フォルダの識別子である。本実施形態では、このDocIDは、ドキュメントやフォルダの構造化文書DB111への登録順(登録日時の早い順)に、番号「0」「1」「2」…と割り振るものとする。従って、このDocIDは、当該DocIDをもつドキュメントやフォルダの構造化文書DB111への登録順を示している。
一方、構造化文書DBに登録される各文書には、上記登録順の他に、各文書の内容(例えば、各文書が1つの大きな文書のうちの一部分であり、第1章、第2章、…という順番を有するものである場合など)に基づく文書順を有する。そして、この文書順は上記登録順とは一致しない場合がある。例えば、先に第3章の文書、第2章の文書を作成して登録した後に第1章の文書を登録する場合には、第1章の文書の登録順は3番目であるにも関わらず、文書順は1番目である。
そこで、本実施形態では、構造化文書DBに登録される各文書を従来同様、DocIDを用いて登録順に管理するとともに、後述するように、文書順も管理するようになっている。文書ID記憶部115は、登録順と文書順が一致するような文書については、第1の文書IDリスト115aで、当該文書の登録順を示すDocIDを登録し、登録順と文書順が一致しないような文書については、第2の文書IDリスト115bで、当該文書の登録順を示すDocIDと文書順を示す情報(ここでは、当該文書を2つの文書の間に挿入する場合、例えば当該2つの文書のDocIDの中間値)とを登録する。
文書順が予め定められている複数の構造化文書を、この文書順に従って、構造化文書DB111に登録すれば登録順すなわち文書IDと文書順とは一致する。しかし、文書順が1番目の構造化文書を、文書順が2番目の構造化文書を登録した後に登録する場合、文書順が2番目のDocIDが「1」である場合、文書順が1番目のDocIDは「2」となる。すなわち、文書順の番号が大きい方の構造化文書の登録順の番号が小さくなってしまう。そこで、文書順が1番目の構造化文書には、DocID「2」の他に、当該構造化文書の文書順を示す情報として、文書順が当該構造化文書の直前および直後の構造化文書のうちの少なくとも1つのDocIDに対する当該構造化文書の文書順を示す相対値を付与する。この場合、文書順が2番目のDocID「1」の構造化文書の直前に文書順が1番目の構造化文書を配置すればよく、そのために、DocID「1」の構造化文書より文書順が前であること示すため、例えば「0.5」や「0.2」などDocID「1」よりも小さい値を、DocID「2」の構造化文書の文書順を示す情報として用いる。
また、文書順が1番目の構造化文書と、文書順が3番目の構造化文書とをこの順に構造化文書DB111に登録した後、文書順が2番目の構造化文書を構造化文書DB111に登録する場合を考える。このとき、文書順が1番目の構造化文書、文書順が3番目の構造化文書のDocIDはそれぞれ「1」「2」であるとする。文書順が2番目の構造化文書のDocIDは「3」となる。
この場合、文書順が1番目のDocID「1」の構造化文書と、文書順が3番目のDocID「1」の構造化文書との間に、文書順が2番目の構造化文書を配置すればよく、そのために、DocID「1」の構造化文書より文書順が後であり、かつ、DocID「2」の構造化文書より文書順が前であること示すため、例えば「1.5」や「1.1」「1.9」などDocID「1」よりも大きくDocID「2」よりも小さい値を、DocID「3」の構造化文書の文書順を示す情報として用いる。
ElemIdは、各ドキュメント内の各要素に割当てられる各ドキュメント内でユニークなIDである。TIdとは、前述したように構造テンプレートデータ内のノードが持つID、すなわち、テンプレートIDである。
例えば、図10に示すように、「root」ノード301、「bookFolder」ノード302、「book」ノード304、「book」ノード305をこの順に構造化文書DB111へ登録した場合には、「root」ノード301のDocIDは「0」、「bookFolder」ノード302のDocIdは「1」、「book」ノード304のDocIDは「2」、「book」ノード305のDocIDは「3」となる。その後、さらに、「paperFolder」ノード303や「paper」ノード306が構造化文書DB111に登録された場合には、「paperFolder」ノード303にDocID「4」、「paper」ノード306にDocID「5」が付与されることになる。このように、DocIdにより、データファイル中のフォルダやドキュメントファイルをそれぞれ識別することができる。
また、DocIdが「2」の「book」ノード以下の「book」ドキュメント中の各要素(テキスト要素を含む)には、それぞれ、「0」〜「14」というElemIdが与えられている。このElemIdにより、当該ドキュメント内での各要素を識別することができる。このElemIDも当該ドキュメント(文書)内の各要素の存在位置に応じて、例えば、図1の構造化データでは、先頭から順番に「0」「1」「2」…とElemIdが与えられる。すなわち、図8の「book」ノード304以下のドキュメントツリー(階層構造)に示すように、上位階層の要素(同じ階層に複数の要素が存在する場合には、より左側に配置されている要素)から順に深さ優先で各要素にElemIdが与えられる。各要素に与えられる要素IDの値は、文書内での当該要素の出現順を表すものと云える。
さらに、DocIdが「2」の「book」ノード以下の「book」ドキュメント中の各要素(テキスト要素を含む)には、図7に示す構造テンプレート中の当該要素に対応するノードのTIdが与えられている。
このように、ドキュメントファイル内のある要素のOIDを見れば、当該OIDに含まれるDocIdからは当該OIDをもつノードを含むドキュメントファイルを識別することができるとともに、当該OIDをもつノードを含むドキュメントファイルの構造化文書DB111への登録順を識別することができる。当該OIDに含まれるTIdからは当該ノードの構造テンプレート中の存在位置とノードの種別を識別することができ、ElemIdからは当該ノードの当該ドキュメント中の存在位置を識別することができるのである。
例えば、図8の「book」ドキュメント311に含まれるテキストノード(テキスト要素)「XMLデータベース」は、<2、2、T4>というOIDを持っている。このOIDからは、当該テキストノードが属するドキュメント311のDocIdは「2」であることがわかる。また、当該テキストノードは、当該ドキュメント311内では「2」というElemIdを持っている。さらにこのテキストノードは、構造テンプレートデータ内では、図7の「T4」というTIdを持つノードに対応している。
このように、本実施形態では、構造化文書DB111に格納される構造化文書の各要素は、当該要素が属するフォルダ、ファイルの識別子であるDocIdと、当該要素が属するファイル内で当該要素を識別するためのElemIdと、当該要素に対応する構造上の識別子であるTIdとを含むOIDにより識別される。
さらに、構造化文書DB111に格納される構造化文書の各要素は、上記OIDの他に更新フラグを有している。更新フラグは、構造化文書DB111に登録されている各構造化文書の各要素が更新により追加された要素であるか否かを識別するための情報である。例えば、新たな構造化文書を構造化文書DB111に登録する際には、当該新たな構造化文書の各要素の更新フラグの値は「0」である。既に構造化文書DB111に登録されている任意の構造化文書に対し新たな要素を追加する更新を行った場合、当該新たな要素の更新フラグの値は「1」である。
図9は、本実施形態に関る索引データ記憶部114に記憶される索引データのデータ構造を模式的に示したものである。索引データ記憶部114は、図5と同様、語彙テーブルと当該語彙テーブル中の各語彙にリンクされた当該語彙を含むテキスト要素のOIDを記録する複数のテーブルが記憶されている。語彙テーブル中の語彙からリンクをたどることで、その語彙を含むテキスト要素の出現位置、つまりOIDが得られる。
図9に示した索引データと図5に示した索引データとの異なる点は、図9に示した索引データでは、OIDが<DocId、ElemId、TId>と、3つのIDで表されている点と、OIDに更新フラグが付加されている点である。なお、図9では、語彙テーブル中の各語彙にリンクされた当該語彙を含むテキスト要素のOID及び更新フラグとを「DocId、ElemId、TId、更新フラグ」と列挙した形で示している。
構造化文書データ記憶部112に格納されている各フォルダ、ドキュメントのDocIDは、文書ID記憶部115に記憶されている。文書ID記憶部115は、第1の文書リスト115aと第2の文書リスト115bが記憶されている。第1の文書リスト115aには、各文書の内容に基づく文書順(この文書順は、当該文書の格納時にユーザにより指定された格納先により定まる)が登録順のとおりであるような各文書のDocIDが登録されている。第2の文書IDリスト115bには、文書順が登録順に一致しない文書のDocID及び文書順を示す情報が登録されている。文書順が登録順に一致しない文書とは、例えば、登録順が最後であっても、文書順が、DocID「2」の文書とDocID「3」の文書の間であるような文書である。
構造化文書データ記憶部112では、各構造化文書の各要素に対応するオブジェクトデータをOID及び更新フラグとともに格納する。各文書の階層構造を表すオブジェクトデータ間の親子関係を示すリンクは、各オブジェクトデータ内に子要素及び親要素のオブジェクト集合を示すOID配列として記憶されている。
(格納処理:新規登録)
次に、図11に示すような構造化文書A(以下、文書Aと呼ぶ)を図10に示したような状態の構造化文書DB111に登録する場合を例にとり、図12〜図13に示すフローチャートを参照して、図2の格納処理部103の処理動作について説明する。
なお、図10では、説明の簡単のため、フォルダ、ドキュメントファイルのノードについてのみ、OID及び更新フラグを示している。
クライアント201の構造化文書登録部202からは、新たに格納すべき文書Aと、その格納先を示す情報を含む格納要求メッセージが送信される。(a1)格納先として、単にフォルダのみが指定されている場合に当該フォルダ内に文書Aを格納する場合と、(a2)フォルダ及び当該フォルダ内に既に格納されている文書の直前に文書Aを挿入する場合とに分けて説明する。後者は、構造化文書DB111内に既に格納されている文書の順序が変更される場合である。
なお、クライアント201では、格納先を次のようにして得ることができる。クライアント201の検索部203には、例えば、図10に示すような構造化文書DB111の概略構造を表示するためのGUIを有している。このGUIにより表示された構造からユーザが格納先のフォルダとして「bookFolder」ノード302を指示したときには、当該ノードに対応するOIDを得るための問合せデータが作成され、サーバ101へ送信される。サーバ101では、当該問合せデータから、当該指示されたノードのOIDを獲得して、クライアント201の検索部203へ返す。検索部203は、この得られたフォルダのOID(これをOIDpと示す)を格納先として構造化文書登録部202へ渡す。
また、上記GUIにより表示された構造からユーザが、文書Aの文書順が図10の「bookFolder」ノード302の子要素として格納されているドキュメント311とドキュメント312の間にするために、例えば、「bookFolder」ノード302の子要素として格納されているドキュメント311とドキュメント312の間を格納先として指示したときには、ドキュメント311とドキュメント312のそれぞれのルートノード304、305に対応するOIDを得るための問合せデータが作成され、サーバ101へ送信される。サーバ101では、当該問合せデータから、当該各ルートノードのOIDを獲得して、クライアント201の検索部203へ返す。検索部203は、この得られた各OID(これをOIDp(1)、OIDp(2)と示す)を格納先として構造化文書登録部202へ渡す。
まず、上記(a1)の場合について説明する。
サーバ101の要求処理部102では、文書Aと格納先のフォルダのOIDpを含む格納要求メッセージを受け取る(ステップS1)。ここでは、例えば、「bookFolder」302に対応するOID(<1,0,F1>)が格納先のフォルダOIDとして指定され、このフォルダ下に新たに文書Aを格納するケースを考える。
格納要求メッセージに含まれる、格納すべき構造化文書データ、すなわち文書Aが、格納処理部103の構造化文書構文解析部31へ渡されて、当該文書Aの構文解析が行われる。その結果得られるものは、文書Aの複数のオブジェクトデータからなる階層構造であり、メモリ上に展開される(ステップS2)。すなわち、構造化文書構文解析部31は、XMLデータである構造化文書データに対し、構文解析処理を行うことによりDOM(Document Object Model)形式のオブジェクトデータに展開するXMLパーサに相当する機能を有するものである。
さらに、文書ID記憶部115に記憶されているDocIDを参照して、当該文書Aに対し、新たなドキュメントID(DocID)を付与する(ステップS3)。この(a1)の場合、文書Aの新規登録であり、当該文書Aには、DocIDをまだ付与されていない。また、格納先としてフォルダが指定されており、文書順を変更する登録ではない。
図10に示した状態の構造化文書DB111の場合の、文書ID記憶部115に記憶されている第1及び第2の文書IDリスト115a、115bを図14に示す。図14に示すように、第1の文書IDリスト115aには、DocIDが既に「5」まで登録されて(使用されている)、第2の文書IDリスト115bには1つもDocIDが登録されていないから、文書AのDocIDは「6」となる。従って、図15に示すように、第1の文書IDリスト115aに、文書AのDocID「6」が登録される。
次に、構造化文書構造抽出部32は、構造化文書構文解析部31での解析結果をそのルートから辿ることによって、文書Aの構造、すなわち、当該文書A中の各要素に対応する複数のードと、当該複数のノードからなる構造を抽出する。文書Aの構造をScとする(ステップS4)。
構造化文書構造照合部33は、格納先フォルダのOIDpをキーに構造テンプレート記憶部113から構造を取得する。ここでは、OIDpが<1,0,F1>であるので、まず、TID「F1」を取得する。このOIDpから取得したTIDをTIDpと表す。構造化文書構造照合部33は、TIDpをキーにして構造テンプレート記憶部113をスキャンすることで、対応する構造を取得できる(ステップS5)。取得した構造をSpとする(ステップS6)。
構造化文書構造照合部33は、ScとSpの照合を行う(ステップS7)。これはツリーの単純なマッチングである。すなわち、Scの構造要素に対応するSpの構造要素があれば、当該Scの構造要素に当該Spの構成要素のTIdを付与する。Scの構造要素に対応するSpの構造要素がなければ、Spに存在せずに、Scに存在する新たな要素に新たなTIdを付与し、Spに当該新たな要素を追加する。また、Scの当該新たな要素に当該新たなTIdを付与する。この操作をScの全ての構造要素に対し行う。
文書Aは新規に登録されるから(ステップS8)、構造化文書構造照合部33は、Scの各要素に要素ID(ElemID)を付与する(ステップS9)。例えば、Scの構造をルートノードから下流方向へ辿りながら、各要素に対しElemIDを付与する。
以上の処理により、当該Sc内の各要素に対し、<DocId,ElemID,TId>という構成のOIDが与えられたことになる。すなわち、文書AのルートノードのOIDは、<DocId,0,TId>=<6,0、D2>となっている。また、文書Aは新規に登録されるから、Scの各要素には、OIDの他に更新フラグ「0」が付与される(ステップS10)。
最後に、構造化文書格納部34は、更新されたSpを構造テンプレート記憶部113に格納する。これにより、構造テンプレート記憶部113に格納される構造テンプレートの更新がなされる。
また、構造化文書格納部34は、Scを構成する複数の要素のうち、テキスト要素を基に、索引データ記憶部114を更新する(図13のステップS11)。ここで、テキスト要素のテキストデータから語彙(文字列)を抽出し、抽出した語彙が図9に示すような語彙テーブル中に無ければ、それを追加する。そして、各テキスト要素のOID及び更新フラグを、当該テキスト要素のテキストデータに含まれる語彙テーブル中の語彙にリンクして記憶する。
さらに、構造化文書格納部34は、構造化文書データ記憶部112内をスキャンすることで、格納先のOIDpに対応するオブジェクトを取得し、当該オブジェクトデータの子要素のオブジェクトの集合を示すOID配列に、当該文書AのルートノードのOIDを追加する。すなわち、構造化文書データ記憶部112に、各要素に上記のようなOID及び更新フラグの付された文書Aが、OIDpが<1,0,F1>の「bookFolder」302の直下の最後に追加される形で、文書Aが格納される(ステップS12)。図16は、文素Aを格納した後の構造化文書データ記憶部112のデータ構造を模式的に表したもので、文書順(この場合は登録順と同じ)に、フォルダと各文書のルートノードのみを示し、各文書の階層構造は省略して示している。
次に、上記(a2)の場合について説明する。
サーバ101の要求処理部102では、文書Aと格納先のOIDp(OIDp(1)、OIDp(2))を含む格納要求メッセージを受け取る(ステップS1)。ここでは、例えば、ドキュメント311,312のルートノード304,305に対応するOID(<2,0,D2>、<3,0,D2>)が格納先のOIDpとして指定され、文書Aの文書順がこの2つの文書の間となるように、新たに文書Aを格納するケースを考える。
上記(a1)の場合と同様に、図12のステップS2において、文書Aの複数のオブジェクトデータからなる階層構造を求めた後、ステップS3において、当該文書Aに対し、新たなドキュメントID(DocID)を付与する。この(a2)の場合、文書Aの文書順は登録順(番号)とは異なる。
図10に示した状態の構造化文書DB111の場合、図14に示すように、第1の文書IDリスト115aには、DocIDが既に「5」まで登録されて(使用されている)、第2の文書IDリスト115bには1つもDocIDが登録されていないから、文書AのDocIDは「6」となる。しかし、格納先として指定されている位置は、図10のDocIDが「2」のドキュメント311、DocIDが「3」のドキュメント312の間である。すなわち、文書順と登録順とは一致しない。この場合には、文書Aの文書順を、DocID「2」と「3」の間の中間の値、例えば、「2.5」とする。そして、文書AのDocID「6」と文書順「2.5」とを1組にして、図17に示すように、第2の文書IDリスト115bに登録する。
以下の処理は、前述の(a1)の場合と同様である。
そして、図13のステップ12では、構造化文書格納部34は、構造化文書データ記憶部112内をスキャンすることで、格納先の2つのOIDp<2,0,D2><3,0,D2>の上位階層のフォルダに対応するオブジェクト(この場合、OID<1,0,F1>の「bookFolder」)を取得し、当該オブジェクトデータの子要素のオブジェクトの集合を示すOID配列に、当該文書AのルートノードのOIDを追加する。すなわち、構造化文書データ記憶部112に、各要素に上記のようなOID及び更新フラグの付された文書Aが、OIDpが<1,0,F1>の「bookFolder」302の直下の最後に追加される形で、文書Aが格納される(ステップS11)。図18は、文素Aを格納した後の構造化文書データ記憶部112のデータ構造を模式的に表したもので、文書順(この場合は登録順とは異なる)に、フォルダと各文書のルートノードのみを示し、各文書の階層構造は省略して示している。
図19は、文書Aの複数のオブジェクトデータからなる階層構造を示したものである。
図20は、構造化文書データ記憶部112での各構造化文書の記憶方法を説明するための図である。各構造化文書の各要素に対応するオブジェクトデータは、図20に示すように、OID及び更新フラグとともに格納されている。なお、図20では、各オブジェクトデータに含まれる、各文書内のオブジェクトデータ間の親子関係を表す、子要素及び親要素のオブジェクト集合を示すOID配列は省略して示している。
構造化文書データ記憶部112に記憶された文書のうち、登録順と文書順が異なる文書のDocIDについては、その文書順を示す情報とともに、図17に示すように、文書ID記憶部115の第2の文書IDリスト115bに登録されている。
(格納処理:更新)
次に、図18に示したように、構造化文書DB111に登録されている文書Aに対し、更新を行う場合について説明する。
クライアント201は、既に構造化文書DB111に登録されている文書Aを次のようにして得ることができる。クライアント201の検索部203には、例えば、図18に示すような構造化文書DB111の概略構造を表示するためのGUIを有している。このGUIにより表示された構造からユーザが文書Aを指定すると、文書Aを得るための問合せデータが作成され、サーバ101へ送信される。サーバ101では、当該問合せデータから、当該指示された文書A(及びそのルートノードのOID等)を獲得して、クライアント201の検索部203へ返す。検索部203は、この得られた文書Aを表示部205に表示する。
ユーザは、表示部205に表示された文書Aに対して、図21に示すように更新を行う。すなわち、「<author> <first>太郎</first> <last>山田</last> </author>」を<authors>の直下に挿入したとする。図21に示すような更新された文書Aを文書A´とも呼ぶ。
以下、図12〜図13に示すフローチャートを参照して、説明する。
サーバ101の要求処理部102では、更新された文書Aと文書AのルートノードのOID等を含む更新要求メッセージを受け取る(ステップS1)。ここでは、文書AのOIDをOIDpとする。
更新要求メッセージに含まれる、更新された文書A(文書A´)が、格納処理部103の構造化文書構文解析部31へ渡されて、当該文書A´の構文解析が行われる。その結果得られるものは、文書A´の複数のオブジェクトデータからなる階層構造であり、メモリ上に展開される(ステップS2)。すなわち、構造化文書構文解析部31は、XMLデータである構造化文書データに対し、構文解析処理を行うことによりDOM(Document Object Model)形式のオブジェクトデータに展開するXMLパーサに相当する機能を有するものである。
ステップS3では、文書A´にDocIDを付与するが、文書A´のルートノードには、既にOID<6,0,D2>が与えられているので、新たにDocIDを付与することなく、次に、ステップS4へ進む。
ステップS4では、構造化文書構造抽出部32は、構造化文書構文解析部31での解析結果をそのルートから辿ることによって、文書A´の構造、すなわち、当該文書A´中の各要素に対応する複数のードと、当該複数のノードからなる構造を抽出する。文書A´の構造をScとする(ステップS4)。
構造化文書構造照合部33は、文書A´のルートノードであるOIDpをキーに構造テンプレート記憶部113から構造を取得する。ここでは、OIDpが<6,0,D2>であるので、まず、TID「D2」を取得する。このOIDpから取得したTIDをTIDpと表す。構造化文書構造照合部33は、TIDpをキーにして構造テンプレート記憶部113をスキャンすることで、対応する構造を取得できる(ステップS5)。取得した構造をSpとする(ステップS6)。なお、Spは、図7のTID「D2」以下の構造である。
構造化文書構造照合部33は、ScとSpの照合を行う(ステップS7)。ここでは、新たなに追加された各要素(ノード)について、当該要素に対応するSpの構造要素があれば、当該要素に当該Spの構成要素のTIdを付与する。Scの構造要素に対応するSpの構造要素がなければ、Spに存在せずに、Scに存在する新たな要素に新たなTIdを付与し、Spに当該新たな要素を追加する。また、Scの当該新たな要素に当該新たなTIdを付与する。この操作を、更新により新たに追加された(TIDが与えられていない)Scの各構造要素に対し行う。
文書Aの更新であるから(ステップS8)、構造化文書構造照合部33は、更新により新たに追加された(要素IDの与えられていない)Scの各要素に要素ID(ElemID)を付与する(ステップS13)。また、文書A´の更新により新たに追加された各要素に更新フラグ「1」が付与される(ステップS14)。
以上の処理により、図22に示すように、当該Sc内の更新により新たなに追加された各要素に対し、OIDと更新フラグ「1」が与えられたことになる。
最後に、構造化文書格納部34は、更新されたSpを構造テンプレート記憶部113に格納する。これにより、構造テンプレート記憶部113に格納される構造テンプレートの更新がなされる。
また、構造化文書格納部34は、更新により新たに追加されたScの要素のうち、テキスト要素を基に、索引データ記憶部114を更新する(図13のステップS11)。
さらに、構造化文書格納部34は、文書AのルートノードであるOIDpをキーに、構造化文書データ記憶部112内をスキャンすることで、文書Aの格納位置を得、図23に示すように、当該格納位置に、更新により新たに追加された各要素に対応する新たなオブジェクトデータを追加するとともに、新たなオブジェクトデータと既存のオブジェクトデータ間のリンクを更新し、元の文書Aを図22に示すような文書A´に更新する(ステップS12)。
要素IDは、上位階層の要素(同じ階層に複数の要素が存在する場合には、より左側に配置されている要素)から順に深さ優先で各要素に与えられる番号であるが、更新により文書Aに新たに追加された「author」ノード以下の要素IDが「11」〜「15」の各要素の文書A´内での出現位置は、図22に示すように、要素IDが「4」〜「8」の「<author> <first>花子</first> <last>山田</last> </author>」よりも先である。しかも、出現順が後の要素よりも大きい値の要素IDが与えられている。すなわち、文書内に要素を追加するなどの更新を行うことにより、要素IDが当該要素の文書内での出現順に一致しない状態が発生する。
更新フラグは、文書内で更新された要素については、当該要素の要素IDが当該文書内での出現順に一致しない可能性があることを示すために更新フラグを「1」とする。
(検索処理)
次に、図2の検索処理部104の処理動作について説明する。
図24は、検索処理部104に入力する問合せデータの一例を示したものである。XMLでは、XQuery(XML Query Language)という問合せ言語があり、それに基づいた問合せ記述方法に則っている。
図24に示す問合せデータには、「構造化文書DB「DB」の階層木の中に「book」という要素がある。その中に「山田」という文字列を含むテキスト要素をもつ「last」という要素がある」という条件が記述されている。
図24に示すような問合せデータは、クライアント201の検索部203からサーバ1へ送信され、サーバ101の要求処理部102で受信される。
以下、図25〜図26に示すフローチャートを参照して、例えば、図24に示したような問合せデータを受信した検索処理部104が、図18に示したような状態の構造化文書データ記憶部112から文書を検索する場合の処理動作の概略を説明する。
要求処理部102で受信された問合せデータは、検索処理部104の問合せ構文解析部41に渡される。問合せ構文解析部41では、受け取った問合せデータの構文解析を行い(ステップS101)、その結果を基に、問合せ構造抽出部42では、当該問合せデータから、問合せグラフと呼ばれるグラフ構造を抽出する(ステップS102)。例えば、図24に示した問合せデータの場合、図27に示すような問合せグラフが得られる。ここでは、問合せグラフで表されるような問合せデータ中の構造をScと表す。
問合せグラフは、図27に示すように、問合せデータ中に含まれる要素名(例えば、「db“DB”」、「book」、「last」)、や文字列(「山田」)にそれぞれ対応する変数と、各変数を、問合せデータ中に含まれる要素と文字列の包含関係に従って接続して構成されている。
次に、問合せ構造照合部43は、構造化文書DB111の構造テンプレート記憶部113から構造を取り出す。取り出した構造をSpと表す。ここでは、例えば、問合せデータ中で指定された、構造化文書データベースの階層木の最も上流にある要素、すなわち、「book」という要素以下の構造を抽出する。そして、この取り出した構造Spと先ほどのScとの照合を行う。その結果、Scの各要素に対して、取り得るTIDを割当てる(ステップS103)。
問合せ実行部44は、問合せグラフに含まれる全ての変数の具体化を目標として、テーブルと呼ばれる変数集合の取り得る値の組み合わせを表すデータを次々と生成する。ここでは、1つのテーブルを生成する単位処理をオペレータと呼ぶ。
まず、問合せグラフに含まれる全ての変数が1テーブルで具体化されているか判定する(ステップS104)。Yesであれば、全ての変数の取り得る値の組合せが具体化されたので、ステップS121へ進む。なお、変数が取り得る値とは、OIDのことである。
以下、問合せグラフに含まれる全ての変数が1テーブルで具体化されていないならば、そうなるまで、ステップS105〜ステップS110を繰り返す。
ステップS105では、索引データ記憶部114に記憶されている索引データを用いた検索が可能か判定する。「contains」など語彙索引系の関数があれば、構造化文書DB11中の索引データを用いて検索を高速化できる。その場合LexicalScanWithTidオペレータを実行する。
図26のステップS106では、親ドキュメント取得操作が可能か判定する。子要素OIDから親ドキュメントルートOIDをダイレクトに取り出すことができれば、GetDocumentオペレータを実行する。
ステップS107では、複数テーブルに同一変数が発生しているか判定する。その場合は2つのテーブル毎にJoinオペレータを実行する。
ステップS108では、値を取得すべき変数がすべて具体化されており、問合せの先頭にあるデータベースのルートを指定する「db()」しか残っていなければ、Nopオペレータ(無操作)を実行する。
ステップS109では、任意の2変数の上位階層にある変数に対してドキュメント型TIDが割当てられており、その2変数の値が具体化されていれば、FilterDocumentオペレータを実行する。
ステップS110では、変数の上位階層に変数があり、下位階層にある変数が具体化されていて上位階層にある変数が具体化されていなければ、ScanAncestorWithTIdオペレータを実行する。
ステップS111では、結果出力処理を行う。ここで各変数の取り得る値の組合せがテーブルとして得られている。その要素を変形することで問合せデータに合致する構造化文書データ集合を得ることができる。
図27に示した問合せグラフでは、変数は、丸で囲まれたノードで表されており、丸のなかに変数名が記述されている。これを変数ノードと呼ぶ。また、問合せデータ中に指定されていた要素は、六角形のなかに「TAG」と書かれたノードで表されている。これをタグノードと呼ぶ。さらに、問合せデータ中に指定されていた文字列は、六角形のなかに「VALCMP」と書かれたノードで表されている。これを値比較タグノードと呼ぶ。
図28は、図25のステップS103で付与された、図24の問合せグラフ中の各変数に対応するTIDを示したものである。
図29は、図27の問合せグラフに基づき検索を行う際に用いられるオペレータ系列を示したものである。図30は図29のオペレータ系列をオペレータ入出力という観点で視覚化した図である。
図28に示すように、構造化文書DB「DB」の階層木の中の「book」要素のなかの「last」要素に含まれるテキスト要素のTIDは、図7に示す構造テンプレートからも明らかなように、「T10」であり、構造化文書DB「DB」の階層木の中の「book」要素のTIDは、図7に示す構造テンプレートからも明らかなように、「D2」であり、構造化文書DB「DB」の階層木のルートノードは、図7に示す構造テンプレートからも明らかなように、「F0」である。
図29(a)に示すように、LexicalScanWithTidオペレータにより、「山田」という文字列を含むテキスト要素であって、TIDが「T10」であるOID集合を得る(図30(a)参照)。索引データ記憶部114には、各文書に含まれる語彙と、当該語彙を含むオブジェクトデータのOID及び更新フラグが、当該文書の登録順に登録されるため、LexicalScanWithTidオペレータにより得られるOIDも文書の登録順に取得される。すなわち、図30(a)に示すように、最初にOID<3,8,T10>更新フラグ「0」を取得し、次にOID<6,8,T10>更新フラグ「0」を取得する。
変数V2のTIDがドキュメント{D2}なので、変数V1に関し、親ドキュメント取得操作が可能である。GetDocumentオペレータを実行する。ここで変数V2が具体化する。
GetDocumentオペレータは、入力パラメータとして与えられたOID集合に対して、当該OID集合の各OIDと同じ文書中の上流のノードのOID集合を返す。ここで、構造化文書データの文書構造を辿るのではなく、当該与えられたOIDから、その上流ノードのOIDへと変換を行っている。つまり、GetDocumentオペレータは、問合せデータに発生する構造を考慮したため、構造化文書DB中のデータファイルをスキャンする必要が無い。そのため、ディスクI/Oなど処理コストが小さくて済む。
図30(b)に示すように、GetDocumentオペレータにより、OID<3,8,T10>を、当該OIDの要素の上流のノードであって、TIDが「D2」であるノードのOIDに変換する。すなわち、OID<3,0,D2>を得る。また、OID<6,8,T10>を、当該OIDの要素の上流のノードであって、TIDが「D2」であるノードのOIDに変換する。すなわち、OID<6,0,D2>を得る。また、得られたOID<3,0,D2>、<6,0,D2>について、構造化文書データ記憶部112をスキャンして、それぞれのオブジェクトデータから更新フラグを得る。
次に、変数V0は出力オペレータではないので、Nopオペレータを実行する。
以上で、問合せグラフに含まれる全ての変数が1テーブルで具体化されたので(ステップS104)、図25のステップS121へ進む。
なお、図30(b)に示したテーブルの2行目以下の各行は、検索結果である1つの「book」ドキュメントに対応する。
ステップS121では、問合せ実行部44がテーブル内の行を文書順、同じ文書については文書内の各要素の出現順にソーティングする。
ソーティングは、DocID、TID、ElemIDの順でチェックする。
図30(b)に示したテーブルの場合、まず、検索結果として得られた各文書のDocIDを比較する。1番目の文書のDocIDは「3」、2番目の文書のDocIDは「6」である。問合せ実行部44は、図17に示したような、文書ID記憶部115に記憶されている第1の文書IDリスト115aと第2の文書IDリスト115bとを参照して、これら2つの文書順を認識する。すなわち、DocIDは「3」は第1の文書IDリスト115aに登録されているが、DocIDは「6」は第2の文書IDリスト115bに登録されており、文書順を示す情報が「2.5」である。従って、DocID「6」の文書は、文書順がDocID「3」の文書よりも先であることを認識する。そこで、図30(b)のテーブル上の1番目の検索結果と2番目の検索結果とを入れ替えて、図30(c)に示すようテーブルを得る。
図30(c)に示すテーブルでは、これ以上ソーティングの余地はないので、このテーブル上の各文書が、この順番に検索結果として問合せ実行部44から出力される(ステップS122)。検索結果は、要求処理部102から検索要求元のクライアント201へ渡される。クライアント102では、サーバ101から受け取った構造化データを表示部205へ表示する。
上記例では、問合せグラフに含まれる全ての変数が1テーブルで具体化された後に、ソーティングを行う場合を示したが、この場合に限らず、例えば、LexicalScanWithTidオペレータにより得られるOIDの集合に対してソーティングを行うようにしてもよい。
例えば、図24に示す問い合せデータを用いて、文書Aを更新した後の図18に示したような状態の構造化文書DB111から検索を行う場合を例にとり説明する。
「last」要素に含まれるテキスト要素のTIDは、図7に示す構造テンプレートからも明らかなように、「T10」である。LexicalScanWithTidオペレータにより、「山田」という文字列を含むテキスト要素であって、TIDが「T10」であるOID集合を得ると、図31(a)に示すように、文書312の「OID<3,8、T10>、更新フラグ「0」」(図8参照)、文書A´の「OID<6,8、T10>、更新フラグ「0」」(図22参照)、同じく文書A´の「OID<6,15、T10>、更新フラグ「1」」(図22参照)がこの順に得られる。これは、索引データ記憶部114には、各文書の各要素に含まれる語彙と、当該語彙を含むオブジェクトデータのOID及び更新フラグが、当該文書及び当該要素の登録順に登録されるため、LexicalScanWithTidオペレータにより得られるOIDも文書や要素の登録順に取得されるからである。
図31(a)に示したテーブルの場合、まず、検索結果として得られた各文書のDocIDを比較する。1番目の文書のDocIDは「3」、2番目、3番目の文書のDocIDは「6」である。問合せ実行部44は、図17に示したような、文書ID記憶部115に記憶されている第1の文書IDリスト115aと第2の文書IDリスト115bとを参照して、これら2つの文書順を認識する。すなわち、DocIDは「3」は第1の文書IDリスト115aに登録されているが、DocIDは「6」は第2の文書IDリスト115bに登録されており、文書順を示す情報が「2.5」である。従って、DocID「6」の文書は、文書順がDocID「3」の文書よりも先であることを認識する。そこで、図30(a)のテーブル上の1番目の検索結果と、2番目の検索結果とを入れ替え、さらに、3番目の検索結果とも入れ替えて、図30(b)に示すようテーブルを得る。
次に、各OIDのTIDを比較する。この場合、TIDは全て「T10」で同一であるから、次に、要素IDを比較する。図31(b)の1番目と2番目のOIDの要素IDは「8」、「15」であるが、2番目のOIDの更新フラグは「1」である。
このように、同じ文書内の比較対象の2つのOIDのうちの少なくとも1つの更新フラグ「1」である場合には、(例えば図22に示した2つの「author」要素のように、)要素IDの値が小さい方の要素でも、当該要素の当該文書内での出現位置は要素IDの値が大きい方の要素よりも後である可能性もある。そこで、このような場合には、問合せ実行部44は、構造化文書データ記憶部112にアクセスして、当該文書の各オブジェクトデータ間のリンクを辿ることで、当該文書内の当該2つの要素の出現位置を認識する。
文書A´の場合、図22に示すような階層構造を有しているから、要素ID「15」の要素の方が、要素ID「8」の要素よりも出現順が先である。従って、図31(b)に示したテーブル中の番目と2番目を入れ替えて、図31(c)に示すようなテーブルを得る。
なお、同じ文書内の比較対象の2つのOIDのうちのいずれにも更新フラグが「0」である場合には、要素IDの値の大小を比較するだけでよい。
図31(c)に示したテーブルについて、GetDocumentを実行することにより、図31(d)に示したようなテーブルが得られる。このテーブル上の3つの行には、文書順、同じ文書の場合には、当該文書内での要素の出現順に3つの検索結果が記述されている。
図31(d)に示すテーブルでは、これ以上ソーティングの余地はないので、このテーブル上の各文書が、この順番に検索結果として問合せ実行部44から出力される(ステップS122)。検索結果は、要求処理部102から検索要求元のクライアント201へ渡される。クライアント102では、サーバ101から受け取った構造化データを表示部205へ表示する。
なお、構造化文書データ記憶部112に記憶されている複数の構造化文書のOIDに、これら複数の構造化文書の順番を示す数値(これを指標と呼ぶ)が予め付加されている場合は、この指標値の大小関係に基づきソーティングを行ってもよい。この場合、文書ID記憶部115に文書IDとともに登録される文書順と示す情報(相対値)参照することなくソーティングすることができる。
また、構造化文書データ記憶部112に記憶されている任意の構造化文書に含まれる複数の要素に、これら複数の要素の順番を示す数値(これを指標と呼ぶ)が予め付加されている場合は、この指標値の大小関係に基づきソーティングを行ってもよい。この場合、上記複数の要素のうちの少なくとも1つの更新フラグが「1」であっても、構造化文書データ記憶部112にアクセスすることなくソーティングすることができる。
(まとめ)
以上説明したように、上記実施形態によれば、複数の要素を含み、各要素は当該要素を識別するためのテンプレートIDを有する構造テンプレートを構造テンプレート記憶部113に記憶するとともに、上記複数の要素のうちのいずれか1つのテンプレートIDがそれぞれ割り振られた複数の要素データをそれぞれ含み、文書順が予め定められている複数の構造化データを構造化文書データ記憶部112に記憶しておく。
さらに、構造化文書データ記憶部112に記憶された各構造化文書に与えられた各構造化文書を識別するための文書IDであって、当該構造化文書が構造化文書データ記憶部112により記憶された順番を示す番号を文書ID記憶部115に記憶し、当該順番と文書順とが異なる構造化文書の場合には、文書順が当該構造化文書の直前の構造化文書及び直後の構造化文書のうちの少なくとも1つの文書IDに対する当該構造化文書の文書順を示す相対値(例えば、直前の構造化文書の文書IDと直後の構造化文書の文書IDの中間値)とともに当該構造化文書の文書IDを文書ID記憶部115に記憶する。
所望の要素データを検索するための検索条件が入力されると、検索処理部104は、上記構造テンプレート上の各要素のテンプレートIDを基に構造化文書データ記憶部112に記憶されている複数の構造化文書のなかから、上記検索条件を満たす要素データを含む複数の構造化文書を検索する。そして、検索された複数の構造化文書のうち文書ID記憶部115で相対値が記憶されている構造化文書の場合には当該相対値を用い、文書ID記憶部115で相対値が記憶されていない構造化文書の場合には文書IDを用いて、これらの大小関係に基づき、当該検索された複数の構造化文書を文書順に並び替えることにより、検索結果として得られた複数の構造化文書を、構造化文書データ記憶部112への登録順ではなく、各構造化文書の内容に基づく文書順に従ってユーザに提示することができる。
また、検索処理部104で、1つの構造化文書から複数の所望の要素データが検索される場合がある。このような場合、文書順に並び替えた検索された複数の構造化文書のうち、同一の文書IDをもつ構造化文書については、さらに、当該構造化文書内での当該複数の所望の要素データの出現順に基づき並び替えることにより、検索結果として得られた複数の構造化文書を文書順に、しかも同一文書IDの構造化文書については、当該構造化文書内での複数の所望の要素データの出現順に従ってユーザに提示することができる。
本発明の実施の形態に記載した本発明の手法は、コンピュータに実行させることのできるプログラムとして、磁気ディスク(フレキシブルディスク、ハードディスクなど)、光ディスク(CD−ROM、DVDなど)、半導体メモリなどの記録媒体に格納して頒布することもできる。
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組合せにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
31…構造化文書構文解析部、32…構造化文書構造抽出部、33…構造化文書構造照合部、34…構造化文書格納部、41…問合せ構文解析部、42…問合せ構造抽出部、43…問合せ構造照合部、44…問合せ実行部、101…サーバ装置、102…要求処理部、103…格納処理部、104…検索処理部、111…構造化文書データベース、112…構造化文書データ記憶部、113…構造テンプレート記憶部、114…索引データ記憶部、115…文書ID記憶部、201…クライアント装置、202…構造化文書登録部、203…検索部、204…入力部、205…表示部。