basyura's blog

あしたになったらほんきだす。

golang - elasticsearch

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.Unmarshalstruct を指定すれば map を使わなくていいんだけど @timestamp でフィールド名を定義してるので struct が定義できない難点。そもそも @timestamp でフィールドを定義するのが一般的なのかよく分かってない。

まだまだ ruby で書いてるほうが楽だけど、vim-go のサポートが嬉しい。