ElasticsearchでCentOS上にNgram全文検索サーバを構築する - (その1)インストールと基本のデータ操作
ここしばらくオープンソースの全文検索エンジン、Elasticsearchを調べてました。
今回はNgramによる検索ができるように設定したので、その時のことをインストール方法から書きます。 どうにも同じ全文検索エンジンであるApache Solrに比べて新しいせいか、ネットの情報が少ないと感じたのと、検索エンジンをまじめに導入したのが初めてだったので、結構大変でした。 なお、この記事は自分用の備忘録をかねているので、いろいろ長くなりそうです。 よって何回かにわけて書く予定です。
Elasticsearchの概要
- 全文検索エンジン(全文検索機能をもつデータベース)
- データ構造はJSON。スキーマレス。(MongoDBに似ている)
- Javaで実装されている。内部にLuceneを使用している。(solrに似ている)
- foursquare、Githubなどでの利用実績。
- HTTPのREST APIがデータ操作のインターフェース。
- AWSとは何にも関係ない。
買って参考にした書籍
ちょっと情報古いですけど情報は網羅されているし、アーキテクチャの解説もあるのでかなり参考になりました。 あとは、公式サイトのドキュメントを見ながら作業しました。
やったこと
CentOS6をプラットフォームとした自前検索サーバの構築。 検索サーバはシンプルに一台のみ。分散環境やレプリケーションはやってないです。
インストールと起動
ElasticsearchはJavaによる実装なのでyumでまずjavaを入れます。
$ yum install java-1.7.0-openjdk
その後公式サイトからRPMをダウンロードしてインストール。
$ rpm -ivh elasticsearch-0.90.7.noarch.rpm
起動
$ /etc/init.d/elasticsearch start
ポート9200をListenしてデーモンが起動します。インストールはこれだけです。
なおディレクトリ構造は以下のようになっています。
/etc/elasticsearch/
:設定ファイル/var/lib/elasticsearch/
:データディレクトリ/usr/share/elasticsearch/bin/
:実行ファイル/usr/share/elasticsearch/lib/
:ライブラリ(Javaなのでjarがある)
基本の論理構成
Elasticsearchのデータは以下のような構成要素からなります。
インデックス
RDBMSの「データベース」に相当する要素。
タイプ
RDBMSの「テーブル」に相当する要素。
ドキュメント
RDBMSの「レコード」に相当する要素。 さらにドキュメントは複数の「フィールド」からなっていて、「フィールド」はRDBMSの「カラム」に相当します。 ドキュメントのフィールドは固定の構造である必要はなく、スキーマレスな構成にできます。 ドキュメントはJSONで構造化されたデータとして保存されます。
基本のデータ操作
データの操作はHTTPのREST APIによって行います。アクセスする先のURLは
http://localhost:9200/{インデックス}/{タイプ}/{ドキュメントのid}
が基本の構造。インデックスやタイプはデータが最初に登録されたときに自動的に(動的に定義されるスキーマをともなって)構築されます。
ドキュメントの入力
PUTメソッドで入力します。
$ curl -XPUT http://localhost:9200/blog/article/1 -d '{"title": "記事のタイトル", "content": "本文テキスト"}'
pretty=trueをつけるとレスポンスが読みやすくなります。
$ curl -XPUT http://localhost:9200/blog/article/1?pretty=true -d '{"title": "記事のタイトル", "content": "本文テキスト"}'
POSTメソッドを使うとドキュメントIDを指定しない場合自動でIDが振られます。
$ curl -XPOST http://localhost:9200/blog/article/?pretty=true -d '{"title": "記事のタイトル", "content": "本文テキスト"}'
ドキュメントの検索
GETメソッド、id指定で取得します。
$ curl -XGET http://localhost:9200/blog/article/1?pretty=true
検索クエリは以下のような感じに。
$ curl -XGET http://localhost:9200/blog/article/_search?pretty=true -d '{"query": {"match":{"title":"検索文字ほげほげ"}}}'
※この時点ではアナライザ(次回以降に説明予定)が指定されていないので、デフォルトの検索アルゴリズムが適用されます。
ドキュメントの更新
データを上書き。
$ curl -XPOST http://localhost:9200/blog/article/1?pretty=true -d '{"title": "更新するタイトル", "content": "更新する本文"}'
一部のみ変更することもできます。
$ curl -XPOST http://localhost:9200/blog/article/1/_update?pretty=true -d '{"script": "ctx._source.content = \"更新する本文\""}'
ドキュメントの削除
DELETEメソッド、ドキュメントのid指定して削除。
$ curl -XDELETE http://localhost:9200/blog/article/1?pretty=true
タイプの削除。
$ curl -XDELETE http://localhost:9200/blog/article?pretty=true
インデックスの削除。
$ curl -XDELETE http://localhost:9200/blog?pretty=true
まとめ
インストールと基本操作は以上です。 ここまでで、ElasticsearchはいわゆるKVSのようなデータベースとして振る舞えることがわかります。 この後アナライザの定義を行い、ドキュメントにたいしてNgram全文検索できるようにしていきます。
そんなわけで次回に続く。。。