Xindice:無料で使えるXMLデータベース(3)

サーブレットからのXMLデータベース検索


3-3. インデックスで高速化

  検索を高速化するためのインデックスについて解説します。インデックスは、リレーショナル・データベースでも必須の要素ですが、Xindiceではどのように利用するのかを紹介します。最初にインデックスを管理するコマンドを紹介し、次にインデックスの有無によってどのくらいスピードが変わるかを紹介していきます。

インデックス管理コマンド

 インデックス管理コマンドには、インデックスの追加、削除、リスト表示を行うものがあります。

インデックスの追加
xindiceadmin ai -c コレクション -n インデックス名 -p パターン

 パターンには、次のような形式が利用可能です。XMLデータベースらしくXPath式に基づいたものになっていることが分かるでしょう。

パターン 説明
problem@id 要素<problem>の属性「id」に対してインデックスが作成される
description 要素<description>の内容に対してインデックスが作成される
*@id 任意の要素の属性「id」に対してインデックスが作成される
problem@* 要素<problem>の任意の属性に対してインデックスが作成される

 注意が必要な点は、日本語が入るものに対して、現在のXindice 1.0ではインデックスがうまく動作しないことです。インデックスを付けていない場合は正しく検索できるのに、インデックスを付けると検索できなくなったりします。

 以下、実際にインデックスを追加する例を示します。

ネームスペース指定なしの例
xindiceadmin ai -c /db/sampledb -n statusindex -p problem@status

 これによって、コレクション「/db/sampledb」に登録されているドキュメントのすべての要素<problem>の属性「status」に対してインデックスが作成されます。

ネームスペース指定ありの例
xindiceadmin ai -c /db/sampledb -n statusindex2 -p [http://sample_xindice/]problem@[http://sample_xindice/]status

 ネームスペース指定なしの例をネームスペース指定ありに変更したものがこれです。プリフィックスは使わず、URIを[]の中に直接書いて表現します。

インデックスの削除
xindiceadmin di -c コレクション -n インデックス名

 インデックス名には、追加で使ったものを指定します。

インデックスのリスト表示
xindiceadmin li -c コレクション

インデックスの有無によるスピード比較

 インデックスによってどれくらいスピードが違うのでしょうか。1つのコレクションに4、50、100個のドキュメントが存在するケースについて、2通りのXPath式で検索し測定してみましたので、測定条件、測定結果、という順で紹介します。

1.測定条件

 測定条件として、対象としたドキュメント、XPath式、それから測定方法について説明します。

 ドキュメントは、これまで利用してきたサンプルのXML文書の属性「id」と属性「who」を変えて利用しました。これは、今回対象とするXPath式で比較を行うのが、その2つの属性だからです。登録されたXML文書の属性「id」はすべて違い、属性「who」は「A_company」が2つ、そのほかは「B_corporation」「C_customer」「C_company」のいずれかです。

 XPath式には、次の2つを用いました。

/problem[@id='ID0004']
/problem[actions/action/@who='A_company']

 前者では、検索結果が1つだけになります。後者では、検索結果が2つになります。まとめると、この2つの式の違いは、検索条件の複雑さが多少違うこと、検索結果の数が違うこと、だといえます。

 測定方法ですが、検索を100回行った合計時間を3回測定し、その平均をとっています。

測定結果

 2つのXPath式で測定した結果を示します。ただし、ハードウェア、JavaVM、OS、リソースの利用状況などといったさまざまな要因で測定結果は変わりますので、あくまでインデックス利用の有無でどの程度の違いがあるのか、大ざっぱに見てください。

1. XPath式「/problem[@id='ID0004']」の場合

 複数のドキュメントの中から、検索結果としてXML文書が1つだけ得られる、インデックスが一番有効なケースです。インデックスのパターンとしては「problem@id」を指定しています。

ドキュメント数4 ドキュメント数50 ドキュメント数100
インデックスなし 5.2 43.6 69.0
インデックスあり 2.1 2.1 2.2
(単位:秒)

 インデックスがない場合は検索対象となるXML文書数に応じて検索時間が増大するのに対し、インデックスがある場合はXML文書数にほとんど影響を受けてないことが分かります。

2. XPath式「/problem[actions/action/@who='A_company']」の場合

 1の場合よりも多少検索条件を複雑にして、検索結果としてXML文書が2つ得られるケースです。インデックスのパターンとしては「action@who」を指定しています。

ドキュメント数4 ドキュメント数50 ドキュメント数100
インデックスなし 5.0 43.5 71.2
インデックスあり 3.2 3.2 3.2
(単位: 秒)

 インデックスありの時間が多少大きいことを除いて、1の場合とほぼ同様の傾向でした。多少検索条件は複雑であるものの、本質的にはあまり変わりのない条件だったと考えられます。インデックスの効果は、まるでリレーショナル・データベースと同じようだと思われた方も多いかもしれません。この程度の簡単な式であれば、そのとおり、リレーショナル・データベースの場合とある程度似た感覚で扱えると思ってよいと思います。

 今回で検索については終了です。次回は、更新APIの紹介をします。

7/9

Index
Xindice:無料で使えるXMLデータベース
  Xindiceをインストールする(Windows/UNIX)
・Javaで作られたXindice
・ネイティブXMLデータベースの特徴
・Xindiceの特徴
・Xindiceをインストールする
  XMLデータベースの作成と基本的な検索
・起動と停止
・コマンドラインからXindiceを利用する
・コレクションとドキュメント
・では、検索してみよう
・Xindiceの主なコマンド一覧
  Javaプログラムによる検索の手順
・検索用APIの使い方
  検索サンプルアプリケーションの実際
・例外
・XPath
・Xindiceで検索するサンプルアプリケーション
・ネームスペースを利用しない例
・ネームスペースを利用する例
  サーブレットからXindiceを呼び出す
・サーブレット環境の準備
・Webアプリケーションの準備
  Xindiceを呼び出すサンプルサーブレット
・XPath式の結果をXML文書として返す
・結果をXSLTでHTMLに変換する
・変換のためのXSLTは別ファイル
インデックスで高速化
・インデックス管理コマンド
・インデックスの有無によるスピード比較
・測定結果
  XUpdate言語の使い方
・現在ドラフト中のXUpdate
・ノードの挿入・追加
・ノードの更新
ノードの削除
・ノード名変更
  Javaアプリケーションから更新・削除を実行する
・更新用APIの使い方
・サンプルアプリケーション
・実行準備


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間