GroovyでElasticSearchしてみた
はじめに
これはG*アドベントカレンダーの第24日目の記事です。
今回は、GroovyでElasticSearchサーバにアクセスするための、クライアントプログラムを書くお話です。
ElasticSearchとは
ElasticSearchは、オープンソースの検索エンジンです。詳細はこちらを参照してください。
ElasticSearchサーバへのアクセス
ElasticSearch自体、RESTfulな構造になっていますので、curlなどのツールを使ってアクセスすることができます。
また、Javaを始めとするプログラミング言語からアクセスするためのAPIも提供されています。APIが提供されている言語は次のとおりです。
今回はGroovy用のAPIを使って、ElasticSearchにドキュメントを登録するところまでをやってみます。時間の都合上、今回はこれが限界です...orz
Groovy用APIの詳細は、こちらのガイドを参照してください。
今回、Groovyはバージョン2.2.1を使用します。
実行に必要なライブラリの指定
実行に必要なライブラリは、@Grabアノテーションで指定します。
@Grab(group = 'org.elasticsearch', module = 'elasticsearch-lang-groovy', version = '1.5.0')
moduleの指定がガイドと違いますが、こちらの方が新しかったもので...
クライアント用ノードの設定
次にクライアント用ノードの設定を行います。Groovy用のノードビルダークラスが有りますので、このクラスのインスタンスを取得し、各種設定を行います。
GNodeBuilder nodeBuilder = nodeBuilder(); nodeBuilder.settings.put("node.client", true) nodeBuilder.settings.put("cluster.name", "jggug")
なお、ガイドでは、クロージャで設定ができるようなことが書いてありましたが、今回試したバージョンでは上手く行かなかったので、クロージャを使用しないで設定を行っています。
クライアントのインスタンスの生成
次にクライアントのインスタンスを生成します。
GNode node = nodeBuilder.node() GClient client = node.client
ドキュメントの登録
ドキュメントの登録は、indexメソッドに、インデックス名、タイプ名、ID、登録したいソースを指定します。
def indexR = client.index { index "test" type "type1" id "1" source { test = "value" complex { value1 = "value1" value2 = "value2" } } }
ガイドのサンプルはこのとおりなのですが、これだと"complex"という空のオブジェクトが登録されるだけです...orz いろいろ調べてはみたのですが、上手く行かず...orz
終了処理
最後にクライアントの終了処理です。
node.stop().close()
全コード
これまでのコードを合わせると次のとおりです。
@Grab(group = 'org.elasticsearch', module = 'elasticsearch-lang-groovy', version = '1.5.0') import org.elasticsearch.groovy.client.GClient import org.elasticsearch.groovy.node.GNode import org.elasticsearch.groovy.node.GNodeBuilder import static org.elasticsearch.groovy.node.GNodeBuilder.* GNodeBuilder nodeBuilder = nodeBuilder(); nodeBuilder.settings.put("node.client", true) nodeBuilder.settings.put("cluster.name", "jggug")GNode node = nodeBuilder.node() GClient client = node.client def indexR = client.index { index "index_test" type "type1" id "1" source { test = "value" complex { value1 = "value1" value2 = "value2" } } } println "Indexed $indexR.response.id into $indexR.response.index/$indexR.response.type" node.stop().close()
で?
使用したバージョンが悪いのか、ガイドのサンプルが悪いのか不明ですが、結局うまく登録できませんでした...orz
時間があれば、再チャレンジといきたいところです。
GrailsでElasticSearch
GroovyではなくGrailsでElasticSearchしたい場合ですが、現状次の2つのプラグインがあるようです。
どちらかのプラグイン(おそらく後者)を次のG*マガジンの「Plugin探訪」で紹介をしたいと思います。
次は
中途半端な記事になってしまいましたが、明日25日も私が担当します。 ネタは今から探します...orz