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