以下に、本願の開示するインデックス管理方法、インデックス管理プログラムおよびインデックス管理装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。そして、各実施例は、処理内容を矛盾させない範囲で適宜組み合わせることが可能である。
実施例1では、多次元データ検索サーバを含むシステムの全体構成、多次元データ検索サーバの機能ブロック図、処理の流れ、効果を説明する。
[全体構成]
図1は、実施例1に係るシステムの全体構成を示す図である。図1に示すように、このシステムは、多次元データ検索サーバ10と複数の端末装置とが有線通信または無線通信で相互に通信可能に接続される。なお、図1に示した構成はあくまで例示であり、装置の台数やネットワーク構成、ネットワーク種別等を限定するものではない。
各端末装置は、所定間隔で位置情報を多次元データ検索サーバ10に送信する装置であり、例えばパーソナルコンピュータ、サーバ、携帯端末、PDA(Personal Digital Assistant)、スマートフォンなどの装置である。
一例を挙げると、端末装置は、温度や湿度などのセンサを有し、所定間隔でセンシングした値とともに、GPS(Global Positioning System)受信機等で測定した座標などの位置情報を多次元データ検索サーバ10に送信する。
多次元データ検索サーバ10は、動的ツリー型インデックス方式を用いて、端末装置の位置情報のインデックスを生成して管理するサーバ装置である。例えば、多次元データ検索サーバ10は、各端末装置から2次元の位置情報を受信して、受信した位置情報に基づいて、空間を最小外接矩形に分割して空間に存在する位置情報のインデックスをR−Tree(以下、Rツリーと表記する)で生成する。
ここで、多次元データ検索サーバ10が生成するRツリーと、生成したRツリーの管理としてノードの追加や削除を実行する例を説明する。図2は、Rツリーで管理するデータと矩形領域の例を示す図である。なお、図2に示したノード数等はあくまで例示であり、図示したものに限定されるものではない。
図2に示すように、Rツリーは、R0からR11で形成されるツリー構造であり、R0をルートノード、R5からR11を最下段の葉ノード、ルートノードと葉ノードとの間に位置するR1からR4をブランチノードとする。
ルートノードR0は、子ノードであるR1、R2、R3、R4を含む最小外接矩形であり、ブランチノードR1は、R5、R6、R7、R8を含む最小外接矩形であり、R5からR8各々は、内部に持つ座標データ(位置情報)の最小外接矩形である。また、ノードR2からノードR4は、それぞれ子ノードであるR9からR11を含む最小外接矩形である。なお、本実施例では、各ノードが子ノードを全て最小外接矩形で子ノードを管理する例で説明するが、最小外接矩形とは、例えば矩形や球など所定の形状の中で最小の領域の一例である。
つまり、図2の下図に示すように、葉ノードR5は、所定数の位置情報を全て含む最小の矩形領域である。ブランチノードR1は、子ノードであるR5、R6、R7、R8を全て含む最小の矩形領域である。ルートノードR0は、子ノードであるR1、R2、R3、R4、R5を全て含む最小の矩形領域である。なお、最小外接矩形の生成方法やRツリーの生成方法は、一般的な公知の技術を用いることができるので、詳細な説明は省略する。
このようなRツリーによってデータのインデックスを管理する多次元データ検索サーバ10は、ノードの追加、データの追加、ノードの削除、データの削除などが発生した場合に、Rツリーを動的に変更する。
ここで、図3から図6を用いてRツリーの動的変更について説明する。この例では、多次元データ検索サーバ10は、ルートノードを「R0」、ブランチノードを「R1、R2、R3、R4」、葉ノードを「R5、R6、R7、R8、R9、R10、R11」とするインデックスを管理する。また、R0の子ノードがR1からR4であり、R1の子ノードがR5からR8であり、R2の子ノードがR9であり、R3の子ノードがR10であり、R4の子ノードがR11である。なお、ノードを分割または統合するアルゴリズム等は、一般的なRツリーで使用されるものを使用できるので、詳細な説明は省略する。
図3は、Rツリーにノードを追加する例を示す図である。この例では、各ノードの子ノード数の上限値は4であるとする。図3では、多次元データ検索サーバ10が、R1の子ノードに「ノードR12」を追加する処理の一例について説明する。まず、多次元データ検索サーバ10は、R1の子ノードとしてR12を追加する。続いて、多次元データ検索サーバ10は、R1の子ノードの数がR12の追加によって管理できる上限値を超える場合、R1をR1AとR1Bとに分割する。そして、多次元データ検索サーバ10は、R1をR1AとR1Bとに分割したことで、R0の子ノードの数が上限値を超えた場合、R0をR0AとR0Bとに分割し、新たなルートノードRR0の子ノードとして管理する。
つまり、多次元データ検索サーバ10は、新たなノードを子ノードとして追加した親ノードの分割や、当該親ノードが分割された各ノードを子ノードするノードの分割等を繰り返して実行する。このように、多次元データ検索サーバ10は、ノードの追加に伴って、各ノードが管理するデータ数または各ノードの子ノード数が上限値を超えないように、ノードの分割を実行する。
図4は、Rツリーにデータを追加する例を示す図である。この例でも、各ノードの子ノード数の上限値は4であるとする。図4では、多次元データ検索サーバ10が、葉ノードのR5にデータ「D11」を追加する処理の一例について説明する。図示していないが、葉ノードR5からR11まではいずれも上限値を越えない数のデータを保持している。まず、多次元データ検索サーバ10は、R5が管理するデータにD11を追加する。続いて、多次元データ検索サーバ10は、R5が管理するデータの数がD11の追加によって上限値を超える場合、R5をR5AとR5Bとに分割する。そして、多次元データ検索サーバ10は、R5をR5AとR5Bとに分割したことで、R1の子ノードの数が上限値を超えた場合、R1をR1AとR1Bとに分割する。さらに、R1をR1AとR1Bとに分割したことで、R0の子ノードの数が上限値を超えた場合、R0をR0AとR0Bとに分割し、新たなルートノードRR0の子ノードとして管理する。
つまり、多次元データ検索サーバ10は、葉ノードに新たなデータを追加した場合も、図3と同様に、葉ノードからルートノードまでの各ノードについて、データ数や子ノード数が管理できる上限値を超えないか否かを判定する。そして、多次元データ検索サーバ10は、上限値を超えるノードの分割等を繰り返して実行する。このように、多次元データ検索サーバ10は、葉ノードへのデータの追加に伴って、各ノードが管理するデータ数または各ノードの子ノード数が上限値を超えないように、ノードの分割を実行する。
図5は、Rツリーのノードを削除する例を示す図である。この例では、各ノードの子ノード数の下限値は2であるとするために、図2から図4とは異なるツリーで説明する。具体的には、Rツリーは、R0からR12で形成されるツリー構造であり、R0をルートノード、R5からR12を最下段の葉ノード、ルートノードと葉ノードとの間に位置するR1からR4をブランチノードとする。また、R1からR4のブランチノードには、それぞれ葉ノードが2つずつぶら下がっている。図5では、多次元データ検索サーバ10が、ブランチノードR3の子ノードである「R10」を削除する処理の一例について説明する。まず、多次元データ検索サーバ10は、R3の子ノードであるR10を削除する。続いて、多次元データ検索サーバ10は、R3の子ノードの数が下限値を下回ったので、R3とR4とを統合して新たなR4をR0の子ノードとする。そして、多次元データ検索サーバ10は、新たなR4の子ノードが下限値より多く、R3が統合されてなくなることによってR0の子ノード数が下限値を下回ることもないので、処理を終了する。
つまり、多次元データ検索サーバ10は、ノードを削除した場合も、図3と同様に、葉ノードからルートノードまでの各ノードについて、データ数や子ノード数が管理できる上限値や下限値を超えないか否かを判定する。そして、多次元データ検索サーバ10は、上限値や下限値を超えるノードの分割または統合等を繰り返して実行する。このように、多次元データ検索サーバ10は、ノードの追加に伴って、各ノードが管理するデータ数または各ノードの子ノード数が上限値や下限値を超えないように、ノードの分割または統合を実行する。
図6は、Rツリーのデータを削除する例を示す図である。図6では、多次元データ検索サーバ10が、葉ノードR5が管理するデータ「D21、D22」のうち「D21」を削除する処理の一例について説明する。D21以外に図示しているデータはD22のみであるが、葉ノードR5にはちょうど下限値に等しい数のデータを管理しており、D21及びD22以外のデータはD22と同様に処理する物とする。まず、多次元データ検索サーバ10は、ノードR5が管理するD21を削除する。続いて、多次元データ検索サーバ10は、R5の管理するデータ数が下限値を下回ったので、R5とR6とを統合して新たなR6をR1の子ノードとする。そして、多次元データ検索サーバ10は、新たなR6のデータとして、元のR5のデータであるD22を追加する。そして、多次元データ検索サーバ10は、新たなR6のデータ数が下限値より多く、上限値を超えていないので、処理を終了する。なお、多次元データ検索サーバ10は、新たなR6のデータ数が上限値を超えている場合には、新たなR6の分割を実行する。
つまり、多次元データ検索サーバ10は、データを削除した場合も、図3と同様に、葉ノードからルートノードまでの各ノードについて、データ数や子ノード数が管理できる上限値や下限値を超えないか否かを判定する。そして、多次元データ検索サーバ10は、上限値や下限値を超えるノードの分割または統合等を繰り返して実行する。このように、多次元データ検索サーバ10は、データの追加に伴って、各ノードが管理するデータ数または各ノードの子ノード数が上限値や下限値を超えないように、ノードの分割または統合を実行する。
上述したように、多次元データ検索サーバ10は、データの追加や削除、ノードの追加や削除に伴って、Rツリーの構成を変更してインデックスを管理する。このような多次元データ検索サーバ10は、ツリー構造を形成するノードごとに、当該ノードが検索された数を計数する。また、多次元データ検索サーバ10は、ノードごとに、当該ノードが管理するデータ又は当該ノードの子ノードが更新された数を計数する。そして、多次元データ検索サーバ10は、データの数または子ノードの数に基づいて特定したノードについて、計数した更新回数と検索回数とを用いて更新指数を算出し、算出した更新指数に基づいて、特定したノードの分割または統合処理の実行を抑止する。
つまり、多次元データ検索サーバ10は、更新回数の割合がノードについては、インデックス管理のボトルネックとなっていたノードの分割処理またはノード統合処理を抑止することで、インデックスの管理負荷を軽減することができる。すなわち、更新指数の高い領域については、負荷の高いインデックス更新処理を避けることで、検索処理性能を向上させることができる。
[多次元データ検索サーバの構成]
図7は、実施例1に係る多次元データ検索サーバの構成を示すブロック図である。図7に示すように、多次元データ検索サーバ10は、通信インタフェース11と、記憶部12と、制御部13とを有する。
通信インタフェース11は、各端末装置との間で通信を確立して、各端末装置から位置情報やデータ検索要求等を受信したり、各端末装置にデータ検索応答を送信したりするインタフェースである。例えば、通信インタフェース11は、LAN(Local Area Network)やインターネットなどと接続するネットワークインタフェースカードや、無線アンテナを有する無線通信部などである。
記憶部12は、制御部13が実行するプログラム等を記憶するとともに、作業領域12aとインデックスDB12bと多次元データDB12cと更新/検索回数DB12dとを有する半導体素子やハードディスクなどの記憶装置である。また、この記憶部12は、葉ノードが管理できるデータの上限値および下限値、各ノードが子ノードとして管理できる子ノードの上限値および下限値を記憶する。例えば、記憶部12は、データの上限値「4」、データの下限値「1」、ノードの上限値「4」、ノードの下限値「0」などと記憶する。
作業領域12aは、制御部13または制御部13が有する各処理部が各種処理を実行する際に使用する一時領域である。
インデックスDB12bは、空間内に存在する大量のデータから所望のデータを高速に検索するための索引情報である。例えば、インデックスDB12bは、端末装置の位置情報のインデックスをRツリーで保持する。図8は、インデックスDBに記憶される情報の例を示す図である。図8に示すように、インデックスDB12bは、ノード種別としてルート、ブランチ、葉の三種のいずれかを示すデータで形成されるRツリーを記憶する。ルートノードは、Rツリーに1つのみ存在する頂点データであり、検索を開始するノードとなる。また逆に、葉ノードはRツリーの最底辺のノードであり、自らは子ノードを含まず、点・領域などの検索対象多次元データを1つ以上持つ。それ以外の木の中間に存在するノードはブランチノードであり、それぞれ子ノードを1つ以上持つ。
図8の場合、ルートノードがR0であり、R0の子ノードかつブランチノードがR1、R2、R3、R4である。ブランチノードR1の子ノードである葉ノードがR5、R6、R7、R8であり、ブランチノードR2の子ノードである葉ノードがR9である。ブランチノードR3の子ノードである葉ノードがR10であり、ブランチノードR4の子ノードである葉ノードがR11である。
インデックスDB12bは、Rツリーの実体としてルート、ブランチ、葉の各ノードの情報を記憶する。図9は、インデックスDBに記憶されるルートノードの情報の例を示す図である。図9に示すように、インデックスDB12bは、ルートノードR0の情報として、「ノード種別、矩形情報、子ノードリスト」を記憶する。ここで記憶される「ノード種別」は、ノードがルート、ブランチ、葉のいずれであるかを示す情報であり、「矩形情報」は、子ノードの担当領域をすべて含む最小外接矩形の情報であり、「子ノードリスト」は、当該ノードの子ノードへのリンクポインタのリストである。
図9の場合、ルートノードR0は、x、yの2次元データを管理し、「x1=35.50、y1=139.00」が担当領域の最小点であり、「x2=35.90、y2=139.50」が担当領域の最大点であることを示す。すなわち、R0が担当する領域は、両点を頂点として各次元軸に直交した4直線で作られる領域である。また、R0は、子ノード「R1、R2、R3、R4」へのポインタのリストを記憶する。
図10は、インデックスDBに記憶されるブランチノードの情報の例を示す図である。図10に示すように、インデックスDB12bは、ブランチノードの情報として、「ノード種別、矩形情報、子ノードリスト」を記憶する。ここで記憶される「ノード種別」、「矩形情報」、「子ノードリスト」は、図9と同様なので詳細な説明は省略する。インデックスDB12bは、R1、R2、R3、R4について、図10の情報を記憶する。
図10の場合、ブランチノードR1は、x、yの2次元データを管理し、「x1=35.50、y1=139.20」が担当領域の最小点であり、「x2=35.70、y2=139.30」が担当領域の最大点であることを示す。すなわち、ブランチノードR1が担当する領域は、両点を頂点として各次元軸に直交した4直線で作られる領域である。また、R1は、子ノード「R5、R6、R7、R8」へのポインタのリストを記憶する。
図11は、インデックスDBに記憶される葉ノードの情報の例を示す図である。図11に示すように、インデックスDB12bは、葉ノードの情報として、「ノード種別、矩形情報、データリスト」を記憶する。ここで記憶される「ノード種別」、「矩形情報」は、図9と同様なので詳細な説明は省略する。「データリスト」は、管理する多次元データである。インデックスDB12bは、R5、R6、R7、R8について、図11の情報を記憶する。
図11の場合、葉ノードR5は、x、yの2次元データを管理し、「x1=35.50、y1=139.25」が担当領域の最小点であり、「x2=35.65、y2=139.30」が担当領域の最大点であることを示す。すなわち、葉ノードR5が担当する領域は、両点を頂点として各次元軸に直交した4直線で作られる領域である。また、R5は、データ「D1、D2、D3、D4」へのポインタのリストを記憶する。各データの実体は、多次元データDB12cに格納されている。
図7に戻り、多次元データDB12cは、例えば2次元の位置情報などデータそのものを記憶する。具体的には、多次元データDB12cは、各葉ノードが保持するデータDの値そのものを記憶する。なお、データは、横(x)軸と縦(y)軸とから形成される2次元情報に限定されるものではなく、横(x)軸と縦(y)軸と時間(t)軸などの3次元情報であってもよく、3次元以上の多次元情報であってもよい。
更新/検索回数DB12dは、インデックスDB12bに記憶されるインデックスツリーの各ノードごとに、ノードが検索された回数、および、ノードが管理するデータ又は当該ノードの子ノードが更新された回数を記憶する。なお、ここで記憶される情報は、後述するデータ検索部14やデータ更新部15等によって更新される。
図12は、更新/検索回数DBに記憶される情報の例1を示す図である。図12に示すように、更新/検索回数DB12dは、「更新/変更回数計測開始時間」と「ノードID、検索回数、更新回数」を記憶する。ここで記憶される「更新/変更回数計測開始時間」は、計数が開始された時間であり、「ノードID」は、ノードを識別する識別子である。「検索回数」は、データ検索部14によって検索された回数であり、「更新回数」は、データ更新部15によって追加や削除などの更新がされた回数である。
2010/11/15 18:00:00.000に処理が開始され、ノードID=00001のノードは、現時点で145回検索され、349回更新されたことを示す。同様に、ノードID=00015のノードは、現時点で493回検索され、331回更新されたことを示す。なお、図12の場合、サーバの停止等によって、検索および更新回数をリセットしたりする。
図13は、更新/検索回数DBに記憶される情報の例2を示す図である。図13に示すように、更新/検索回数DB12dは、「最古更新/変更回数計測開始時間」と「ノードID、検索回数、更新回数」を記憶する。図12と異なる点は、各ノードごとに、例えば1時間など一定時間毎の検索および更新回数を記憶する点であり、一定期間を経過する度に各回数の値を一つずつ左方向にずらしても良い。
図13の場合、ノードID=00001の最新の情報として、現時点から1時間前までに「検索回数=145、更新回数=349」が計数されたことを示す。さらに1時間前まで、すなわち1時間前から2時間前までに「検索回数=139、更新回数=324」が計数されたことを示す。そして、最古の情報、すなわち4時間前から5時間前までに「検索回数=45、更新回数=169」が計数されたことを示す。
この場合、検索および更新指数の計算方法は、最も左の回数欄の計測開始時間と現在時刻の差で、各ノードIDの検索又は更新回数の全欄を足した値を割ることで、検索頻度及び更新指数を計算することができる。
データ検索部14は、ネットワーク経由で受信した検索リクエストに応じて、インデックスツリーを検索して応答する処理部である。図14は、データ検索リクエストの例を示す図である。図14に示すように、データ検索部14は、「多次元データ、検索範囲」として「35.4134、139.6252、100m」などを受信する。この「多次元データ」は、検索対象の位置情報であり、例えば緯度や経度の情報である。「検索範囲」は、指定された多次元データから検索対象の範囲を示す情報である。つまり、図14の場合、データ検索部14は、インデックスDB12bを参照し、「35.4134、139.6252」から100mに位置するデータを近傍検索して応答する。
また、別の例としては、図15は、データ検索リクエストの例を示す図である。図15に示すように、データ検索部14は、「多次元データ、検索データ数」として「35.4134、139.6252、10個」などを受信する。この「多次元データ」は、図14と同様であり、「検索データ数」は、指定された多次元データから近い位置に存在するデータを10個選択することを示す。つまり、図15の場合、データ検索部14は、インデックスDB12bを参照し、「35.4134、139.6252」の近くに存在する10個のデータを近傍検索して応答する。
また、図16は、データ検索応答の例を示す図である。図16に示すように、データ検索部14は、データの近傍検索結果として、ノードを特定する「ID」を応答する。つまり、図16の場合、データ検索部14は、データ検索リクエストにしたがってインデックスツリーを検索し、検索したノードのIDが「00001、00034、000097、・・・」であることを、リクエスト元に応答する。この実施例ではデータのIDを応答する例を示したが、IDではなくデータの内容にして応答しても良い。その場合は、データ検索部14は、検索されたIDに対応するデータを多次元データDB12cから取得し、取得したデータそのものを応答することもできる。
図7に戻り、データ更新部15は、インデックスDB12bに記憶されるインデックスツリーに対して、ノードの追加、ノードの削除、データの追加、データの削除を実行して、インデックスツリーを更新する処理部である。なお、ノードの追加、ノードの削除、データの追加、データの削除、さらにこれらに伴ってノードを分割または統合する処理については、図2から図6を用いて説明したので、ここでは詳細な説明は省略する。
また、データ更新部15は、データを追加または削除した場合には、インデックスDB12bに記憶される葉ノードのデータリストを更新する。また、データ更新部15は、インデックスツリーに変更があった場合には、その変更にあわせてインデックスDB12bを更新する。また、データ更新部15は、ノードを追加した場合には、「検索回数=0、更新回数=0」とする新たなレコードを更新/検索回数DB12dに作成する。データ更新部15は、ノードを削除した場合には、当該ノードに対応するレコードを更新/検索回数DB12dから削除する。
ノード制御部16は、ノードの分割または統合を実施するか否かを判定する処理部であり、分割統合判定部16aと、更新指数算出部16bと、分割統合制御部16cとを有する。
分割統合判定部16aは、データ更新部15やデータ検索部14による処理が実行され、各ノードが管理するデータ数または子ノード数が、記憶部12に記憶される上限値または下限値を満たすか否かを判定する処理部である。つまり、分割統合判定部16aは、データ更新部15やデータ検索部14の処理によって、ノードを分割する処理またはノードを統合する処理が発生したか否かを判定する。
例えば、分割統合判定部16aは、インデックスDB12bを参照し、データリストとして記憶するデータ数が上限値より多い葉ノードを分割対象として更新指数算出部16bに通知する。同様に、分割統合判定部16aは、インデックスDB12bを参照し、子ノードのポインタ数が上限値より多いブランチノードまたはルートノードを、分割対象として更新指数算出部16bに通知する。このとき、分割統合判定部16aは、ノードIDを更新指数算出部16bに通知する。
また、分割統合判定部16aは、インデックスDB12bを参照し、データリストとして記憶するデータ数が下限値より多い葉ノードを統合対象として更新指数算出部16bに通知する。同様に、分割統合判定部16aは、インデックスDB12bを参照し、子ノードのポインタ数が下限値より多いブランチノードまたはルートノードを、統合対象として更新指数算出部16bに通知する。このとき、分割統合判定部16aは、ノードIDを更新指数算出部16bに通知する。
更新指数算出部16bは、分割統合判定部16aから通知されたノードについて更新/検索回数DB12dを参照し、更新回数と検索回数とを用いて更新指数を算出する。例えば、更新指数算出部16bは、分割統合判定部16aからノードID=00001を受信した場合、図12の「ノードID」を参照して「検索回数=145、更新回数=349」を取得する。そして、更新指数算出部16bは、「更新回数(349)/検索回数(145)=2.40・・・」を更新指数として算出して分割統合制御部16cに通知する。
また、別の例としては、更新指数算出部16bは、分割統合判定部16aからノードID=00015を受信した場合、図13の「ノードID」のうち最新のデータを参照して「検索回数=493、更新回数=331」を取得する。そして、更新指数算出部16bは、「更新回数(331)/検索回数(493)=0.671・・・」を更新指数として算出して分割統合制御部16cに通知する。
分割統合制御部16cは、更新指数算出部16bの算出結果に基づいて、ノードの分割または統合を実行するか否かを判定する処理部である。例えば、分割統合制御部16cは、更新指数算出部16bが算出した更新指数が2以上であれば、更新指数が高いと判定し、当該ノードの更新を抑止すると判定する。そして、分割統合制御部16cは、データ更新部15に対して、当該ノードの分割または統合処理を抑止する指示を出力する。
また、分割統合制御部16cは、更新指数算出部16bが算出した更新指数が2未満であれば、更新指数が低いと判定し、当該ノードの更新を実行すると判定する。そして、分割統合制御部16cは、データ更新部15に対して、当該ノードの分割または統合処理を実行する指示を出力する。
なお、データ更新部15は、ノードを分割した場合、当該ノードの更新/検索回数については、分割後のそれぞれのノードが分割前のノードの回数を引き継ぐように制御してもよく、分割前の回数を半分ずつ引き継ぐようにしてもよい。また、データ更新部15は、分割後のそれぞれのノードについては、回数を0とすることもできる。つまり、ノード分割後については、ユーザやシステムの仕様によって任意に設定できる。
[処理の流れ]
次に、図17から図21を用いて、多次元データ検索サーバ10が実行する検索処理、追加処理、削除処理について説明する。
(検索処理)
図17は、実施例1に係る検索処理の流れを説明するフローチャートである。図17に示すように、検索リクエストを受信したデータ検索部14は、まず、ルートノードを選択し(S101)、選択したノードが葉ノードか否かをインデックスツリーやインデックスDB12bから判定する(S102)。
そして、データ検索部14は、選択したノードが葉ノードでないと判定した場合(S102否定)、選択ノードの子ノードに検索対象の座標を含むノードがあるか否かを、インデックスDB12bを参照して判定する(S103)。
その後、データ検索部14は、選択ノードの子ノードに検索対象の座標を含むノードがないと判定した場合(S103否定)、全ての選択候補ノードの検索を終了したか否かを、インデックスツリーやインデックスDB12bから判定する(S104)。
データ検索部14は、検索未実施の選択候補ノードが存在すると判定した場合(S104否定)、選択候補ノードの内の1つのノードを選択し、検索回数をインクリメントする(S105)。その後、データ検索部14は、S102以降の処理を繰り返す。
また、S102において、データ検索部14は、選択したノードが葉ノードであると判定した場合(S102肯定)、選択した葉ノードにある多次元データのうち、検索座標を含むデータを検索結果に追加し(S106)、S104以降の処理を実行する。例えば、データ検索部14は、選択した葉ノードが有する多次元データのIDまたはポインタを用いて多次元データDB12cを検索し、検索座標を含むデータを検索結果に追加する。
また、S103において、データ検索部14は、選択ノードの子ノードに検索対象の座標を含むノードがあると判定した場合(S103肯定)、検索座標を含む子ノードを選択候補ノードに加えて(S107)、S104以降の処理を実行する。なお、選択候補ノードのリスト等は、作業領域12aで管理される。
また、S104において、データ検索部14は、検索未実施の選択候補ノードが存在しないと判定した場合(S104肯定)、選択済みの座標データを検索結果として応答し(S108)、処理を終了する。
(追加処理)
図18と図19は、実施例1に係る追加処理の流れを説明するフローチャートである。図18に示すように、データやノードの追加を指示されたデータ更新部15は、ルートノードを選択し(S201)、インデックスDB12b等を参照して、選択した選択ノードが葉ノードか否かを判定する(S202)。
データ更新部15は、選択ノードが葉ノードではないと判定した場合(S202否定)、選択ノードの子ノードに、追加データの領域を包含するデータがあるか否かを、インデックスDB12b等を参照して判定する(S203)。
そして、データ更新部15は、追加データの領域を包含するデータがないと判定した場合(S203否定)、追加対象の多次元データを含めるために必要な拡大量が最小になる子ノードを選択ノードとして(S204)、S202以降の処理を実行する。
また、S203において、データ更新部15は、追加データの領域を包含するデータがあると判定した場合(S203肯定)、追加対象の多次元データを包含する子ノードのうち矩形面積が最小のものを選択ノードとする(S205)。その後、データ更新部15は、S202以降の処理を実行する。
一方、S202において、データ更新部15は、選択ノードが葉ノードであると判定した場合(S202肯定)、図19に示すように、選択した葉ノードに追加対象の多次元データを追加するとともに当該葉ノードの更新回数をインクリメントする(S206)。
続いて、分割統合判定部16aは、記憶部12やインデックスDB12bを参照し、選択した葉ノードの持つ多次元データ数が上限値を超えるか否かを判定し(S207)、超えない場合(S207否定)には、処理を終了する。
さらに、分割統合判定部16aが、選択した葉ノードの持つ多次元データ数が上限値を超えると判定した場合(S207肯定)、多次元データ検索サーバ10はS208を実行する。すなわち、更新指数算出部16bは、選択ノードの更新回数と検索回数とに基づいて更新指数を算出し、分割統合制御部16cは、算出された更新指数が所定値よりも大きい場合(S208否定)には、当該選択ノードの分割を抑止して処理を終了する。一方、分割統合制御部16cは、算出された更新指数が所定値よりも小さい場合(S208肯定)には、データ更新部15に当該選択ノードの分割を許可する。
分割が許可されたデータ更新部15は、分割結果の矩形の大きさの和が最小となるようにノードを2分割し、親ノードに追加する(S209)。このとき、データ更新部15は、インデックスDB12bのインデックスツリーを更新する。
続いて、データ更新部15は、更新/検索回数DB12dに分割した新ノードのデータ用の行を追加し(S210)、元ノードの更新および変更回数を半分にして、分割した新ノードの更新および変更回数にも元ノードと同じ半分にした値を更新/検索回数DB12dに登録する(S211)。
その後、分割統合判定部16aは、分割中のノードのデータ数が全て上限値以下でない場合(S212否定)、上限を超えている分割中ノードを1つ選択して(S213)、S209以降の処理を実行する。
一方、分割統合判定部16aは、分割中のノードのデータ数が全て上限値以下である場合(S212肯定)、追加する親ノードの持つ子ノード数が上限値を超えるか否かを判定する(S214)。そして、分割統合判定部16aは、追加する親ノードの持つ子ノード数が上限値を超えないと判定した場合(S214否定)、処理を終了し、追加する親ノードの持つ子ノード数が上限値を超えると判定した場合(S214肯定)、S215を実行する。
すなわち、S208と同様、分割統合制御部16cは、更新指数算出部16bが算出した更新指数が所定値よりも大きい場合(S215否定)には、当該選択ノードの分割を抑止して処理を終了する。一方、分割統合制御部16cは、算出された更新指数が所定値よりも小さい場合(S215肯定)には、データ更新部15に当該選択ノードの分割を許可する。
続いて、データ更新部15は、インデックスDB12bや多次元データDB12cを参照し、追加する親ノードがルートノードである場合に(S216肯定)、現ルートノードを分割し、その上に新ルートノードを作成して(S217)、処理を終了する。一方、データ更新部15は、追加する親ノードがルートノードでない場合に(S216否定)、親ノードを分割対象として(S218)、S209以降の処理を繰り返す。
(削除処理)
図20と図21は、実施例1に係る削除処理の流れを説明するフローチャートである。図20に示すように、データ更新部15は、データ検索部14が図17に示した処理によって特定した削除対象データを葉ノードから削除する(S301、S302)。なお、データ更新部15は、多次元データに自身が含まれる葉ノードの情報を記録し、削除時にはデータIDなどから削除対象のデータを多次元データDB12cから取得して、葉ノードを辿っても良い。この場合、データ更新部15は、葉ノードの分割・統合時にデータに記録する葉ノードを書き直すことになる。
このとき、データ更新部15は、インデックスDB12bや多次元データDB12cから、削除対象データを削除する。続いて、データ更新部15は、データを削除した葉ノードの更新回数をインクリメントする(S303)。
そして、分割統合判定部16aは、データが削除された葉ノードが保持するデータ数が下限値未満か否かを、記憶部12やインデックスDB12bを参照して判定する(S304)。分割統合判定部16aは、データ数が下限値未満でないと判定した場合(S304否定)、処理を終了し、分割統合判定部16aによってデータ数が下限値未満であると判定された場合(S304肯定)、S305が実行される。
すなわち、更新指数算出部16bは、選択ノードの更新回数と検索回数とに基づいて更新指数を算出し、分割統合制御部16cは、算出された更新指数が所定値よりも大きい場合(S305否定)には、当該選択ノードの統合を抑止して処理を終了する。一方、分割統合制御部16cは、算出された更新指数が所定値よりも小さい場合(S305肯定)には、データ更新部15に当該選択ノードの統合を許可する。
続いて、データ更新部15は、対象ノードの兄弟ノードについて、対象ノードの矩形領域を追加したときの領域増加が最小となる兄弟ノードを選択して統合する(S306)。そして、データ更新部15は、統合前のノードの更新および検索回数各々を、統合先のノードの更新および検索回数各々に追加する(S307)。
その後、データ更新部15は、統合して削除したノードのエントリを更新/検索回数DB12dから削除した後(S308)、当該ノードの親ノードの更新回数をインクリメントする(S309)。
そして、分割統合判定部16aによって統合ノードの子ノード数またはデータ数が上限値を超えると判定された場合(S310肯定)、データ更新部15は、分割結果の矩形の大きさの和が最小となるように、統合ノードを再分割する(S311)。
続いて、データ更新部15は、分割して増加したノードを親ノードに追加し(S312)、更新/検索回数DB12dに、分割ノード用の行を追加する(S313)。そして、データ更新部15は、元ノードの更新および検索回数を半分にし、分割ノードの更新および検索回数も同じ回数にした情報を更新/検索回数DB12dに記録して処理を終了する(S314)。
図21に示すように、分割統合判定部16aは、統合ノードの子ノード数またはデータ数が上限値を超えないと判定された場合(S310否定)、親ノードがルートノードであるか否かを判定する(S315)。そして、分割統合判定部16aは、親ノードがルートノードでない場合(S315否定)、親ノードの子ノード数が下限値未満か否かを判定する(S316)。
親ノードの子ノード数が下限値未満と判定された場合(S316肯定)、S317が実行される。すなわち、更新指数算出部16bは、選択ノードの更新回数と検索回数とに基づいて更新指数を算出し、分割統合制御部16cは、算出された更新指数が所定値よりも大きい場合(S317否定)には、当該選択ノードの統合を抑止して処理を終了する。一方、分割統合制御部16cは、算出された更新指数が所定値よりも小さい場合(S317肯定)には、データ更新部15に当該選択ノードの統合を許可する。データ更新部15は、親ノードを統合対象として(S318)、S306以降の処理を実行する。
また、S316において、親ノードの子ノード数が下限値以上と判定された場合(S316否定)、データ更新部15は、処理を終了する。
また、S315において、親ノードがルートノードである場合(S315肯定)、データ更新部15は、ルートノードの子ノード数が1つにならない場合(S319否定)、処理を終了する。
一方、データ更新部15は、ルートノードの子ノード数が1つになる場合(S319肯定)、現ルートノードを削除し、統合結果のノードを新規ルートノードとする(S320)。その後、データ更新部15は、前ルートノードのエントリを更新/検索回数DB12dから削除して処理を終了する(S321)。
[実施例1による効果]
実施例1によれば、更新指数の高い領域については、負荷の高いインデックス更新処理、すなわちノードの分割処理を抑止することで、多次元データ検索サーバ10の処理負荷を軽減する。この結果、多次元データ検索サーバ10は、分割処理を抑止したツリーについては、その部分だけ更新に時間がかかる場合もあるが、ツリー全体としては検索処理性能を向上させることができる。
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
(閾値例)
例えば、上記実施例では、分割または統合を実行するまたは抑止する判定に用いる子ノード数の上限値および下限値は、サーバ管理者によって予め定められた所定の値であったが、更新/検索回数の比の関数とすることもできる。例えば、更新/検索回数=Rとして、上限値Lmaxを「Lmax=2×R+5」とすることもできる。同様に、更新/検索回数=Rとして、上限値Lmaxを「Lmin=5−2×R」とすることもできる。つまり、「更新指数=更新回数/検索回数=R=2」の場合、上限値(Lmax)は9となり、下限値(Lmin)は1となる。
したがって、多次元データ検索サーバは、インデックスツリーのあるノードについて分割対象か否かを判定する場合には、まず、上限値Lmaxを算出する。続いて、多次元データ検索サーバは、ノードが管理するデータ又は当該ノードの子ノードの数が算出した上限値Lmaxよりも多い場合には、分割対象のノードとして特定し、特定したノードについて分割処理または統合処理の実行を判断することができる。また、多次元データ検索サーバは、特定したノードについて、更新指数を算出して分割を実行または抑止することもできる。
同様に、多次元データ検索サーバは、インデックスツリーのあるノードについて統合対象か否かを判定する場合には、まず、下限値Lminを算出する。続いて、多次元データ検索サーバは、ノードが管理するデータ又は当該ノードの子ノードの数が算出した下限値Lminよりも少ない場合には、統合対象のノードとして特定する。その後、多次元データ検索サーバは、特定したノードについて、更新指数を算出して統合を実行または抑止することもできる。
別の手法としては、多次元データ検索サーバは、インデックスツリーのあるノードについて分割または統合対象か否かを判定する場合には、まず、上限値Lmaxと下限値Lminを算出する。そして、多次元データ検索サーバは、ノードが管理するデータ又は当該ノードの子ノードの数が上限値から下限値の範囲内である場合には、分割または統合を抑止する。一方、多次元データ検索サーバは、ノードが管理するデータ又は当該ノードの子ノードの数が上限値から下限値の範囲内にない場合には、分割または統合を実行するようにすることもできる。つまり、多次元データ検索サーバは、上限値Lmaxと下限値Lminを、分割または統合を抑止する判断材料とすることもできる。
なお、この例では、上限値Lmaxを計算する関数を頻度比Rの一次関数としたが、高次関数や指数関数などを用いることもできる。同様に、下限値LminについてもRの高次関数や指数関数とすることもできる。この時、頻度比Rが増えるにしたがって上限値は単調増加するよう、また下限値が単調減少するように定める。
また、分割するかしないかの判断に用いられる更新指数の上限値と、統合するかしないかの判断に用いられる上限値は、同じ値であっても良いし、統合処理と分割処理の負荷を考慮して異なる値としても良い。この場合、より負荷の高い処理に対応する上限値の方を、なるべく処理を控えるべきであるので、上限値の値を小さくすることが好ましい。
また、上記実施例では、更新回数/検索回数を更新指数として算出する例について説明したが、これに限定されるものではない。例えば、上述した例と同様、指数関数などの公知の関数を用いることもできる。また、更新頻度が多いノードか否かを判定する任意にお関数等を用いることもできる。
(サービス例1)
上述した多次元データ検索サーバを用いたサービス形態の例について説明する。図22は、多次元データ検索サーバを用いたサービス例1を示す図である。図22は、事故情報共有サービスである。一例としては、事故警告サービスの利用者が月額300円などの利用料を払って、車両の位置情報を送り、周辺に事故があった際に警告情報を受け取ることができる。
具体的には、車両位置収集サーバが各車両から位置情報を収集して多次元データ検索サーバに送信する。多次元データ検索サーバは、各車両の位置情報のインデックスツリーを生成する。事故警告サービスサーバは、周辺検索(事故座標、半径100m)などの要求を多次元データ検索サーバに送信する。多次元データ検索サーバは、事故があった座標から半径100m内に存在する車両の情報を事故警告サービスサーバに送信する。事故警告サービスサーバは、多次元データ検索サーバから通知された各車両に対して運転注意を警告する。このようにすることで、車両の安全運転を促進するサービスを提供することができる。
(サービス例2)
上述した多次元データ検索サーバを用いたサービス形態の例について説明する。図23は、多次元データ検索サーバを用いたサービス例2を示す図である。図23は、業務端末管理サービスである。一例を挙げると、業務端末を管理する主体が、サーバを用意して業務管理端末の位置情報を管理する。そして、業務端末は、周囲の業務端末を検索して不足機能の補助依頼やオペレータへのヘルプ通知を送信する。
具体的には、端末位置収集サーバが各端末から位置情報を収集して多次元データ検索サーバに送信する。多次元データ検索サーバは、各端末の位置情報のインデックスツリーを生成する。業務端末は、多次元データ検索サーバに対して、自端末の周辺検索(端末座標、半径100m)を送信する。多次元データ検索サーバは、受信した端末座標から半径100mに位置する端末を特定して、業務端末に応答する。業務端末は、受信した端末に対して不足機能の補助依頼やオペレータへのヘルプ通知を送信する。
(データ例)
上記実施例では、データと2次元データの例を説明したが、これに限定されるものではなく、例えばさらに高さや時間軸を入れた3次元データであってもよい。すなわち、開示する多次元データ検索サーバで管理できるデータの次元は、2次元に限定されるものではない。
(システム)
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
(プログラム)
ところで、上記の実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータの一例を説明する。
図24は、インデックス管理プログラムを実行するコンピュータのハードウェア構成例を示す図である。図24に示すように、コンピュータ100は、バス101に、CPU102、入力装置103、出力装置104、通信インタフェース105、記録媒体読み取り装置106、HDD(Hard Disk Drive)107、RAM(Random Access Memory)108が接続される。
入力装置103は、マウスやキーボードであり、出力装置104は、ディスプレイなどであり、通信インタフェース105は、NIC(Network Interface Card)などのインタフェースである。HDD107は、インデックス管理プログラム107aととともに、図7等に示した各テーブル等に記憶される情報を記憶する。記録媒体の例としてHDD107を例に挙げたが、ROM(Read Only Memory)、RAM(Random Access Memory)、CD−ROM等の他のコンピュータが読み取り可能な記録媒体に各種プログラムを格納しておき、コンピュータに読み取らせることとしてもよい。なお、記憶媒体を遠隔地に配置し、コンピュータが、その記憶媒体にアクセスすることでプログラムを取得して利用してもよい。また、その際、取得したプログラムをそのコンピュータ自身の記録媒体に格納して用いてもよい。
CPU102は、インデックス管理プログラム107aを読み出してRAM108に展開することで、図7等で説明した各機能を実行するインデックス管理プロセス108aを動作させる。すなわち、インデックス管理プロセス108aは、図7に記載したデータ検索部14、データ更新部15、ノード制御部16の各処理部と同様の機能を実行する。このようにコンピュータ100は、プログラムを読み出して実行することでインデックス管理方法を実行する情報処理装置として動作する。
例えば、コンピュータ100は、記録媒体読み取り装置106によって記録媒体からインデックス管理プログラムを読み出し、読み出されたインデックス管理プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、コンピュータ100によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。