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语言操作数据库及其常规操作的示例代码
Apr 21 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
golang switch语句的灵活写法介绍
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Golang jwt身份认证
Apr 20 Golang
Go语言入门exec的基本使用
May 20 Golang
Go语言编译原理之源码调试
Aug 05 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
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
php session应用实例 登录验证
2009/03/16 PHP
用穿越火线快速入门php面向对象
2012/02/22 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
js实现移动端轮播图
2020/12/21 Javascript
js module大战
2019/04/19 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
详解Python中的条件判断语句
2015/05/14 Python
python简易远程控制单线程版
2018/06/20 Python
Python生成器generator用法示例
2018/08/10 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
医院护士的求职信
2014/01/03 职场文书
班主任工作年限证明
2014/01/12 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
2015年大学生实习评语
2015/03/25 职场文书
总经理岗位职责范本
2015/04/01 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
2016中秋节广告语
2016/01/28 职场文书