IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社エヌ・ティ・ティ・データ・セキスイシステムズの特許一覧

<>
  • 特開-インデックス管理装置 図1
  • 特開-インデックス管理装置 図2
  • 特開-インデックス管理装置 図3
  • 特開-インデックス管理装置 図4
  • 特開-インデックス管理装置 図5
  • 特開-インデックス管理装置 図6
  • 特開-インデックス管理装置 図7
  • 特開-インデックス管理装置 図8
  • 特開-インデックス管理装置 図9
  • 特開-インデックス管理装置 図10
  • 特開-インデックス管理装置 図11
  • 特開-インデックス管理装置 図12
  • 特開-インデックス管理装置 図13
  • 特開-インデックス管理装置 図14
  • 特開-インデックス管理装置 図15
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024068905
(43)【公開日】2024-05-21
(54)【発明の名称】インデックス管理装置
(51)【国際特許分類】
   G06F 16/22 20190101AFI20240514BHJP
【FI】
G06F16/22
【審査請求】未請求
【請求項の数】3
【出願形態】OL
(21)【出願番号】P 2022179576
(22)【出願日】2022-11-09
(71)【出願人】
【識別番号】593230202
【氏名又は名称】株式会社エヌ・ティ・ティ・データ・セキスイシステムズ
(74)【代理人】
【識別番号】240000327
【弁護士】
【氏名又は名称】弁護士法人クレオ国際法律特許事務所
(72)【発明者】
【氏名】金澤 康平
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175KA06
(57)【要約】
【課題】多次元のデータを扱うことができるうえに、部分木間の領域の重なりが低減された検索性能に優れたインデックスを構築することができるインデックス管理装置を提供する。
【解決手段】2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置3である。
そして、ルートノードとリーフノードを含む複数のノードからなる階層構造のインデックスを生成するインデックス生成手段31と、ノードにポインタとキー情報を格納させる処理を行うエントリ処理手段32と、複数の多次元データに対して、ツリー構築関数を再帰関数として呼び出すことでノードを更新する更新処理手段33とを備えている。
【選択図】図1
【特許請求の範囲】
【請求項1】
2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置であって、
複数のノードからなる階層構造のインデックスを生成するインデックス生成手段と、
前記ノードにポインタとキー情報を格納させる処理を行う際に、前記キー情報が前記数量の場合は範囲検索に設定し、前記キー情報が前記非順序離散値の場合はブルームフィルタを適用した指定値検索に設定する処理を行うエントリ処理手段と、
複数の前記多次元データに対して、ツリー構築関数を再帰関数として呼び出すことで前記ノードを更新する更新処理手段とを備え、
前記ツリー構築関数は、引数としたデータのデータ件数|D|が、1ノードが保持する最大エントリ数M以下である場合に、前記ノードを作成して返却値とすることを特徴とするインデックス管理装置。
【請求項2】
前記ツリー構築関数は、前記データ件数|D|が、1ノードが保持する最大エントリ数Mより大きい場合に、前記インデックスの中間ノードをルートノードとみなしたサブツリーの段数Hの計算と、エントリ数Eの計算とを行い、前記エントリ数Eに基づいた分配を行った後に、再帰関数を用いることを特徴とする請求項1に記載のインデックス管理装置。
【請求項3】
前記サブツリーの段数Hの計算は、M^H <|D|である最大の正整数を求めることで行い、エントリ数Eの計算は、E×M^H ≧|D|である最小の正整数を求めることで行うことを特徴とする請求項2に記載のインデックス管理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置に関するものである。
【背景技術】
【0002】
データ検索を高速化する技術として、検索用のインデックスを作成する手法が知られている。要するに、特定のキーに対応するデータを検索する場合に、データベース内の全てのレコードを先頭から1つずつ調べていくと膨大な時間がかかってしまうため、特定のキーに対する検索を高速化するために、インデックスツリーを生成しておくことが知られている(特許文献1,2など参照)。
【0003】
ここで、データベースに記録するデータの組はレコードと呼ばれ、その中で検索に用いられるデータはキーと呼ばれる。データベースに格納されたレコードをキーで検索するには、キー順にレコードがソートされているのが望ましいが、レコードをキー順にソートして記録する処理は時間がかかる。
【0004】
そこで、レコードは到着順に記録し、キーと対応するレコードへのポインタをツリー構造(木構造)でソートして別途記録するのが一般的であり、それをインデックスツリーと呼ぶ。代表的なインデックスの実装方法としては、Balanced Tree(B木)と呼ばれるデータ構造によるものが知られており、商用のデータベースやファイルシステムなどによく用いられている。
【0005】
B木は、データを特定の列に関して並べ替え、入れ子構造に分割したものとみなせる。それにより1列に関する範囲検索(指定下限値以上かつ指定上限値以下の値を持つレコードの抽出)は、キーに関する単純な大小比較のみで高速に行える。また、複数列に関する範囲検索も、第1列が同値の場合のみ第2列を比較し、第2列も同値の場合は第3列を比較するというような処理にすることで同様に扱えるが、実際に意味があるのは最初の数列程度であることが多い。
【0006】
一方、特許文献1,2に開示されているRectangle Tree(R木)は、データを長方形(2次元の場合。一般には超直方体)で再帰的に分割したものとみなせる。B木のような大小比較ではなく、検索範囲を長方形とみなして長方形同士の包含関係を調べることで、範囲検索を行う。しかし、その内部処理中、長方形の面積等を判断基準として用いるために、R木のインデックスで設定できるのは、2値間の順序と距離が適切に定義可能な数量に限られ、2値間の順序も距離も適切に定義することができない非順序離散値は扱うことができない。
【0007】
そこで、R木を非順序離散値も扱えるように拡張したものとして、非特許文献1に開示されているC-ND木が提案されている。C-ND木は、非順序離散値の列については、「長方形の一辺の長さ」を個別値の数で代替したR木とみなすことができる。C-ND木はR木の良い性質を受け継ぎつつ非順序離散値も扱えるため、単一のインデックスで既存インデックスの弱点をカバーできる可能性がある。
【0008】
一方、C-ND木は、非順序離散値の「範囲」を表現するのに単純なビット配列を用いるため、予め取り得るすべての個別値を知っておく必要がある。また、個別値の数が非常に多い場合は、要求される記憶容量が膨大になる。
【0009】
そこで、本出願人は、特許文献3に開示されているように、非順序離散値の指定値検索の設定にブルームフィルタを適用することで、2値間の順序も距離も適切に定義不能な非順序離散値が含まれる多次元データの検索を、記憶容量を抑えながらも高速で行えるようにした。
【先行技術文献】
【特許文献】
【0010】
【特許文献1】特開2003-330943号公報
【特許文献2】特許第3708809号公報
【特許文献3】特開2021-114037号公報
【非特許文献】
【0011】
【非特許文献1】Changqing Chen et al.,The C-ND Tree:A Multidimensional Index for Hybrid Continuous and Non-ordered Discrete Data Spaces,EDBT '09 Proceedings of the 12th International Conference on Extending Database Technology,2009.3,p.462-471
【非特許文献2】Scott Leutenegger et al.,STR: A Simple and Efficient Algorithm for R-Tree Packing, Proceedings 13th International Conference on Data Engineering,1997.4,p.497-506
【非特許文献3】Taewon Lee et al.,OMT: Overlap Minimizing Top-down Bulk Loading Algorithm for R-tree,2003,CAiSE Short Paper Proceedings 2003 p.69-72
【発明の概要】
【発明が解決しようとする課題】
【0012】
しかしながら、特許文献3で開示したような、新規データ1レコードが追加された場合に、0レコードの状態から更新手順を適宜繰り返すことで、任意の数のレコードに対するインデックスを構築する更新手段では、既存データが多量になると更新処理に膨大な時間がかかることになる。
【0013】
他方、非特許文献2に開示されているように、R木に対してはバルクローディング手法が開発されている。この非特許文献2に記載された手法では、データの並び変えが必要となるが、ブルームフィルタについて、どのような並び順が適切であるかは知られていない。
【0014】
ところで、R木を構築するに際して、木構造の下側のノードから順に作成していく、言わばボトムアップの構築手法と、木構造の上側のノードから作成していく、トップダウンの構築手法とがある(非特許文献3参照)。
【0015】
非特許文献3では、R木のボトムアップ構築手法が、木の上側に進むに連れて部分木間の領域の重なりが増大しやすく、最終的な木構造としては性能が悪い(検索速度が遅い)ものが出来あがる懸念があることを指摘し、代案として、R木のトップダウン構築手法を提案している。しかしながら、非特許文献3に開示された手法は、原則2次元のデータを想定したものであり、より多次元のデータに当てはめようとしても、せいぜい4次元から5次元程度のデータしか扱えない。
【0016】
そこで、本発明は、多次元のデータを扱うことができるうえに、部分木間の領域の重なりが低減された検索性能に優れたインデックスを構築することができるインデックス管理装置を提供することを目的としている。
【課題を解決するための手段】
【0017】
前記目的を達成するために、本発明のインデックス管理装置は、2値間の順序と距離が適切に定義可能な数量と、2値間の順序も距離も適切に定義不能な非順序離散値とが含まれる多次元データが格納されたデータベースのインデックス管理装置であって、複数のノードからなる階層構造のインデックスを生成するインデックス生成手段と、前記ノードにポインタとキー情報を格納させる処理を行う際に、前記キー情報が前記数量の場合は範囲検索に設定し、前記キー情報が前記非順序離散値の場合はブルームフィルタを適用した指定値検索に設定する処理を行うエントリ処理手段と、複数の前記多次元データに対して、ツリー構築関数を再帰関数として呼び出すことで前記ノードを更新する更新処理手段とを備え、前記ツリー構築関数は引数としたデータのデータ件数|D|が、1ノードが保持する最大エントリ数M以下である場合に、前記ノードを作成して返却値とすることを特徴とする。
【発明の効果】
【0018】
このように構成された本発明のインデックス管理装置は、ノードにポインタとキー情報を格納させる処理を行うエントリ処理手段において、キー情報が数量の場合は範囲検索に設定し、キー情報が非順序離散値の場合は指定値検索に設定する処理を行う。そして、指定値検索の設定には、ブルームフィルタが適用される。
【0019】
また、複数の多次元データに対して、ツリー構築関数を再帰関数として呼び出すことでノードを更新する更新処理手段を備えている。ここで、ツリー構築関数は、引数としたデータのデータ件数|D|が、1ノードが保持する最大エントリ数M以下である場合に、ノードを作成して返却値とする。
【0020】
要するに、データの並び変えが必要となる手法にブルームフィルタを適用できるようにすることで、データが多次元で多量であっても迅速に更新処理が行えるようになるうえに、部分木間の領域の重なりが低減された検索性能に優れたインデックスを構築することができるようになる。
【図面の簡単な説明】
【0021】
図1】本発明の実施の形態のインデックス管理装置が組み込まれる多次元データ検索システムの全体構成の概要を説明するブロック図である。
図2】インデックスの基本構造を例示した説明図である。
図3】数値と区分値とが含まれる多次元データのインデックスを使った検索例の説明図である。
図4】追加レコードがあった場合にインデックスが更新される概要を示した説明図である。
図5】更新処理の説明に利用する例示であって、(a)はインデックスのキー列数の設定例の説明図、(b)はノードから子ノードへの枝分かれ数の設定例の説明図である。
図6】2次元の空間に対象データを分散させたイメージを示した説明図である。
図7】サブツリーの説明図である。
図8】2次元の空間に分散された対象データを第1キーで分割するイメージを示した説明図である。
図9】分割によりできたデータのサブセットからサブツリーを構築するイメージを示した説明図である。
図10】データのサブセットをさらに第1キーで分割するイメージを示した説明図である。
図11】再分割によりできたデータのサブセットからエントリを作成するイメージを示した説明図である。
図12】リーフノードから4個の元データを指すエントリのイメージを示した説明図である。
図13】第1キーによる処理後に残ったデータを第2キーで分割するイメージを示した説明図である。
図14】残った対象データを第2キーで分割するイメージを示した説明図である。
図15】第2キーによる分割によりできたデータのサブセットからサブツリーを構築するイメージを示した説明図である。
【発明を実施するための形態】
【0022】
以下、本発明の実施の形態について図面を参照して説明する。
本実施の形態のインデックス管理装置は、多次元データが格納されたデータベースを備えた多次元データ検索システム1に組み込まれる。図1は、多次元データ検索システム1の全体構成の概要を示したブロック図である。
【0023】
多次元データ検索システム1は、入力手段2と、インデックス管理装置3と、データベース4とを備えている。入力手段2には、キーボードやマウスやタッチパネルなどの指令やデータなどを直接入力する手段、フラッシュメモリやハードディスクなどの記憶媒体から取り込ませる手段、インターネットやLANなど通信回線を介して取り込ませる手段などがある。
【0024】
また、データベース4には、インデックスZの構造やデータなどのインデックス情報41と、検索対象となる多次元データであるレコード42などが格納される。本実施の形態では、レコード42として、数量のデータと非順序離散値のデータとが組み合わされたものが扱われる。
【0025】
ここで、「数量」とは、2値間の順序と距離が適切に定義可能なデータで、大小の比較が可能な長さや重さや時刻などの数値が該当する。一方、「非順序離散値」とは、2値間の順序も距離も適切に定義不能なデータで、色の種類や地名や文字などの区分値が該当する。
【0026】
図2は、複数のレコード(「R00」,「R01」などの行IDによって識別されるデータ行)が記録されたデータベースであるレコード群Wと、そのレコード群Wの中から所期のレコードを短時間で抽出させるために作成されるインデックスZとを模式的に例示した図である。
【0027】
このインデックスZの基本構造は、ノードを3段以上にわたって階層的に配置するツリー構造(木構造)である。最上段(最上層)のノードはルートノード(根ノード)ZAと呼ばれ、最下段(最下層)のノードはリーフノード(葉ノード)ZCと呼ばれる。そして、ルートノードZAとリーフノードZCとの間に配置される1段以上のノードは、中間ノード(内部ノード)ZBと呼ばれる。
【0028】
各ノード(ZA,ZB,ZC)は、ノードを識別するためのノードIDと、ノードにデータを格納するためのエントリとによって構成される。ノード(ZA,ZB,ZC)のエントリには、ポインタとキー情報とが格納される。
【0029】
「ポインタ」とは、リーフノードZC以外のノード(ZA,ZB)では、エントリに記録されたキー情報に対応する下位のノード(子ノード)を指し示すデータをいう。一方、リーフノードZCでは、元データとなるレコード(例えば行ID「R00」で識別される1行のデータ組)を指し示すデータがポインタとなる。
【0030】
「キー情報」とは、レコードに含まれるデータの中で検索に用いられるデータをいう。本実施の形態では、数量も非順序離散値もキー情報になり得る。リーフノードZCに格納されるキー情報は、元データ(例えば1行のレコード)のキー列の値である。リーフノードZC以外のノード(ZA,ZB)では、子孫(子ノードやそれに繋がる子ノードなど)となる全リーフノードZCのキー情報の要約が記録される。例えば数値列であれば、最小値と最大値の組がキー情報として記録され、区分値列であれば後述するブルームフィルタがキー情報として記録される。
【0031】
例えば図2で説明すると、最上層のルートノードZAには、ノードIDが「N10」のノードが存在し、「N10」に格納された10個のエントリ(エントリ0からエントリ9)には、中間ノードZBの対応するノードを指すポインタ(例えば「エントリ0」には「N20」)と、キー情報となる数値「0~600」と、キー情報となる区分値「11010101」とが記録されている。ここで、数値は「0~600」という範囲で設定され、区分値は「11010101」という指定値で設定されている。
【0032】
中間ノードZBにおいても、同様に複数のエントリが格納されたノードが配置されていて、例えばノードIDが「N20」の「エントリ0」に該当する場合は、下位のノードIDが「N30」のノードに移行していくことになる。そして、最下層のリーフノードZCのノードID「N90」に辿り着いた場合には、その「エントリ0」が指し示すレコード群Wの行IDが「R00」のレコードが抽出されることになる。
【0033】
上述したデータ検索を別の表現で説明すると、検索対象となったノードXがリーフノードZCであって、ノードXのキー情報が検索条件に合致する場合は、ノードXのポインタが指す元データの1行(「R00」,「R01」など)が検索の結果集合Sに加えられることになる。一方、検索対象となったノードXがリーフノードZC以外であれば、ノードXのエントリのうち、子孫が検索条件に合致する可能性のあるキー情報が記録されたエントリのそれぞれについて、下位のノードの探索が行われることになる。
【0034】
このような検索を高速で行わせるための本実施の形態のインデックス管理装置3は、図1に示すように、ツリー構造のインデックスZを生成させるインデックス生成手段31と、各ノードのエントリに格納されるデータの処理などを行うエントリ処理手段32と、新たにレコードが追加されるなどしてインデックスZの更新が必要になったときに動作する更新処理手段33とを備えている。また、エントリ処理手段32には、後述するブルームフィルタのパラメータの設定などを行うためのブルームフィルタ設定部321が設けられる。
【0035】
続いて図3を参照しながら、数値と区分値とが含まれる多次元データのインデックスZを使った検索例について説明する。まず検索するにあたっては、検索条件が設定される。ここでは、検索条件を「50 ≦数値列≦ 70 かつ 区分値列= A」とする。区分値列の「A」は、ブルームフィルタ「00010001」に置き換えられる。
【0036】
検索条件に基づいてルートノードZAを参照すると、ノードID「N10」の「エントリ0」が数値の範囲検索においても区分値の指定値検索においても検索条件に該当しているため、下位の中間ノードZBのノードID「N20」に移行する。
【0037】
中間ノードZBの「N20」では、「エントリ0」は数値列が検索条件に該当しないが、「エントリ1」が数値列と区分値列の両方が検索条件に該当しているため、「エントリ1」のポインタ「N31」に従って、リーフノードZCの「N31」に移行する。そして、検索条件に該当する「エントリ1」のポインタ「R05」に従って、レコード群Wから行ID「R05」の1行のレコードが抽出される。このレコードには、キー情報である数値や区分値の他に、キー情報とされていない非キー列にある「へ」というデータも記録されている。なお、この例では、ルートノードZAのノードID「N10」の「エントリ1」が検索条件に該当しないので、「エントリ1」が指す下位のノードへの更なる検索は不要になる。
【0038】
ここで、C-ND木(非特許文献1)では、区分値を表現するのに単純なビット配列を用いるため、予め取り得るすべての個別値を把握して、その数に合わせてビット数を確保しておく必要がある。このため、想定される区分値の種類(数)が多くなると記憶容量が増大することになるし、区分値の範囲が想定できない場合は適用できないこともある。
【0039】
そこで、本実施の形態のインデックス管理装置3では、区分値をブルームフィルタを適用して表現する。ブルームフィルタは、集合にある要素が含まれるか否かを、確率的に判定できるデータ構造で、空間効率のよい構造と言える。ブルームフィルタを適用することによって、個別値の多寡にかかわらず、一定のビット数で非順序離散値の範囲が表現できるようになる。
【0040】
ブルームフィルタを適用するにあたっては、適当な正整数Nと、1個以上(k個とする)の異なるハッシュ関数(F_1, F_2,・・・,F_k)を予め決めておく。ただし、各ハッシュ関数は、値域が1~Nの整数であることが必要である。これは任意のハッシュ関数の結果に対して、Nによる剰余+1を計算することで可能である。
【0041】
例えば、データXに対するブルームフィルタB(X)は、第F_i(X)ビット(i = 1, 2,・・・,K)を「1」とし、その他を「0」としたNビットのビット列で表現することができる。そして、データの集合S = {X_1, X_2,・・・}に対するブルームフィルタB(S)は、B(S) = B(X_1), B(X_2),・・・のビットOR演算の結果となる。
【0042】
例えば、ビット数が「8」の場合に、“赤”というデータに対しては、F_1(“赤”)=1,F_2(“赤”)=4であるとすると、ブルームフィルタB(“赤”)は「00001001」となる。また、“青”というデータに対しては、F_1(“青”)=4,F_2(“青”)=8であるとすると、ブルームフィルタB(“青”)は「10001000」となる。そして、これらのビットOR演算結果は、B({“赤”,“青”}) = 10001001となる。
【0043】
任意の集合Sにおいて、データXに対し「B(X) AND B(S) ≠ B(X) ならばXはSに属しない」が成り立つ。ここで「AND」は、ビットAND演算を示す。一方、「B(X) AND B(S) = B(X) ならば X ∈ S」は成り立たない。したがって、集合の要約としてブルームフィルタを記録しておけば、あるデータがその集合に含まれるかどうかを、元の集合を参照することなく容易に判定することができる。ただし、「属しない場合(No)」は確実な結果となり、「属する場合(Yes)」は確率的な結果となる。
【0044】
例えば、B(S) = 10001001の場合に、B(“黄”) = 00100001であれば、B(“黄”) AND B(S) = 00000001 ≠ B(“黄”)となり、確実に“黄”は集合Sに属さないと言える。一方、B(“紫”) = 10000001であれば、B(“紫”) AND B(S) = 10000001 = B(“紫”)となり、“紫”は集合Sに属する(”紫”∈S)可能性があると言える。
【0045】
そして、数値xの集合Sをその最小値(m)と最大値(M)とで要約する場合も、「x < m 又は M < x ならばxはSに属しない」は成り立つが、「m ≦ x ≦ Mならばx ∈ S」は成り立たないので、ブルームフィルタはそのような要約の非数値版として捉えることができる。
【0046】
続いて、各データのサイズに関する説明を行う。あるデータ列に関する幅を決める場合に、数値の場合であれば、「最大値-最小値」をデータ全体の幅とすることができる。一方、区分値の場合は、ブルームフィルタ中の「1」の数を全体の幅とすることができる。例えば、「10010001」であれば、幅は「3」となる。また、「正規化幅=幅/データ全体の幅」であるとする。
【0047】
そして、各データのサイズを、各列に関する相対幅(正規化幅)の2乗和とすると、例えば数値のみのデータであれば、各列の最小値から最大値で定義される超直方体の対角線の長さの2乗をサイズとみなすことができる。
【0048】
そこで、図2に示したインデックスZを例にして、データのサイズの説明を続ける。データ全体の幅は、数値列についてはルートノードZAを見ると「900 - 0」になるため「900」、区分値列については最大で「11111111」(図2のレコード群Wでは、区分値(A,B)のみ例示)になるため「8」である。
【0049】
また、中間ノードZBの「N20」の「エントリ0」の幅は、数値列が「90」、区分値列が「4」となる。このため、「N20」の「エントリ0」の正規化幅は、数値列が「0.1」、区分値列が「0.5」となり、「N20」の「エントリ0」のサイズは0.26となる。
【0050】
ところでブルームフィルタには、偽陰性(false negative)はないが、偽陽性(false positive)による誤検出の可能性がある。また、要素を集合に追加することはできるが、削除することはできない。そして、集合に要素が追加されるにつれて、偽陽性の可能性が高くなるという性質がある。
【0051】
そこで、ブルームフィルタのビット数とハッシュ関数の数を適切に設定して適用する必要がある。本出願人の出願である特許文献3で説明しているように、ある想定データ条件においては、ハッシュ関数の数は、4又は5に設定する。
【0052】
続いて、インデックス管理装置3の更新処理について説明する。
図4は、新たに多次元データが追加レコードW1としてレコード群Wに追加された場合に、インデックスが更新されることの概要を説明するための図である。ここで、図2を更新前のインデックスZとし、図4を更新後のインデックスNZとする。
【0053】
すなわち、レコード群Wに追加レコードW1(行ID:R08)が追加されると、その追加レコードW1の検索を可能にするために、インデックスZがインデックスNZに更新される。図4に示したインデックスNZは、図2に示したインデックスZと比べて、ルートノードZA、中間ノードZB、リーフノードZCの各階層のノードのエントリが更新されている。
【0054】
これに対して、初期データを一括投入するバルクローディング手法を適用しても、ノードを更新したインデックスを構築することができる。
以下では、バルクローディング手法を適用した更新処理手段33による更新処理の流れについて説明する。
【0055】
具体的には、R木に対するバルクローディング手法(非特許文献2参照)を改良して適用する。すなわち、非特許文献2に記載されたバルクローディング手法では、データの大小比較を要するので、非順序離散値にそのまま適用することはできない。そこで、非順序離散値をブルームフィルタに変換して扱う本実施の形態のインデックス管理装置3が適用される。
【0056】
さらに本実施の形態の更新処理手段33では、非特許文献3において開示されているトップダウンの構築手法とは異なる形のトップダウン構築手法を適用することによって、ボトムアップの構築手法で発生する木の上側における部分木間の領域の重なりを低減し、検索速度の速い検索性能に優れたインデックスを構築する。
【0057】
そして、データの分割方式において非特許文献3とは異なる処理を行う本実施の形態の更新処理手段33によれば、5次元よりも多くの多次元のデータを扱うことができるようになる。
【0058】
以下では、更新処理の対象となる多次元データのデータ群Dの対象データ件数を|D|、インデックスのキー列数をK、1ノードが保持する最大エントリ数をMとする。ここで、インデックスのキー列数Kは、元データを何列のインデックスに設定するかで決める。例えば図5(a)に示した例では、インデックスのキー列数Kは2である。一方、1ノードが保持する最大エントリ数Mは、ノードから子ノードへの枝分かれ数の最大値で決める。例えば図5(b)に示した例では、最大エントリ数Mは4である。
【0059】
そして、対象データに対して、以下で説明するツリー構築関数を呼び出す処理を行う。要するに更新処理手段33の処理のアルゴリズムは、データ件数|D|のデータを引数として、ツリー構築関数を再帰関数として呼び出して完了させるものである。ここで、ツリー構築関数の返却値となるノードは、該当するインデックスツリーのルートノードになる。
【0060】
以下で、ツリー構築関数の詳細を説明していく際には、説明を簡単にするために、図6に示した全データ件数|D|が48件となる2次元のデータ群Dを、適宜参照する。
【0061】
まず第1ステップでは、対象データを引数としてツリー構築関数を呼び出し、全データ件数|D|を使って完了チェックを行う。|D|≦Mであれば、全対象データを指すエントリで構成されるインデックスノード(ルートノード)を作って返却値とし、更新処理を完了させる。
【0062】
すなわち、ツリー構築関数は、対象となる多次元データのデータ件数|D|が、1ノードが保持する最大エントリ数M以下である場合に、ノード(インデックスノード)を作成して返却値とする。
【0063】
例えば図6の例では、全データ件数|D|の48件は最大エントリ数Mより大きい(|D|=48 > 4=M)ので、この段階では更新処理を完了させない。要するに、再帰関数の呼び出しを|D|≦ Mになるまで繰り返すことになる。
【0064】
データ件数|D|が最大エントリ数Mより大きい場合には、ツリー構築関数の第2ステップとして、サブツリーの段数Hの計算を行う。ここでは、M^H <|D|である最大の正整数をサブツリーの段数Hとして求める。さらに第3ステップでは、エントリ数Eの計算を行う。ここでは、E×M^H ≧|D|である最小の正整数をエントリ数Eとして求める。
【0065】
第2ステップと第3ステップは、すなわち適切なエントリ数Eを決めるための処理である。更新処理手段33ではトップダウンで木構造を構築していくので、ルートノードを始め、木の上側のノードのエントリ数Eをどうすべきかは、自明になってはいない。他方、原則として最大限エントリを作成する、といった単純な決め方だと、ノード数が無駄に多くなり、検索性能が悪化する可能性が高い。
【0066】
そこで、第2ステップでは、M^H <|D|である最大の正整数をサブツリーの段数Hとして求める。図6に示した全データ件数|D|が48件の例では、H=2であれば4^2=16 < 48、H=3であれば4^3=64 > 48となるので、正整数の最大はH=2(M^H=16)となる。
【0067】
図7に示すように、ある中間ノードをルートノードと見なした場合の中間ノード以下の木構造をサブツリー(サブツリー1,サブツリー2)と呼ぶこととすると、どのノードも最大限のM個のエントリを持っていて無駄が無いと仮定して、それぞれのサブツリーが担う元データの件数、すなわちリーフノードが指すデータ件数がいくつになるかを求める。
【0068】
そして、第3ステップでは、E×M^H ≧|D|である最小の正整数をエントリ数Eとして求める。同じく図6の例では、E=2であれば2×4^2=32 < 48、E=3であれば3×4^2=48となるので、正整数の最小はE=3(E×M^H=48)となる。
【0069】
すなわち第2ステップで無駄のないサブツリーが担うデータ件数を求めたので、そこから、そのようなサブツリーがいくつあれば全データを担えるのか、換言するとルートノードが最小限のいくつのエントリ数Eを持つべきかを求める。
【0070】
第4ステップでは、第3ステップで求められたエントリ数Eの分配を行う。分配するキー列数Kを使って表すと、E=E1+E2+・・・+EKを満たしたうえで、各エントリ数(E1,E2,・・・,EK)がいずれも概ね同じ整数の値となるように分配を行う。例えば上記の例では、キー列数Kが2で、第3ステップで求められたエントリ数Eが3であるため、E1=1、E2=2と決める。要するに、どのキーがいくつのエントリを受け持つのかを決める。
【0071】
続く第5ステップでは、データ群Dの並び替えを行う。すなわち、データ群Dを第1キーに関して並び替え、その順に沿って、概ね同じ件数のE1+E2+・・・+EK個のグループに分割する。
【0072】
例えば図8に示すように、第1キーによる並び替えが行われたデータ件数|D|が48件のデータ群Dを、E1+E2=1+2=3個に分割する。分割された3個のグループには、それぞれ同じ件数である16個の元データが分配されている。
【0073】
次の第6ステップでは、エントリの生成を行う。第5ステップで分割されたグループのうちから適当なE1(=1)個のグループを選び、そのそれぞれについて、そこに所属する元データ(16件)を引数としてツリー構築関数を再帰的に呼び出す。そして、その返却値となるツリーを指すエントリを作成する。
【0074】
例えば図9に示したように、分割によりできたデータのサブセットから、サブツリーを構築する。サブツリーを構築する際も、ツリー全体の構築と同様なので、再帰関数を用いる。そして、上述した第1ステップに戻って完了チェックを行う。
【0075】
完了チェックにおいては、データ件数|D|≦Mであれば、サブセットの全データを指すエントリで構成されるインデックスノードを作って、そのインデックスノードを返却値とすることになる。しかし、図9で示した例では、|D|=16 > 4=Mで処理を完了できないので、上述した第2ステップのサブツリーの段数Hの計算に移行する。
【0076】
2回目の第2ステップでは、H=1であれば4^1=4 < 16、H=2であれば4^2=16=16となるので、M^H <|D|である最大の正整数はH=1(M^H=4)となる。続く第3ステップでは、E=3であれば3×4^1=12 < 16、E=4であれば4×4^1=16となるので、正整数の最小はE=4(E×M^H=16)となる。
【0077】
そして第4ステップでは、第3ステップで求められたエントリ数Eの分配を行う。ここでは、キー列数Kが2で、2回目の第3ステップで求められたエントリ数Eが4であるため、E1=2、E2=2と決める。
【0078】
さらに、第5ステップでは、図10に示すように、サブセットの16件の元データをE1+E2=2+2=4個に分割する。分割された4個のグループには、それぞれ同じ件数である4個の元データが分配される。
【0079】
そして図11に示したように、第6ステップでは、分割されたグループのうちから適当なE1(=2)個のグループを選び、そのそれぞれについて、そこに所属する元データ(4件)を引数としてツリー構築関数を再帰的に呼び出す。そして、その返却値となるツリーを指すエントリを作成する。
【0080】
そして、再び第1ステップに戻って完了チェックを行う。今回は、全データ件数|D|=4個が、|D|=4=Mと最大エントリ数Mと同じになるので、|D|≦Mを満たし、図12に示すように、4個の元データを指すエントリで構成されるリーフノード(インデックスノード)を作って、そのリーフノードを返却値にする。
【0081】
続いて、サブセットのデータ群(図10参照)から完了チェックができたグループのデータ(図11参照)を除き、図13に示すように、残りのデータ群を第2キーに関して並び替え、その順に沿って、概ね同じ件数のE2+・・・+EK個のグループに分割する。
【0082】
そして、リーフノードの作成のための再帰呼び出しが完了した後は、呼び出し元である中間ノードの作成中の状態に復帰する。そこで、全体のデータ群D(図8参照)からサブセットのデータ(図9参照)を除き、図14に示すように、残りのデータ群を第2キーに関して並び替え、その順に沿って、概ね同じ件数のE2+・・・+EK個のグループに分割する。
【0083】
続いて、それらグループのうちから適当なE2(=2)個のグループを選び、そのそれぞれについて、そこに所属する元データを引数としてツリー構築関数を再帰的に呼び出し、その返却値であるツリーを指すエントリの作成を行う。要するに図15に示すように、分割によりできたデータのサブセットからサブツリーを構築し、上述した第1ステップに戻って完了チェックを行う。
【0084】
このように、完了チェックが終わったデータをデータ群から除いて、次のキーに関する並び替えを行って、ツリー構築関数により返却値であるエントリの作成を行う処理は、第Kキーに至るまで繰り返される。このキー列数Kは、2次元に制限されるものではなく、5次元よりも多い多次元になっていてもよい。
【0085】
以上のようにして、合計E個のエントリによって構成されるインデックスノードを作成して返却値とする処理が行われる。そして、こうした再帰呼び出しの繰り返しによって、ルートノード直下の全中間ノードと、その中間ノードをルートノードとするサブツリーが出来上がった状態になっているので、最後はそれらをまとめるだけで、インデックスの更新処理を完了させることができる。
【0086】
次に、本実施の形態のインデックス管理装置3の作用について説明する。
このように構成された本実施の形態のインデックス管理装置3は、ノード(ZA,ZB,ZC)にポインタとキー情報を格納させる処理を行うエントリ処理手段32において、キー情報が数値などの数量の場合は範囲検索に設定し、キー情報が区分値などの非順序離散値の場合は指定値検索に設定する処理を行う。そして、指定値検索の設定には、ブルームフィルタが適用される。
【0087】
このため、2値間の順序も距離も適切に定義不能な非順序離散値(区分値)が含まれる多次元データの検索が高速で行えるようになる。すなわちインデックスZが、複数列に関する範囲検索に適したインデックス構造となっているので、高速で安定した検索速度を発揮させることができる。
【0088】
さらに、一括投入された複数の多次元データに対して、ツリー構築関数を再帰関数として呼び出すことでノードを更新する更新処理手段33とを備えている。ここで、ツリー構築関数は、引数としたデータのデータ件数|D|が、1ノードが保持する最大エントリ数M以下である場合に、インデックスノードを作成して返却値とする。
【0089】
本実施の形態のインデックス管理装置3によれば、データの並び変えが必要となる手法にブルームフィルタを適用できるようにすることで、データが多次元で多量であっても迅速に更新処理が行えるようになるうえに、部分木間の領域の重なりが低減された検索性能に優れた(検索速度が速い)インデックスZ(インデックスツリー)を構築することができるようになる。
【0090】
以上、図面を参照して、本発明の実施の形態を詳述してきたが、具体的な構成は、この実施の形態に限らず、本発明の要旨を逸脱しない程度の設計的変更は、本発明に含まれる。
【0091】
例えば前記実施の形態では、説明を簡単にするために少ない次元で多次元データを説明したが、これに限定されるものではなく、多数の数量及び非順序離散値のキー情報が含まれる多次元データに対しても、本発明を適用することができる。
【符号の説明】
【0092】
3 :インデックス管理装置
31 :インデックス生成手段
32 :エントリ処理手段
321 :ブルームフィルタ設定部
33 :更新処理手段
Z :インデックス
ZA :ルートノード
ZB :中間ノード
ZC :リーフノード
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15