go で elasticsearch に接続。
package main import ( "context" "encoding/json" "fmt" "github.com/olivere/elastic" ) func main() { client, err := elastic.NewClient( elastic.SetURL("http://127.0.0.1:9200"), elastic.SetSniff(false)) if err != nil { panic(err) } defer client.Stop() ctx := context.Background() termQuery := elastic.NewMatchQuery("hoge", "fuga") searchResult, err := client.Search(). Index("log-*"). Query(termQuery). From(0).Size(10). Do(ctx) if err != nil { panic(err) } fmt.Println("total:", searchResult.Hits.TotalHits) for _, hit := range searchResult.Hits.Hits { var dict map[string]interface{} err = json.Unmarshal(*hit.Source, &dict) if err != nil { fmt.Println(err) continue } fmt.Println(dict) } }
json.Unmarshal
で struct
を指定すれば map
を使わなくていいんだけど @timestamp
でフィールド名を定義してるので struct
が定義できない難点。そもそも @timestamp
でフィールドを定義するのが一般的なのかよく分かってない。
まだまだ ruby で書いてるほうが楽だけど、vim-go のサポートが嬉しい。