新西兰服务器

go语言操作es的方法


go语言操作es的方法

发布时间:2022-04-20 13:50:16 来源:高防服务器网 阅读:69 作者:iii 栏目:开发技术

这篇文章主要介绍“go语言操作es的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言操作es的方法”文章能帮助大家解决问题。

    Elasticsearch

    介绍

    Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。

    Elasticsearch能做什么

    • 当你经营一家网上商店,你可以让你的客户搜索你卖的商品。在这种情况下,你可以使用ElasticSearch来存储你的整个产品目录和库存信息,为客户提供精准搜索,可以为客户推荐相关商品。

    • 当你想收集日志或者交易数据的时候,需要分析和挖掘这些数据,寻找趋势,进行统计,总结,或发现异常。在这种情况下,你可以使用Logstash或者其他工具来进行收集数据,当这引起数据存储到ElasticsSearch中。你可以搜索和汇总这些数据,找到任何你感兴趣的信息。

    • 对于程序员来说,比较有名的案例是GitHub,GitHub的搜索是基于ElasticSearch构建的,在github.com/search页面,你可以搜索项目、用户、issue、pull request,还有代码。共有40~50个索引库,分别用于索引网站需要跟踪的各种数据。虽然只索引项目的主分支(master),但这个数据量依然巨大,包括20亿个索引文档,30TB的索引文件。

    go语言操作es

    go get github.com/olivere/elastic

    解决golang使用elastic连接elasticsearch时自动转换连接地址

    elastic.SetSniff(false)
    client, _ := elastic.NewClient(    // ...    // 将sniff设置为false后,便不会自动转换地址     elastic.SetSniff(false),  )

    初始化

    var client *elastic.Client    var host = "http://xxx:9200"    //初始化es驱动  func init() {       errorlog := log.New(os.Stdout, "app", log.LstdFlags)       var err error     client, err = elastic.NewClient(elastic.SetErrorLog(errorlog), elastic.SetURL(host), elastic.SetSniff(false))     if err != nil {        panic(err)     }     info, code, err := client.Ping(host).Do(context.Background())     if err != nil {        panic(err)     }     fmt.Printf("Es return with code %d and version %s n", code, info.Version.Number)     esversionCode, err := client.ElasticsearchVersion(host)     if err != nil {        panic(err)     }     fmt.Printf("es version %sn", esversionCode)  }

    数据创建

    info —>employee ——-FirstName,LastName,Age,About,Interests

    结构体方式

    type Employee struct {  	FirstName string `json:"firstname"`  	LastName string `json:"lastname"`  	Age int `json:"age"`  	About string `json:"about"`  	Interests []string `json:"interests"`  }    //创建索引  func create() {  	//1.使用结构体方式存入到es里面  	e1 := Employee{"jane", "Smith", 20, "I like music", []string{"music"}}  	put, err := client.Index().Index("info").Type("employee").Id("1").BodyJson(e1).Do(context.Background())  	if err != nil {  		panic(err)  	}  	fmt.Printf("indexed %d to index %s, type %s n", put.Id, put.Index, put.Type)  }    func main() {  	create()  }

    字符串方式:

    func create1() {     //使用字符串     e1 := `{"firstname":"john","lastname":"smith","age":22,"about":"i like book","interests":["book","music"]}`     put, err := client.Index().Index("info").Type("employee").Id("2").BodyJson(e1).Do(context.Background())     if err != nil {        panic(err)     }     fmt.Printf("indexed %d to index %s, type %s n", put.Id, put.Index, put.Type)  }

    查找

    //查找  func get() {     get, err := client.Get().Index("info").Type("employee").Id("1").Do(context.Background())     if err != nil {        panic(err)     }     if get.Found {        fmt.Printf("got document %s in version %d from index %s,type %s n", get.Id, get.Version, get.Index, get.Type)     }  }    func main() {     get()  }

    修改

    func update() {     res, err := client.Update().Index("info").Type("employee").Id("1").Doc(map[string]interface{}{"age": 88}).Do(context.Background())     if err != nil {        fmt.Println(err.Error())     }     fmt.Printf("update age %s n", res.Result)  }    func main() {     update()  }

    删除

    //删除  func delete() {     res, err := client.Delete().Index("info").Type("employee").Id("1").Do(context.Background())     if err != nil {        fmt.Println(err.Error())     }     fmt.Printf("delete result %s", res.Result)  }    func main() {     delete()  }

    查找

    func query() {     var res *elastic.SearchResult     var err error     res, err = client.Search("info").Type("employee").Do(context.Background())     printEmployee(res, err)    }    //打印查询的employee  func printEmployee(res *elastic.SearchResult, err error) {     if err != nil {        fmt.Print(err.Error())        return     }       var typ Employee     for _, item := range res.Each(reflect.TypeOf(typ)) {        t := item.(Employee)        fmt.Printf("%#vn", t)     }  }    //条件查找  func query1() {     var res *elastic.SearchResult     var err error     //查找方式一:     q := elastic.NewQueryStringQuery("lastname:smith")     res, err = client.Search("info").Type("employee").Query(q).Do(context.Background())     printEmployee(res, err)     //查找方法二:     if res.Hits.TotalHits > 0 {        fmt.Printf("found a total fo %d Employee", res.Hits.TotalHits)          for _, hit := range res.Hits.Hits {           var t Employee           err := json.Unmarshal(*hit.Source, &t) //另一种取出的方法           if err != nil {              fmt.Println("failed")           }           fmt.Printf("employee name %s:%sn", t.FirstName, t.LastName)        }     } else {        fmt.Printf("found no employee n")     }  }

    年龄大于21的查找

    //年龄大于21的  func query3() {  	var res *elastic.SearchResult  	var err error  	boolq := elastic.NewBoolQuery()  	boolq.Must(elastic.NewMatchQuery("lastname", "smith"))  	boolq.Filter(elastic.NewRangeQuery("age").Gt(21))  	res, err = client.Search("info").Type("employee").Query(boolq).Do(context.Background())  	printEmployee(res, err)  }    //打印查询的employee  func printEmployee(res *elastic.SearchResult, err error) {     if err != nil {        fmt.Print(err.Error())        return     }       var typ Employee     for _, item := range res.Each(reflect.TypeOf(typ)) {        t := item.(Employee)        fmt.Printf("%#vn", t)     }  }

    包含book的

    //包含book的  func query4() {     var res *elastic.SearchResult     var err error     matchPhrase := elastic.NewMatchPhraseQuery("about", "book")     res, err = client.Search("info").Type("employee").Query(matchPhrase).Do(context.Background())     printEmployee(res, err)  }

    分页

    //分页  func list(size, page int) {     var res *elastic.SearchResult     var err error     if size < 0 || page < 1 {        fmt.Printf("param error")        return     }     res, err = client.Search("info").Type("employee").Size(size).From((page - 1) * size).Do(context.Background())     printEmployee(res, err)  }

    集群搭建

    配置文件修改

    node.name : node-102  node.name : node-103    network.host: 192.168.1.102  network.host: 192.168.1.103    discovery.zen.ping.unicast.hosts: ["s201","s202","s203"]

    关于“go语言操作es的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注高防服务器网行业资讯频道,小编每天都会为大家更新不同的知识点。

    [微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

    [图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
    [