Golang操作elasticsearch(一)

7次阅读

共计 2912 个字符,预计需要花费 8 分钟才能阅读完成。

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”`
}

正文完
 0