Golang操作elasticsearch(一)

栏目: Go · 发布时间: 5年前

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

运营前线 2

运营前线 2

兰军 等著 / 机械工业出版社 / 2017-4 / 69.00

“运营前线”是一个系列,目前已经出版2部,与“产品前线”一样,该系列书也由资深的产品和运营专家兰军(Blues)领衔策划和写作,旨在梳理和总结国内一线互联网公司的运营方法和技巧,让所有产品人和运营人都有机会了解和学习这些大的互联网公司是如何做运营的。 这2部作品汇集了来自腾讯、阿里、百度、360、迅雷、YY、小米、爱奇艺、乐视等数十家大型互联网公司的一线运营专家的技巧和方法论。共包含9大运营......一起来看看 《运营前线 2》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具