オープンソースこねこね

Webプログラミングなどについてあれこれ。

ElasticsearchでCentOS上にNgram全文検索サーバを構築する - (その1)インストールと基本のデータ操作

ここしばらくオープンソース全文検索エンジンElasticsearchを調べてました。

今回はNgramによる検索ができるように設定したので、その時のことをインストール方法から書きます。 どうにも同じ全文検索エンジンであるApache Solrに比べて新しいせいか、ネットの情報が少ないと感じたのと、検索エンジンをまじめに導入したのが初めてだったので、結構大変でした。 なお、この記事は自分用の備忘録をかねているので、いろいろ長くなりそうです。 よって何回かにわけて書く予定です。

Elasticsearchの概要

  • 全文検索エンジン全文検索機能をもつデータベース)
  • データ構造はJSON。スキーマレス。(MongoDBに似ている)
  • Javaで実装されている。内部にLuceneを使用している。(solrに似ている)
  • foursquare、Githubなどでの利用実績。
  • HTTPのREST APIがデータ操作のインターフェース。
  • AWSとは何にも関係ない。

買って参考にした書籍

ElasticSearch Server(Kindle版)

ちょっと情報古いですけど情報は網羅されているし、アーキテクチャの解説もあるのでかなり参考になりました。 あとは、公式サイトのドキュメントを見ながら作業しました。

やったこと

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全文検索できるようにしていきます。

そんなわけで次回に続く。。。