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 相关文章推荐
golang interface判断为空nil的实现代码
Apr 24 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
golang生成并解析JSON
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 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中jsonp的跨域实例
2013/06/21 PHP
php中define用法实例
2015/07/30 PHP
浅谈PHP的反射API
2017/02/26 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
微信小程序—setTimeOut定时器的问题及解决
2019/07/26 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
python Tkinter版学生管理系统
2019/02/20 Python
用 Python 制作地球仪的方法
2020/04/24 Python
python新手学习使用库
2020/06/11 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
中医专业职业生涯规划书范文
2014/01/04 职场文书
努力学习演讲稿
2014/05/10 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA