Skip to content

Instantly share code, notes, and snippets.

@olivere
Created March 1, 2018 07:27
Show Gist options
  • Select an option

  • Save olivere/e4a376b4783c0914e44ea4f745ce2ebf to your computer and use it in GitHub Desktop.

Select an option

Save olivere/e4a376b4783c0914e44ea4f745ce2ebf to your computer and use it in GitHub Desktop.

Revisions

  1. olivere created this gist Mar 1, 2018.
    105 changes: 105 additions & 0 deletions elastic_v6_getting_started.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,105 @@
    package main

    import (
    "context"
    "encoding/json"
    "fmt"
    "reflect"

    "github.com/olivere/elastic"
    )

    type Tweet struct {
    User string `json:"user"`
    Message string `json:"message"`
    }

    func main() {
    // Create a client
    client, err := elastic.NewClient()
    if err != nil {
    // Handle error
    }

    // Create an index
    _, err = client.CreateIndex("tweets").Do(context.Background())
    if err != nil {
    // Handle error
    panic(err)
    }

    // Add a document to the index
    tweet := Tweet{User: "olivere", Message: "Take Five"}
    _, err = client.Index().
    Index("tweets").
    Type("doc").
    Id("1").
    BodyJson(tweet).
    Refresh("wait_for").
    Do(context.Background())
    if err != nil {
    // Handle error
    panic(err)
    }

    // Search with a term query
    termQuery := elastic.NewTermQuery("user", "olivere")
    searchResult, err := client.Search().
    Index("tweets"). // search in index "tweets"
    Query(termQuery). // specify the query
    Sort("user.keyword", true). // sort by "user" field, ascending
    From(0).Size(10). // take documents 0-9
    Pretty(true). // pretty print request and response JSON
    Do(context.Background()) // execute
    if err != nil {
    // Handle error
    panic(err)
    }

    // searchResult is of type SearchResult and returns hits, suggestions,
    // and all kinds of other information from Elasticsearch.
    fmt.Printf("Query took %d milliseconds\n", searchResult.TookInMillis)

    // Each is a convenience function that iterates over hits in a search result.
    // It makes sure you don't need to check for nil values in the response.
    // However, it ignores errors in serialization. If you want full control
    // over iterating the hits, see below.
    var ttyp Tweet
    for _, item := range searchResult.Each(reflect.TypeOf(ttyp)) {
    if t, ok := item.(Tweet); ok {
    fmt.Printf("Tweet by %s: %s\n", t.User, t.Message)
    }
    }
    // TotalHits is another convenience function that works even when something goes wrong.
    fmt.Printf("Found a total of %d tweets\n", searchResult.TotalHits())

    // Here's how you iterate through results with full control over each step.
    if searchResult.Hits.TotalHits > 0 {
    fmt.Printf("Found a total of %d tweets\n", searchResult.Hits.TotalHits)

    // Iterate through results
    for _, hit := range searchResult.Hits.Hits {
    // hit.Index contains the name of the index

    // Deserialize hit.Source into a Tweet (could also be just a map[string]interface{}).
    var t Tweet
    err := json.Unmarshal(*hit.Source, &t)
    if err != nil {
    // Deserialization failed
    }

    // Work with tweet
    fmt.Printf("Tweet by %s: %s\n", t.User, t.Message)
    }
    } else {
    // No hits
    fmt.Print("Found no tweets\n")
    }

    // Delete the index again
    _, err = client.DeleteIndex("tweets").Do(context.Background())
    if err != nil {
    // Handle error
    panic(err)
    }
    }