首页 > 文章列表 > go语言操作es的实现示例

go语言操作es的实现示例

golang
357 2022-12-17

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 %s\n", 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("%#v\n", 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:%s\n", 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("%#v\n", 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"]