読者です 読者をやめる 読者になる 読者になる

一角獣は夜に啼く

ただの日記です。

思ってることとか考えたこととか適当に書きます。 まじめな話は 「ひだまりソケットは壊れない」 に書いています。

ElasticSearch と戯れたりしてた

プログラミング Java

ElasticSearch とか勉強するぞー、と思ってから早 2 ヶ月。 手を付けなかったらいつまでも手つかずのままなのでこの週末はちょっと ElasticSearch さんと戯れたりしてた。

ElasticSearch のこと

ElasticSearch は Apache Lucene ベースの検索エンジンで、HTTP REST API を提供している。 なので、HTTP で ElasticSearch とやり取りすることで、ドキュメントを保存したり取得したり検索したりできる。

elasticsearch
flexible and powerful open source, distributed real-time
search and analytics engine for the cloud

cool. bonsai cool

『cool. bonsai cool』 ってなんなん?

基本的な操作

ElasticSearch には、JSON オブジェクトをドキュメントとして保存することができる。 ドキュメントにはそれぞれ ID が振られるので、ID 指定で単一ドキュメントを取り出したりもできる。 ここらへんのドキュメント操作については下記ページにまとまってる。

各ドキュメントはそれぞれ 1 つのインデックス (Index) に保存される。 さらに、インデックス中の各ドキュメントはマッピングタイプ (Mapping Type; 省略して単にタイプとも) により論理的にグループ分けされる。 マッピングタイプは RDB のテーブル相当と思えばらしい。 インデックスやタイプは明示的に作成しなくてもドキュメント作成時に勝手に作成したりしてれる。 パフォーマンスを考えるとちゃんと設定した方がいいのだろうけど、とりあえず試すだけならインデックス作成とかは明示的にしなくてもよい。 ここら辺の話は次のページにまとまってた。

Java API とか Embedded ElasticSearch とか

Java API があるので、Java から触るならこれを使えば良い。 Maven セントラルリポジトリにあるので簡単に使い始めることができる。

そして、Java API では単にサーバーとして動かされている ElasticSearch とのやり取りのためのクライアント処理を行うだけではなく、アプリケーション組み込みの ElasticSearch の起動を行ったりすることもできる。 ユニットテストやインテグレーションテストなどに用いることもできる。

とりあえず Java から使ってみる、という場合は組み込みの ElasticSearch を使うといいかも。 ちょっと起動に時間がかかるけど (数秒から十数秒ぐらい。)

バージョンのこと

そういえば 1.0.0.Beta1 が出てるので、今から触るなら 1.0.0.Beta1 がいいような気がするよ。

Wiki システム (になる予定のもの) を作ってみたりした

せっかくなので ElasticSearch を使って検索ができる Wiki システムっぽいものを作ってみたりした。

まあまだプロトタイプ段階って感じなのでサーバーエラーでまくりだけど。 今の段階ではページ本文のデータを ElasticSearch 内にのみおいてあるけど、wiki システムとして作りこむなら、ソーステキストと HTML に整形済みのテキストを RDB に置いて、装飾のない単なるテキストデータを ElasticSearch 内に置く、って感じのことをするのが良さそう。

試してみる方法

Git と JDK 1.7 がインストールされてる環境なら、次のコマンドで動かせるはず。

git clone git@github.com:nobuoka/vc-wiki.git
cd vc-wiki
# サーバー起動
./gradlew jettyRun &

RDB (Derby) も ElasticSearch も組み込みのものなので、初回アクセス時はめっちゃ時間かかると思う。

サーバー起動後、http://localhost:8080/WikiWeb/-/page-editor にアクセスしたらパスやらタイトルやら本文を入力する画面になるので、適当にパスを 「aaa」 とか入力してタイトルと本文も入力して送信。 そのあと http://localhost:8080/WikiWeb/aaa にアクセスしたらさっき入力したページのタイトルと本文が表示されるはず。 で、肝心の検索は http://localhost:8080/WikiWeb/-/search?text={検索語} という感じの URL でできる。 いくつかページを作って、作ったページの本文に含まれてる単語などで検索したら多分検索結果に表示されるはず。 でも検索語によっては表示されなかったりもしてそこら辺はまだ良くわかってない。

サーバーの停止は次のコマンドでできる。

# 停止
./gradlew jettyStop

ElasticSearch 使ってる箇所

組み込みの ElasticSearch の起動と終了は次の箇所でやってる。

ドキュメントの保存と取得は次の箇所。

ドキュメントの検索は次の箇所。

あと、インデックス時のアナライザとして kuromoji (プラグイン) を使用するように設定ファイルに記述。 組み込みの ElasticSearch でプラグインを使用する場合は、プラグインをクラスパスに入れておけばいい (つまり依存ライブラリとして記述すればよい) ようである。

Gradle を使ってるので、依存関係の記述は build.gradle に。

とりあえず Java API から使ってみる、というのはこんな感じでできる。

まだよくわかってない

上でも書いたように、期待通りに検索結果が出る場合もあるのだけれど、期待通り動かない (ヒットするはずの検索語で検索しても検索結果が 0 件になる) こともあってよくわかってない。 うーん。

kuromoji プラグインの使い方が間違ってた。 解析周りをちゃんと理解してないのにアナライザとかトークナイザに手を出すべきではなかった。 というわけで解析周りのことを調べたことを次の記事にまとめた。