elastic公式 Go言語用Elasticsearchクライアント「go-elasticsearch (v0.0.0) 」

# 公式Go言語用 elasticsearchクライアント
[go-elasticsearch](https://github.com/elastic/go-elasticsearch)
2019年頭頃からElasticsearchを開発しているElastic社公式のGo言語用Elasticsearchクライアントの開発が始まっています。この記事の作成時点 (2019/03/31) ではまだ`v0.0.0` で開発中でした。
どこまで実装される予定なのかは不明ですが、検索クエリを作成する実装などは見当たりませんでしたが、エンドポイントでみると一通りのエンドポイントへのリクエスト用コードは実装されているようなので軽く使ってみました。

# 試してみる

まず[README.md](https://github.com/elastic/go-elasticsearch/blob/master/README.md)に書いてあるとおり試してみる

```golang:
package main

import (
	"log"

	"github.com/elastic/go-elasticsearch"
)

func main() {
	es, _ := elasticsearch.NewDefaultClient()
	log.Println(es.Info())
}

```
```:output
[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"
}
```

何も設定をする必要がない場合は

```golang:
	es, _ := elasticsearch.NewDefaultClient()
	log.Println(es.Info())
```

これだけでEndpointへのリクエストができました。
パラメータをつけさえしなければGet系のAPIを行うコードは同じように実装できました。
`_cat/indices` APIのリクエスト

```golang:/_cat/indices
	es, _ := elasticsearch.NewDefaultClient()
	log.Println(es.Cat.Indices())
```
```:output
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](https://github.com/elastic/go-elasticsearch/blob/master/esapi/api.cat.indices.go)



```golang:es.Cat.Indices()の定義
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) {・・・}

```

```golang: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パターンあるようでした。

```golang:_cat/indices?v=true
	catIndices := es.Cat.Indices
	log.Println(catIndices(catIndices.WithV(true)))
```


```golang:_cat/indices?v=true
	req := esapi.CatIndicesRequest{
		V: esapi.BoolPtr(true),
	}
	ctx := context.Background()
	log.Println(req.Do(ctx, es))
```

READMEでは後者で書かれていました。

参考: 
- [Cat API](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat.html)
- [go-elasticsearch api.cat.indices.go](https://github.com/elastic/go-elasticsearch/blob/master/esapi/api.cat.indices.go)


# 感想
エンドポイント毎にリクエスト構造体すでに用意されていて、検索やデータ作成など複雑なクエリが必要な箇所以外は使えるのでは。（ただし開発中）
検索、Bulkなど複雑なクエリ作成が簡単に実装できると嬉しい…

個人的に待ちに待った公式クライアントなので正式リリースバージョンが待ち遠しい。


まだ開発途中ですが、公式クライアント使いたいがためだけにElasticsearch CLI作ってみました。(2エンドポイント位しか動きませんが...)
https://github.com/bsoo/geso