golang elasticsearch7的使用

.container .card .information strong · · 498 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang操作elasticsearch7

  • 包:github.com/olivere/elastic/v7
  • elasticsearch版本7.6
    首先可以定义一个全量,构建连接池

    var esCli *elastic.Client
    func init() {
          var err error
          esCli, err = elastic.NewClient(elastic.SetSniff(false), elastic.SetURL("http://127.0.0.1:9200")
          if err != nil {
              panic(err)
          }
       }

使用方法
1、添加

 func EsAdd(es_index string, es_body interface{}) string {
    var id string
    rsAdd, err := esCli.Index().
        Index(es_index).
        BodyJson(es_body).
        Do(context.Background())
    if err != nil {
        panic(err)
    } else {
        id = rsAdd.Id
    }
    return id
 }
PS:id是指ES自动生成的id,如果想自定义id可以在Index()后面加.Id(string)。目前用的是es7.6,所以可以不用加Type默认_doc,
也可以指定方法Type()。

2、批量添加

func EsAddBulk(es_index string, es_body []interface{}) {
    bulkRequest := esCli.Bulk()
    for _, v := range es_body {
        tmp := v
        req := elastic.NewBulkIndexRequest().Index(es_index).Doc(tmp)
        bulkRequest = bulkRequest.Add(req)
    }
    _, err := bulkRequest.Do(context.Background())
    if err != nil {
        panic(err)
    }
}

3、添加

func EsUpdate(es_index string, es_id string, es_body interface{}) {
    _, err := esCli.Update().
        Index(es_index).
        Id(es_id).
        Doc(es_body).
        Do(context.Background())
    if err != nil {
        panic(err)
    }
}

4、批量修改

func EsUpdateBulk(es_index string, es_body []map[string]string) {
    bulkRequest := esCli.Bulk()
    for _, v := range es_body {
        tmp := v
        tmps := make(map[string]string)
        for is, vs := range tmp {
            if is != "id" {
                tmps[is] = vs
            }
        }
        req := elastic.NewBulkUpdateRequest().Index(es_index).Id(tmp["id"]).Doc(tmps).DocAsUpsert(true)
        bulkRequest = bulkRequest.Add(req)
    }
    _, err := bulkRequest.Do(context.Background())
    if err != nil {
       panic(err)
    }
}
PS:批量修改和批量增加方法是不同的,批量修改的方法NewBulkUpdateRequest,要调用这个才有DocAsUpsert。
之前在NewBulkIndexRequest下一直没有找到DocAsUpsert。
另外用[]map[string]string是因为每个数据要修改的key可能不同,如果要修改的key相同可以用interface 或 struct。

5、删除文档

func Delete(es_index string, id string) {
    _, err := esCli.Delete().Index(es_index).Id(id).Do(context.Background())
    if err != nil {
        panic(err)
    }
}

6、查询当前index是否存在

func ExistsIndex(es_index string) bool {
    exists, err := esCli.IndexExists(es_index).Do(context.Background())
    if err != nil {
        panic(err)
    }
    return exists
}

7、查询

func Search(es_index string,page int ,li int) interface{} {
    p := (page - 1) * li
    collapsedata := elastic.NewCollapseBuilder("company")
    esq := elastic.NewBoolQuery()
    esq.Must(elastic.NewMatchPhraseQuery("company", "CO LTD."))
    esq.Must(elastic.NewMatchQuery("country", "US"))
    search := esCli.Search().
        Index(es_index).
        From(p).Size(li).
        Query(esq).
        Collapse(collapsedata).
        Pretty(true)
    searchResult, err := search.Do(context.Background())
    if err != nil {
        panic(err)
    } else {
        return searchResult
    }
}
PS:NewMatchPhraseQuery是代表短语的匹配,Collapse是指定字段相同结果的折叠

查找延伸:
像上面的结果返回的是es所有的参数,有时候只想用_Souce那要在把里面的结果抽取出来。官方也配有方法:

func PrintTradedata(res *elastic.SearchResult, err error) tradedata {
    if err != nil {
        panic(err)
    }
    var typ tradedata
    var re tradedata
    for _, item := range res.Each(reflect.TypeOf(typ)) { 
        te := item.(tradedata)
        jsonValue, _ := json.Marshal(te)
        json.Unmarshal(jsonValue, &re)
    }
    return re
}

但是这种的话,也有一定的限制性就是如果我还想要_id的话可能又要自己在循环一边结构获取。所以我去看来官方的方法,然后自己重新写一遍:

func PrintTradedata(res *elastic.SearchResult, err error) tradedata {
    if err != nil {
        panic(err)
    }
    var re tradedata
    for _, item := range res.Hits.Hits {
        if item.Source != nil {
            jsonValue, _ := json.Marshal(item.Source)
            json.Unmarshal(jsonValue, &re)
            re.ID = item.Id
        }
    }
    return re
}
这样就能提取出es的_id和_source的结合,可能觉得就这样几行为什么官方要封装多一个方法,
其实官方封装的方法还做结构的验证安全性要比我的高,如果只要_source推荐还是用官方的。

以上就是一些golang使用es7的基本方法,低的版本也适用不过要加上type。es最强大的还是它的搜索功能我只是写了基础的,使用bool查询,还有term、math、fuzzy、wildcard等等,还有翻页scroll和search after,大家都可以去elastic包中查看。如果有需要,等有空我也可以写一篇专门关于搜索的用法。
上述内容欢迎大家指正和交流。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:.container .card .information strong

查看原文:golang elasticsearch7的使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

498 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传