Elastic 组件

Elastic 组件我们依赖的开源包是 github.com/olivere/elastic/v7

按照组件的设计,我们定义了自己的 Elastic 结构对其进行了组合,在保留其原生的功能之外,以便扩展。

// yago/coms/elastic/elastic.go
type Elastic struct {
    *elastic.Client
}

所以你可以查看 elastic 官方文档 来获取所有支持的 api。

本文中仅介绍部分常用的 api 以及扩展的 api。

1. 配置 Elastic 组件

[elastic]
urls = ["http://127.0.0.1:9200/", "http://127.0.0.1:9300"]
# username = ""
# password = ""
# sniff_enable = false
# 日志最低等级 Error = 2, Info = 4, Trace = 6
level = 6

2. 使用 Elastic 组件

  • 创建索引
    exist, err := es.Ins().IndexExists("es_test").Do(context.Background())
    if err != nil {
        panic(err)
    }

    if exist {
        fmt.Println("索引已存在")
        return
    }

    mapping := `
{
    "settings":{
        "number_of_shards":1,
        "number_of_replicas":0
    },
    "mappings":{
        "properties":{
            "user":{
                "type":"keyword"
            },
            "message":{
                "type":"keyword"
            }
        }
    }
}`

    ret, err := es.Ins().CreateIndex("es_test").BodyString(mapping).Do(context.Background())

    if err != nil {
        panic(err)
    }

    fmt.Println(ret.Acknowledged)
  • 删除索引
    exist, err := es.Ins().IndexExists("es_test").Do(context.Background())
    if err != nil {
        panic(err)
    }

    if !exist {
        fmt.Println("索引不存在")
        return
    }

    ret, err := es.Ins().DeleteIndex("es_test").Do(context.Background())

    if err != nil {
        panic(err)
    }

    fmt.Println(ret.Acknowledged)
  • 插入数据
    msg := Tweet{User: "bob", Message: "hello"}
    // 不存在就创建,存在就更新
    ret, err := es.Ins().Index().Index("es_test").Id("1").BodyJson(msg).Do(context.Background())
    if err != nil {
        panic(err)
    }

    fmt.Println(ret.Id)
    fmt.Println(ret.Result)
  • 查询数据
    // 利用elastic/v7 的包构建 term 查询
    termQuery := elastic.NewTermQuery("user", "bob")

    ret, err := es.Ins().Search().
        Index("es_test"). // use index
        Query(termQuery). // termQuery
        From(0).Size(10). // pagesize
        Do(context.Background()) // execute
    if err != nil {
        fmt.Printf("term query err :%s", err)
        return
    }

    // 耗时
    fmt.Printf("term query took %d milliseconds\n", ret.TookInMillis)

    // 总数
    fmt.Printf("found total of %d \n", ret.TotalHits())

    // list
    if ret.TotalHits() > 0 {
        for _, hit := range ret.Hits.Hits {
            s, err := hit.Source.MarshalJSON()
            fmt.Println(hit.Type, hit.Id, string(s), err)

            var d Tweet
            err = json.Unmarshal(hit.Source, &d)

            fmt.Printf("err %+v, %+v\n", err, d)
        }
    }
  • 根据 id 更新
    ret, err := es.Ins().Update().Index("es_test").Id("1").Doc(map[string]interface{}{"message": "haha"}).Do(context.Background())
    if err != nil {
        panic(err)
    }

    fmt.Println(ret.Id)
    fmt.Println(ret.Type)
    fmt.Println(ret.Result)
  • 根据 id 删除数据
    ret, err := es.Ins().Delete().Index("es_test").Id("1").Do(context.Background())
    if err != nil {
        panic(err)
    }

    fmt.Println(ret.Result)
  • 根据查询语句删除数据
    termQuery := elastic.NewTermQuery("user", "bob")
    ret, err := es.Ins().DeleteByQuery().Index("es_test").Query(termQuery).Do(context.Background())
    if err != nil {
        panic(err)
    }

    fmt.Println(ret.Total)

results matching ""

    No results matching ""