Golang 对es的操作实例


Posted in Golang onApril 20, 2022

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时自动转换连接地址

Golang 对es的操作实例

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

Golang 对es的操作实例

初始化

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"]

Golang 对es的操作实例

Golang 对es的操作实例

 到此这篇关于go语言操作es的实现示例的文章就介绍到这了!

Golang 相关文章推荐
Go语言中的UTF-8实现
Apr 26 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang json数组拼接的实例
Apr 28 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go timer如何调度
Jun 09 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go 语言结构实例分析
Jul 04 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Go gorilla/sessions库安装使用
Aug 14 Golang
Golang 遍历二叉树
Apr 19 #Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 #Golang
Golang 字符串的常见操作
Golang 链表的学习和使用
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 #Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 #Golang
GO语言字符串处理函数之处理Strings包
Apr 14 #Golang
You might like
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php查看当前Session的ID实例
2015/03/16 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
python读取html中指定元素生成excle文件示例
2014/04/03 Python
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
Python程序运行原理图文解析
2018/02/10 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
Python元组知识点总结
2019/02/18 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
Python执行时间的几种计算方法
2020/07/31 Python
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
学校师德师风整改方案
2014/10/28 职场文书
商务英语求职信范文
2015/03/19 职场文书
庆七一活动简报
2015/07/20 职场文书
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL