公式Go言語用 elasticsearchクライアント
go-elasticsearch
2019年頭頃からElasticsearchを開発しているElastic社公式のGo言語用Elasticsearchクライアントの開発が始まっています。この記事の作成時点 (2019/03/31) ではまだv0.0.0
で開発中でした。
どこまで実装される予定なのかは不明ですが、検索クエリを作成する実装などは見当たりませんでしたが、エンドポイントでみると一通りのエンドポイントへのリクエスト用コードは実装されているようなので軽く使ってみました。
試してみる
まずREADME.mdに書いてあるとおり試してみる
package main
import (
"log"
"github.com/elastic/go-elasticsearch"
)
func main() {
es, _ := elasticsearch.NewDefaultClient()
log.Println(es.Info())
}
[200 OK] {
"name" : "pf0bv5Y",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "kwg4riSOQUWDGUSYvXAcTw",
"version" : {
"number" : "6.3.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "424e937",
"build_date" : "2018-06-11T23:38:03.357887Z",
"build_snapshot" : false,
"lucene_version" : "7.3.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
何も設定をする必要がない場合は
es, _ := elasticsearch.NewDefaultClient()
log.Println(es.Info())
これだけでEndpointへのリクエストができました。
パラメータをつけさえしなければGet系のAPIを行うコードは同じように実装できました。
_cat/indices
APIのリクエスト
es, _ := elasticsearch.NewDefaultClient()
log.Println(es.Cat.Indices())
green open test_index_20190330 PzulHkoxS-CF2xDojnOrPQ 5 1 513 0 770.9kb 770.9kb
green open test_index_20190331 BJi44UEjTxyNXCDL3lAhJw 5 1 487 0 727.8kb 727.8kb
<nil>
パラメータを付ける場合
_cat/indices
のリクエスト部分の実装を確認します。
go-elasticsearch api.cat.indices.go
type CatIndices func(o ...func(*CatIndicesRequest)) (*Response, error)
func (f CatIndices) WithContext(v context.Context) func(*CatIndicesRequest) {・・・}
func (f CatIndices) WithIndex(v ...string) func(*CatIndicesRequest) {・・・}
func (f CatIndices) WithV(v bool) func(*CatIndicesRequest) {・・・}
type CatIndicesRequest struct {
Index []string
Bytes string
Format string
H []string
Health string
Help *bool
Local *bool
MasterTimeout time.Duration
Pri *bool
S []string
V *bool
Pretty bool
Human bool
ErrorTrace bool
FilterPath []string
ctx context.Context
}
エンドポイント毎にリクエスト構造体と パラメータ設定用の関数が用意されています。
クエリの指定の仕方は以下の2パターンあるようでした。
catIndices := es.Cat.Indices
log.Println(catIndices(catIndices.WithV(true)))
req := esapi.CatIndicesRequest{
V: esapi.BoolPtr(true),
}
ctx := context.Background()
log.Println(req.Do(ctx, es))
READMEでは後者で書かれていました。
参考:
感想
エンドポイント毎にリクエスト構造体すでに用意されていて、検索やデータ作成など複雑なクエリが必要な箇所以外は使えるのでは。(ただし開発中)
検索、Bulkなど複雑なクエリ作成が簡単に実装できると嬉しい…
個人的に待ちに待った公式クライアントなので正式リリースバージョンが待ち遠しい。
まだ開発途中ですが、公式クライアント使いたいがためだけにElasticsearch CLI作ってみました。(2エンドポイント位しか動きませんが...)
https://github.com/bsoo/geso