golang操作elasticsearch的实现

1、前提

1.1 docker 安装elasticsearch

查询elasticsearch 版本

docker search elasticsearch

将对应的版本拉到本地

docker.elastic.co/elasticsearch/elasticsearch:7.3.0

创建一个网络

docker network create esnet

启动容器

docker run --name es -p 9200:9200 -p 9300:9300 --network esnet -e "discovery.type=single-node" bdaab402b220

1.2这里过后就可以去写go代码 为了直观搞了个可视化工具 ElisticHD 这里使用docker 部署

docker run -p 9800:9800 -d --link es:demo --network esnet -e "discovery.type=single-node" containerize/elastichd

可以试一下界面还是很美观的

2、golang 实现elasticsearch 简单的增删改查

直接上代码:

package main

import (
  "context"
  "encoding/json"
  "fmt"
  "github.com/olivere/elastic/v7"
  "reflect"
)

var client *elastic.Client
var host = "http://ip:port"

type Employee struct {
  FirstName string  `json:"first_name"`
  LastName string  `json:"last_name"`
  Age    int   `json:"age"`
  About   string  `json:"about"`
  Interests []string `json:"interests"`
}

//初始化
func init() {
  //errorlog := log.New(os.Stdout, "APP", log.LstdFlags)
  var err error
      //这个地方有个小坑 不加上elastic.SetSniff(false) 会连接不上
  client, err = elastic.NewClient(elastic.SetSniff(false), elastic.SetURL(host))
  if err != nil {
    panic(err)
  }
  _,_,err = client.Ping(host).Do(context.Background())
  if err != nil {
    panic(err)
  }
  //fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)

  _,err = client.ElasticsearchVersion(host)
  if err != nil {
    panic(err)
  }
  //fmt.Printf("Elasticsearch version %s\n", esversion)

}

/*下面是简单的CURD*/

//创建
func create() {

  //使用结构体
  e1 := Employee{"Jane", "Smith", 32, "I like to collect rock albums", []string{"music"}}
  put1, err := client.Index().
    Index("megacorp").
    Type("employee").
    Id("1").
    BodyJson(e1).
    Do(context.Background())
  if err != nil {
    panic(err)
  }
  fmt.Printf("Indexed tweet %s to index s%s, type %s\n", put1.Id, put1.Index, put1.Type)

  //使用字符串
  e2 := `{"first_name":"John","last_name":"Smith","age":25,"about":"I love to go rock climbing","interests":["sports","music"]}`
  put2, err := client.Index().
    Index("megacorp").
    Type("employee").
    Id("2").
    BodyJson(e2).
    Do(context.Background())
  if err != nil {
    panic(err)
  }
  fmt.Printf("Indexed tweet %s to index s%s, type %s\n", put2.Id, put2.Index, put2.Type)

  e3 := `{"first_name":"Douglas","last_name":"Fir","age":35,"about":"I like to build cabinets","interests":["forestry"]}`
  put3, err := client.Index().
    Index("megacorp").
    Type("employee").
    Id("3").
    BodyJson(e3).
    Do(context.Background())
  if err != nil {
    panic(err)
  }
  fmt.Printf("Indexed tweet %s to index s%s, type %s\n", put3.Id, put3.Index, put3.Type)

}

//查找
func gets() {
  //通过id查找
  get1, err := client.Get().Index("megacorp").Type("employee").Id("2").Do(context.Background())
  if err != nil {
    panic(err)
  }
  if get1.Found {
    fmt.Printf("Got document %s in version %d from index %s, type %s\n", get1.Id, get1.Version, get1.Index, get1.Type)
    var bb Employee
    err:=json.Unmarshal(get1.Source,&bb)
    if err!=nil{
      fmt.Println(err)
    }
    fmt.Println(bb.FirstName)
    fmt.Println(string(get1.Source))
  }

}
//
//删除
func delete() {

  res, err := client.Delete().Index("megacorp").
    Type("employee").
    Id("1").
    Do(context.Background())
  if err != nil {
    println(err.Error())
    return
  }
  fmt.Printf("delete result %s\n", res.Result)
}
//
//修改
func update() {
  res, err := client.Update().
    Index("megacorp").
    Type("employee").
    Id("2").
    Doc(map[string]interface{}{"age": 88}).
    Do(context.Background())
  if err != nil {
    println(err.Error())
  }
  fmt.Printf("update age %s\n", res.Result)

}
//
////搜索
func query() {
  var res *elastic.SearchResult
  var err error
  //取所有
  res, err = client.Search("megacorp").Type("employee").Do(context.Background())
  printEmployee(res, err)

  //字段相等
  q := elastic.NewQueryStringQuery("last_name:Smith")
  res, err = client.Search("megacorp").Type("employee").Query(q).Do(context.Background())
  if err != nil {
    println(err.Error())
  }
  printEmployee(res, err)

  //条件查询
  //年龄大于30岁的
  boolQ := elastic.NewBoolQuery()
  boolQ.Must(elastic.NewMatchQuery("last_name", "smith"))
  boolQ.Filter(elastic.NewRangeQuery("age").Gt(30))
  res, err = client.Search("megacorp").Type("employee").Query(q).Do(context.Background())
  printEmployee(res, err)

  //短语搜索 搜索about字段中有 rock climbing
  matchPhraseQuery := elastic.NewMatchPhraseQuery("about", "rock climbing")
  res, err = client.Search("megacorp").Type("employee").Query(matchPhraseQuery).Do(context.Background())
  printEmployee(res, err)

  //分析 interests
  aggs := elastic.NewTermsAggregation().Field("interests")
  res, err = client.Search("megacorp").Type("employee").Aggregation("all_interests", aggs).Do(context.Background())
  printEmployee(res, err)

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

}
//
//打印查询到的Employee
func printEmployee(res *elastic.SearchResult, err error) {
  if err != nil {
    print(err.Error())
    return
  }
  var typ Employee
  for _, item := range res.Each(reflect.TypeOf(typ)) { //从搜索结果中取数据的方法
    t := item.(Employee)
    fmt.Printf("%#v\n", t)
  }
}

func main() {
  create()
  delete()
  update()
  gets()
  query()
  list(2,1)
}

有一个小坑要注意在代码中已经注释了,如果没有添加就会有下面错误

no active connection found: no Elasticsearch node available

解决

Docker No Elastic Node Aviable

关闭sniff模式;或者设置es的地址为 publish_address 地址

代码设置 sniff为false

到此这篇关于golang 操作 elasticsearch的实现的文章就介绍到这了,更多相关golang操作elasticsearch内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • elasticsearch python 查询的两种方法

    elasticsearch python 查询的两种方法,具体内容如下所述: from elasticsearch import Elasticsearch es = Elasticsearch res1 = es.search(index="2018-07-31", body={"query": {"match_all": {}}}) print(es1) {'_shards': {'failed': 0, 'skipped': 0, 'suc

  • go语言实现Elasticsearches批量修改查询及发送MQ操作示例

    目录 update_by_query批量修改 索引添加字段 查询es发送MQ update_by_query批量修改 POST post-v1_1-2021.02,post-v1_1-2021.03,post-v1_1-2021.04/_update_by_query { "query": { "bool": { "must": [ { "term": { "join_field": { "val

  • Go语言Elasticsearch数据清理工具思路详解

    微服务架构中收集通常大家都采用ELK进行日志收集,同时我们还采用了SkyWalking进行链路跟踪,而SkyWalking数据存储也用到了ES,SkyWalking每天产生大量的索引数据,如下: WX20211008-104751@2x 这里一天大概产生了700左右个索引数据.对历史的链路数据我们不做过多的保留. 这里我整理了个小工具,可以定期清理es数据. 一.清理思路 可以看到索引数据都是以日期结尾,我们可以根据日期去匹配索引数据,并对索引进行删除.这里需要考虑一点,有的Es服务开启了索引保

  • golang操作elasticsearch的实现

    1.前提 1.1 docker 安装elasticsearch 查询elasticsearch 版本 docker search elasticsearch 将对应的版本拉到本地 docker.elastic.co/elasticsearch/elasticsearch:7.3.0 创建一个网络 docker network create esnet 启动容器 docker run --name es -p 9200:9200 -p 9300:9300 --network esnet -e "d

  • golang操作mongodb的方法

    本文实例讲述了golang操作mongodb的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "launchpad.net/mgo"     "launchpad.net/mgo/bson" ) type Mail struct {     Id bson.ObjectId "_id"     Name string     Emai

  • 使用java操作elasticsearch的具体方法

    系统环境: vm12 下的centos 7.2 当前安装版本: elasticsearch-2.4.0.tar.gz Java操作es集群步骤1:配置集群对象信息:2:创建客户端:3:查看集群信息 1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错. 2:嗅探功能 通过client.transport.sniff启动嗅探功能,这样只需要指定集群中的某一个节点(不一定是主节点),然后会加载集群中的其他节点,这样只要程序不停即使此节点宕机仍然可以

  • Python 操作 ElasticSearch的完整代码

    官方文档:https://elasticsearch-py.readthedocs.io/en/master/ 1.介绍 python提供了操作ElasticSearch 接口,因此要用python来操作ElasticSearch,首先要安装python的ElasticSearch包,用命令pip install elasticsearch安装或下载安装:https://pypi.python.org/pypi/elasticsearch/5.4.0 2.创建索引 假如创建索引名称为ott,类型

  • java操作elasticsearch的案例解析

    这篇文章主要介绍了java操作elasticsearch的案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 到目前为止,我们一直都是使用RESTful风格的 API操作elasticsearch服务,但是通过我们之前的学习知道,elasticsearch提供了很多语言的客户端用于操作elasticsearch服务,例如:java.python..net.JavaScript.PHP等.而我们此次就学习如何使用java语言来操作elasti

  • Golang操作excel的方法

    关键术语介绍 为了方便开源库的快速上手,我们先来了解 excel 中的几个关键术语,如下图所示,①为sheet,也就是表格中的页签:②为row,代表 excel 中的一行:③为cell,代表 excel 中的一个单元格. 正常情况下,创建一个表格的基本流程是打开 wps 点击新建,这时会默认创建一个 sheet,然后在该 sheet 中的第一行填写表头,接下来根据表头逐行填充内容,最后将文件另存为到硬盘的某个位置.这与 Golang 开源库创建 excel 的流程基本相同,下面演示一个极简表格的

  • Golang操作MySql数据库的完整步骤记录

    前言 MySQL是业界常用的关系型数据库,在平时开发中会经常与MySql数据库打交道,所以在接下来将介绍怎么使用Go语言操作MySql数据库. 下载MySql连接驱动 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动.使用database/sql包时必须注入(至少)一个数据库驱动. 我们常用的数据库基本上都有完整的第三方实现.比如:MySQL驱动 **下载依赖** go get -u github.com/go-sql-driver/my

  • 使用postman操作ElasticSearch的方法

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具.今天给大家介绍的这款网页调试工具不仅可以调试简单的css.html.脚本等简单的网页基本信息,它还可以发送几乎所有类型的HTTP请求!Postman在发送网络HTTP请求方面可以说是Chrome插件类产品中的代表产品之一. Postma

  • php操作ElasticSearch搜索引擎流程详解

    目录 一.安装 二.使用 三.新建ES数据库 四.创建表 五.插入数据 六. 查询所有数据 七.查询单条数据 八.搜索 九.测试代码 〝 古人学问遗无力,少壮功夫老始成 〞 如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们. 一.安装 通过composer安装 composer require 'elasticsearch/elasticsearch' 二.使用 创建ES类 <?php require 'vendor/autoload.php'; //如果未设

  • golang操作rocketmq的示例代码

    下载 go get github.com/apache/rocketmq-client-go/v2 代码 func main() { // 1. 创建主题 //CreateTopic("test-04", 10909) // 2. 生产者向主题中发送消息 //SendSyncMessage("hello world0002") // 3. 消费者订阅主题并消费 SubscribeMessage() } func CreateTopic(topicName strin

随机推荐