連載
» 2010年03月18日 00時00分 公開

ゆったリラックス! CouchDBがあるところ(4):ここまでできる! CouchDBパワーアップ作戦 (1/3)

さらに一歩踏み込んで、実運用のためのノウハウを知りましょう。全文検索、ユーザー認証、負荷分散手法を解説します(編集部)

[z.ohnami,CouchDB JP]

 これまでの連載を通して、CouchDBの基本的な概念と使い方、アプリケーションの作成方法までを解説してきました。ここからはさらに一歩踏み込んで、CouchDBをDBサーバやAPサーバとして実際に運用するときに役に立つ機能を紹介していきます。具体的には、次の3つのテーマを取り扱います。

  • 全文検索
  • ユーザー認証
  • 負荷分散

 全文検索を導入すれば、CouchDB内にあるすべてのドキュメントを対象に、特定のキーワードを指定して検索できます。ユーザー認証では、例えばDBの管理者権限を特定のユーザーのみに付与できます。ユーザー認証はまだ充実しているとはいえないレベルですが、現時点ではどのような選択肢があるかを紹介していきたいと思います。最後にCouchDBへの負荷を分散させる方法として、CouchDBのインスタンスをノードとして複数用意し、各ドキュメントを分散して配置するやり方を紹介します。これらの手段を目的に応じて生かすことができれば、いままで以上にCouchDBのポテンシャルを引き出せるはずです。

 なお、筆者は検証環境にUbuntu Linux 9.10 Server Edition、CouchDB 0.10.1を使用しています。コマンドや設定のサンプルは検証環境で使用したものがベースになっています。

CouchDBの全文検索

 DBに全文検索機能を導入すれば、ユーザーによる検索の自由度を高められます。Webの検索エンジンを使うときと同じように、検索条件としてのキーワードを自由に指定し、CouchDBの中からキーワードに該当するドキュメントを検索できます。検索はドキュメントを電子化した場合に得られるメリットの1つですね。うず高く積み上げられた紙の山から3年前くらい作ったはずの、どこにあるか分からないような書類を探すときのことを想像してみてください。CouchDBでドキュメントを電子化し、全文検索機能を用意しておけば、ドキュメントを探す労力を大幅に削減できるはずです。

 簡単に全文検索機能を導入するには、couchdb-luceneを利用します。これはApache Luceneをラップした、Javaによるライブラリです。ここではCouchDBのExternal Process(外部プロセス)として、couchdb-luceneを呼び出して使う方法を紹介します。次の手順で導入してみましょう。

  1. Javaのインストール
  2. coucdb-luceneの設定
  3. CouchDBの設定
  4. インデックスの作成
  5. 検索のテスト

1.Javaのインストール

 couchdb-luceneを使用する場合、Java5以上が推奨になります。筆者はSunのサイトから最新版を入手しました。インストールの方法はSunのサイトをご覧ください。

2.couchdb-luceneの設定

 Githubにcouchdb-luceneのソースコードがありますが、作者によるとソースコード版はCouchDBの次期バージョンに備えて開発中のようです。安定版(v0.4)のjarファイルをこちらから入手しましょう。入手したファイルはgz形式になっています。unpack200コマンドを使って、jarファイルにしましょう。unpack200コマンドはjavaをインストールした場所(/usr/binなど)に入っています。jarファイルの所有者は、CouchDBを起動するときの使用するユーザーに変更し、パーミッションも実行可能状態に変更しておきます。

$ unpack200 couchdb-lucene-0.4-jar-with-dependencies.jar.gz
$ sudo chown couchdb:couchdb couchdb-lucene-0.4-jar-with-dependencies.jar
$ sudo chmod 0770 couchdb-lucene-0.4-jar-with-dependencies.jar 

3.CouchDBの設定

 default.iniという設定ファイルを変更し、External Process(外部プロセス)としてcouchdb-luceneを登録します。Dcouchdb.urlというパラメータにIPアドレスやホスト名を指定します。このパラメータがあることで検索プログラムを実行するサーバと、DBサーバとを分離させることができます。検索へのニーズが高まった場合は、検索機能のみを外出しにして、スケールできる仕組みになっています。設定が終わったら、CouchDBを起動しましょう。

 ;/usr/local/etc/couchdb/default.ini の一部を次のように変更
  [couchdb]
  ;5000から60000へ変更
  os_process_timeout = 60000 ; 
  ;以下を追加
  [external]
  fti=/usr/java/jre1.6.0_17/bin/java -Dcouchdb.url="http://aa.bb.cc.dd:5984" -jar /your-path/couchdb-lucene-0.4-jar-with-dependencies.jar -search
  ;以下を追加
  [update_notification]
  indexer=/usr/java/jre1.6.0_17/bin/java -Dcouchdb.url="http://aa.bb.cc.dd:5984" -jar /your-path/couchdb-lucene-0.4-jar-with-dependencies.jar -index
  [httpd_db_handlers]
  ;以下を追加
  _fti = {couch_httpd_external, handle_external_req, <<"fti">>}

4.インデックスの作成

 全文検索は、インデックスに登録されているキーワードに対して照会をします。そのため、インデックスの構造を事前に定義しておく必要があります。インデックスを定義しておけば、ドキュメントの作成や更新が行われた時点でドキュメントのデータを分解し、自動的にインデックスを再更新してくれるようになります。具体的には、先ほどの設定項目である“update_notification”に指定していたプログラムが実行されます。

 インデックスはCouchDBのデザインドキュメント内に定義します。次の例では、ドキュメントの中に“name”と“type”という項目があれば、項目の値がインデックスへ登録されます。

  function(doc) {
     var ret=new Document();
     ret.add(doc.name);
     ret.add(doc.type); //複数の項目を登録できます。
     return ret;
  }

 インデックスの定義は、以下のようにデザインドキュメント内の“fulltext”という項目に登録しておきます。

  {
     "_id": "_design/f01", //f01という名前で登録
     "_rev": "26-58900ea8d4daf981e93c827fb428272a",
     "fulltext": { //ここに記述する
         "by_name": {
             "index": "function(doc) { 
                           var ret=new Document(); 
                           ret.add(doc.name); 
                           return ret; 
                        }"
         }
     },
     "views": {
            //通常のビュー定義など。
         }
     }
  } 

 次のコードは、ドキュメントのすべての内容をインデックスとして登録するパターンです。ソースコードが長くなると、Futonの画面では編集が面倒です。前回で紹介したcouchappなどのツールを使い、ソースコードをアップロードする方法をお勧めします。

  function(doc) { 
    var ret = new Document(); function idx(obj) {
    for (var key in obj) {
        switch (typeof obj[key]) {
        case 'object':
        idx(obj[key]);
        break;
        case 'function':
        break;
        default:
        ret.add(obj[key]);
        break;
        }
    } 
    }; idx(doc); if (doc._attachments) {
    for (var i in doc._attachments) {
        ret.attachment("attachment", i);
    } 
    }
    return ret;
} 

5.検索の実行

 以上で検索の準備が整いました。通常の問い合わせと同じように、GETメソッドで結果を取得します。“q”パラメータに検索したいキーワードを指定します。JSON形式でドキュメントの_idと、検索結果がどれくらいキーワードに一致しているかを表すスコアが返ってきます。

$ curl -X GET http://site-a:5984/dbname/_fti/f01/by_name?q="matini"
{"q":"default:matini", 〜 "rows":[{"id":"matini","score":0.7326374053955078}]}

 検索結果にドキュメントの内容をすべてを含めたい場合は、include_docs=trueというパラメーターを追加します。

 _fti/f01/by_name?q="matini"&include_docs=true 

 couchdb-luceneのGithubでは、さまざまなインデックスのサンプルや検索時に指定できるパラメーターが多数掲載されています。いろいろと試してみて、全文検索の威力を体感しましょう。

       1|2|3 次のページへ

Copyright© 2018 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。