Golang操作elasticsearch
- 使用第三方包:olivere github。总结一下olivere操作ES的常用功能,方便查阅。
- 说明:以下例子用到的es index:"test", es type:"test", es address: "http://10.1.1.1:9200"
-
新建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 }
-
查看某文档是否存在,给定文档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 }
-
获取某文档的内容
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) }
-
新增文档
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()) }
-
批量新增
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()) }
-
更新文档
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 } }
-
删除文档
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 } }
-
搜索文档(搜索是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"` }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。