序章


CouchDB


CouchDBは、データをJSONドキュメントとして保存するNoSQLデータベースです。 スキーマが頭痛の種になり、柔軟なデータモデルが必要な状況で非常に役立ちます。 CouchDBは、マスター-マスター連続レプリケーションもサポートしています。つまり、マスターデータベースとスレーブデータベースの複雑なシステムをセットアップしなくても、2つのデータベース間でデータを継続的にレプリケートできます。

ElasticSearch


ElasticSearchは、すべてにインデックスを付け、ほとんどすべてのものを検索可能にする全文検索エンジンです。 これはCouchDBで非常にうまく機能します。CouchDBの制限の1つは、すべてのクエリでドキュメントIDを知っているか、map/reduceを使用する必要があることです。

CouchDBのインストール


最新バージョンを入手するために、ソースからCouchDBをインストールします。 これに関するより完全なチュートリアルは、ここで見ることができます。

環境の設定


パッケージマネージャーを更新します。

apt-get update

カウチをコンパイルするためのツールをインストールします。

apt-get install -y build-essential

CouchDBが書かれているプログラミング言語であるErlangをインストールします。

apt-get install -y erlang-base erlang-dev erlang-nox erlang-eunit

CouchDBに必要な残りのライブラリをインストールします。

apt-get install -y libmozjs185-dev libicu-dev libcurl4-gnutls-dev libtool

ソースファイルを取得する


CouchDBソースファイルが存在するディレクトリに移動します。

cd /usr/local/src

ソースファイルを取得します。

curl -O http://apache.mirrors.tds.net/couchdb/source/1.5.0/apache-couchdb-1.5.0.tar.gz

ソースファイルを解凍します。

tar xvzf apache-couchdb-1.5.0.tar.gz

新しいディレクトリに移動します。

cd apache-couchdb-1.5.0

ソースを構成してインストールします。

./configure
make && make install

注:この手順には時間がかかる場合があります。 完了すると、CouchDBが完全にインストールされます。 次に、適切なユーザーを作成し、権限を割り当てる必要があります

CouchDBのインストールの完了


CouchDBユーザーを作成します。

adduser --disabled-login --disabled-password --no-create-home couchdb

注:必要に応じて、名前などを尋ねるプロンプトは無視できます。 それぞれのデフォルト値を使用できます。

CouchDBユーザーに適切な権限を割り当てます。

chown -R couchdb:couchdb /usr/local/var/log/couchdb /usr/local/var/lib/couchdb /usr/local/var/run/couchdb

CouchDBをサービスとしてセットアップして、手動で開始する必要がないようにします。

ln -s /usr/local/etc/init.d/couchdb  /etc/init.d
update-rc.d couchdb defaults

CouchDBを起動します。

service couchdb start

CouchDBが実行されていることを確認します

curl localhost:5984

次で始まる応答が表示されます。

{"couchdb":"Welcome"...

ElasticSearchのインストール


初期設定


ヘッドレスopen-jdkの最新バージョンをインストールします。

apt-get install openjdk-7-jre-headless

ElasticSearchの最新バージョンを入手します。

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.8.deb

パッケージをインストールします。

dpkg -i elasticsearch-0.90.8.deb

続行する前に、Elasticsearchを構成して、パブリックインターネットにアクセスできないようにする必要があります。Elasticsearchにはセキュリティが組み込まれておらず、HTTPAPIにアクセスできるすべてのユーザーが制御できます。 これは、elasticsearch.ymlを編集することで実行できます。 パッケージとともにインストールしたと仮定して、次のコマンドで構成を開きます。

sudo vi /etc/elasticsearch/elasticsearch.yml

次に、network.bind_hostを指定する行を見つけ、コメントを外して値をlocalhostに変更し、次のようにします。

network.bind_host: localhost

次に、ファイルのどこかに次の行を挿入して、動的スクリプトを無効にします。

script.disable_dynamic: true

保存して終了。 次に、Elasticsearchを再起動して、変更を有効にします。

sudo service elasticsearch restart

ElasticSearchが実行されていることを確認します(リクエストが最初に失敗した場合は、再試行してください。 開始するまでに少し時間がかかる場合があります):

curl http://127.0.0.1:9200

次で始まる応答が表示されます。

{ "ok" : true, "status" : 200, 

ElasticSearchがインデックスを保存する場所を変更する


ElasticSearchを停止します:

/etc/init.d/elasticsearch stop

新しいディレクトリを作成します。

mkdir /var/data/
mkdir /var/data/elasticsearch

ディレクトリの所有権を「elasticsearch」ユーザーに変更します。

chown elasticsearch /var/data/elasticsearch

グループを変更します。

chgrp elasticsearch /var/data/elasticsearch

新しいデータディレクトリを反映するようにElasticSearch構成ファイルを変更します


nanoを使用してElasticSearch構成ファイルを開きます。

nano /etc/default/elasticsearch

以下を含む行を変更します。

DATA_DIR=

DATA_DIR= /var/data/elasticsearch

ファイルを保存して閉じます。

2つを一緒に機能させる


ElasticSearch用のCouchDBRiverプラグインをインストールします


ElasticSearchディレクトリに移動します。

cd /usr/share/elasticsearch/

プラグインをインストールします。

./bin/plugin -install elasticsearch/elasticsearch-river-couchdb/1.2.0

ElasticSearchバックアップを開始します


ElasticSearchを開始します:

/etc/init.d/elasticsearch start

CouchDBデータベースとElasticSearchインデックスを作成します


CouchDBにいくつかのものを入れる


CouchDBデータベースを作成します。

curl -X PUT http://127.0.0.1:5984/testdb

いくつかのテストドキュメントを作成します。

curl -X PUT 'http://127.0.0.1:5984/testdb/1' -d '{"name":"My Name 1"}' 
curl -X PUT 'http://127.0.0.1:5984/testdb/2' -d '{"name":"My Name 2"}' 
curl -X PUT 'http://127.0.0.1:5984/testdb/3' -d '{"name":"My Name 3"}' 
curl -X PUT 'http://127.0.0.1:5984/testdb/4' -d '{"name":"My Name 4"}'

データベースを使用してElasticSearchをセットアップする


インデックスを作成します。

curl -X PUT '127.0.0.1:9200/_river/testdb/_meta' -d '{ "type" : "couchdb", "couchdb" : { "host" : "localhost", "port" : 5984, "db" : "testdb", "filter" : null }, "index" : { "index" : "testdb", "type" : "testdb", "bulk_size" : "100", "bulk_timeout" : "10ms" } }'

試して!


ElasticSearchでテストクエリを実行します。

curl http://127.0.0.1:9200/testdb/testdb/_search?pretty=true

これに似たものが表示されるはずです。

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 4,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "testdb",
      "_type" : "testdb",
      "_id" : "4",
      "_score" : 1.0, "_source" : {"_rev":"1-7e9376fc8bfa6b8c8788b0f408154584","_id":"4","name":"My Name 4"}
    }, {
      "_index" : "testdb",
      "_type" : "testdb",
      "_id" : "1",
      "_score" : 1.0, "_source" : {"_rev":"1-87386bd54c821354a93cf62add449d31","_id":"1","name":"My Name"}
    }, {
      "_index" : "testdb",
      "_type" : "testdb",
      "_id" : "2",
      "_score" : 1.0, "_source" : {"_rev":"1-194582c1e02d84ae36e59f568a459633","_id":"2","name":"My Name 2"}
    }, {
      "_index" : "testdb",
      "_type" : "testdb",
      "_id" : "3",
      "_score" : 1.0, "_source" : {"_rev":"1-62a53c50e7df02ec22973fc802fb9fc0","_id":"3","name":"My Name 3"}
    } ]
  }
}

これで、map / reduceまたは各ドキュメントの_idの使用に限定されるのではなく、ElasticSearchを使用してデータに対してフルテキストクエリを実行できます。