3

Golang操作elasticsearch

  • 使用第三方包:olivere github。总结一下olivere操作ES的常用功能,方便查阅。
  • 说明:以下例子用到的es index:"test", es type:"test", es address: "http://10.1.1.1:9200"
  1. 新建es client

    func ESClient() (client *elastic.Client,err error){
     file := "./log.log"
     logFile, _ := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766) // 应该判断error,此处简略
     cfg := []elastic.ClientOptionFunc{
     elastic.SetURL("http://10.1.1.1:9200"),
     elastic.SetSniff(false),
     elastic.SetInfoLog(log.New(logFile, "ES-INFO: ", 0)),
     elastic.SetTraceLog(log.New(logFile, "ES-TRACE: ", 0)),
     elastic.SetErrorLog(log.New(logFile, "ES-ERROR: ", 0)),
     }
     client,err =elastic.NewClient(cfg ...)
     return
    }
  2. 查看某文档是否存在,给定文档ID查询

    func isExists(id string)bool{
     client,_ := ESClient()
     defer client.Stop()
     exist,_ := client.Exists().Index("test").Type("test").Id(id).Do(context.Background())
     if !exist{
     log.Println("ID may be incorrect! ",id)
     return false
     }
     return true
    }
  3. 获取某文档的内容

    func(doc *myDocument) Get(id string){
     client ,_:= ESClient()
     defer client.Stop() 
     if !isExists(id){
     return
     }
     esResponse,err := client.Get().Index("test").Type("test").Id(id).Do(context.Background())
     if err != nil {
     // Handle Error
     return
     }
     json.Unmarshal(*esResponse.Source,&doc)
    }
  4. 新增文档

    func(doc *myDocument) Add(id string){
     client ,_:= ESClient()
     defer client.Stop() 
     if !isExists(id){
     return
     }
     client.Index().Index("test").Type("test").Id(id).BodyJson(doc).Do(context.Background())
    }
  5. 批量新增

    func BulkAdd(docs []myDocument){
     bulkRequest := seriesClient.Bulk()
     client ,_:= ESClient()
     defer client.Stop()
     for _,doc := range docs{
     esRequest := elastic.NewBulkIndexRequest().Index("test").Type("test").Id(id).Doc(doc)
     bulkRequest = bulkRequest.Add(esRequest)
     }
     bulkRequest.Do(context.Background())
    }
  6. 更新文档

    func Update(updateField *map[string]interface{},id string){
     client ,_:= ESClient()
     defer client.Stop()
     if !isExists(id){
     return
     }
     _,err:=client.Update().Index("test").Type("test").Id(id).Doc(updateField).Do(context.Background())
     if err != nil{
     //Handle Error
     }
    }
  7. 删除文档

    func Delete(id string){
     client ,_:= ESClient()
     defer client.Stop()
     if !isExists(id){
     return
     }
     _,err:=client.Delete().Index("test").Type("test").Id(id).Do(context.Background())
     if err != nil{
     //Handle Error
     }
    }
  8. 搜索文档(搜索是ES非常引以为傲的功能,以下示例是相对复杂的查询条件,需将查询结果排序,按页返回)

    func Search(criteria *SearchCriteria)(docs []myDocument){
     client ,_:= ESClient()
     defer client.Stop()
     query := elastic.NewBoolQuery()
     query = query.Must(elastic.NewTermQuery("category",criteria.Category))
     query=query.Must(elastic.NewMatchQuery("title",criteria.Title))
     query=query.Must(elastic.NewRangeQuery("update_timestamp").Gte(criteria.UpdateTime))
     esResponse,_ :=client.Search().Index("test").Type("test").
     Query(query).Sort(criteria.Sort,criteria.Order=="ASC"||criteria.Order=="asc").
     From(criteria.Offset).Size(criteria.Limit).Do(context.Background())
     for _,value:= range esResponse.Hits.Hits{
     var doc *myDocument
     json.Unmarshal(*value.Source,&doc)
     docs = append(docs,doc)
     }
     return
    }
    type SearchCriteria struct{
     Category string `json:"category"`
     Limit int `json:"limit"`
     Offset int `json:"offset"`
     Title string `json:"title"`
     UpdateTime int64 `json:"update_timestamp"`
     Order string `json:"order"`
     Sort string `json:"sort"`
    }

Mandelbrot_Kobe
93 声望25 粉丝

golang


引用和评论

0 条评论
评论支持部分 Markdown 语法:**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用 @ 来通知其他用户。

AltStyle によって変換されたページ (->オリジナル) /