go语言里面使用elasticsearch

一、安装docker

  • 1、在ubuntu系统中直接输入docker ps如果没有安装的会直接提示你用什么命令来安装

    properties 复制代码
    apt  install docker.io
  • 2、配置docker的镜像源

    properties 复制代码
    cat /etc/docker/daemon.json
    {
      "registry-mirrors": [
        "https://713yqum7.mirror.aliyuncs.com",
        "https://stii1wjo.mirror.aliyuncs.com",
        "https://docker.1ms.run", 
        "https://dockerproxy.com",
        "https://mirror.ccs.tencentyun.com",
        "https://registry.docker-cn.com",
        "https://hub-mirror.c.163.com"
      ]
    }
  • 3、重启docker

    properties 复制代码
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    sudo systemctl status docker

二、安装elasticsearch

  • 1、配置es的环境

    properties 复制代码
    mkdir -p /opt/es/config & mkdir -p /opt/es/data & mkdir -p /opt/es/plugins
    chmod 777 /opt/es/data
  • 2、配置对外访问

    yaml 复制代码
    echo "http.host: 0.0.0.0" > /opt/es/config/elasticsearch.yml
  • 3、docker拉取镜像

    properties 复制代码
    docker pull elasticsearch:7.12.0
  • 4、启动容器

    properties 复制代码
    docker run -d \
      --name es \
      -p 9200:9200 \
      -p 9300:9300 \
      -e "discovery.type=single-node" \
      -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
      -v /opt/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
      -v /opt/es/data:/usr/share/elasticsearch/data \
      -v /opt/es/plugins:/usr/share/elasticsearch/plugins \
      elasticsearch:7.12.0
  • 5、服务器上部署要先开发安全组端口

  • 6、浏览器直接访问http://ip地址:9200/,出现下面的就表示安装成功了

    json 复制代码
    {
        "name": "8bd0f1e062c4",
        "cluster_name": "elasticsearch",
        "cluster_uuid": "UfzRsKGdRKmYAeETDcbuZA",
        "version": {
            "number": "7.12.0",
            "build_flavor": "default",
            "build_type": "docker",
            "build_hash": "78722783c38caa25a70982b5b042074cde5d3b3a",
            "build_date": "2021-03-18T06:17:15.410153305Z",
            "build_snapshot": false,
            "lucene_version": "8.8.0",
            "minimum_wire_compatibility_version": "6.8.0",
            "minimum_index_compatibility_version": "6.0.0-beta1"
        },
        "tagline": "You Know, for Search"
    }

三、客户端可视化界面的安装

  • 1、这里使用谷歌插件来查看es

  • 2、谷歌浏览器插件市场上搜索multi Elasticsearch head

  • 3、第一次进来要添加es的连接

  • 4、这里的索引可以类比为mysql数据库中的表

四、配置登录账号和密码

  • 1、使用命令启动新的容器

    properties 复制代码
    docker run --name es \
    -p 9200:9200 \
    -p 9300:9300 \
    -e "discovery.type=single-node" \
    -e "xpack.security.enabled=true" \
    -e "ELASTIC_PASSWORD=123456" \
    -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
    -v /opt/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    -v /opt/es/data:/usr/share/elasticsearch/data \
    -v /opt/es/plugins:/usr/share/elasticsearch/plugins \
    -d elasticsearch:7.12.0
  • 2、生成的账号和密码分别为

    • elastic 是默认超级管理员账号
    • 123456 是你设置的密码

五、在go里面基本使用es操作索引

  • 1、安装依赖包

    properties 复制代码
    go get -u github.com/olivere/elastic/v7
  • 2、基本连接并且挂载到全局变量上

    go 复制代码
    package global
    
    import "github.com/olivere/elastic/v7"
    
    var (
    	ESClient *elastic.Client
    )
    go 复制代码
    package core
    
    import (
    	"fmt"
    	"gin-admin-api/test20260304-es/global"
    	"github.com/olivere/elastic/v7"
    )
    
    func EsConnect() {
    	client, err := elastic.NewClient(
    		elastic.SetURL("http://101.32.208.202:9200"),
    		elastic.SetSniff(false),
    		elastic.SetBasicAuth("elastic", "123456"),
    	)
    	if err != nil {
    		fmt.Println("连接es失败")
    		return
    	}
    	fmt.Println("连接es成功")
    	global.ESClient = client
    }
  • 3、创建数据模型(针对go语言里面的数据模型)

    go 复制代码
    type UserModel struct {
    	ID        uint   `json:"id"`         // 主键id
    	UserName  string `json:"user_name"`  // 用户名
    	NickName  string `json:"nick_name"`  // 昵称
    	CreatedAt string `json:"created_at"` // 创建时间
    	Age       int    `json:"age"`        // 年龄
    }
    
    func (UserModel) Index() string {
    	return "user_index"
    }
  • 4、索引的增删查

    go 复制代码
    // 创建索引
    result, err := global.ESClient.CreateIndex(models.UserModel{}.Index()).Do(context.Background())
    fmt.Println(result, err)
    // 2.判断索引是否存在
    exist, err := global.ESClient.IndexExists(models.UserModel{}.Index()).Do(context.Background())
    fmt.Println(exist, err)
    // 3.删除索引
    result, err := global.ESClient.DeleteIndex(models.UserModel{}.Index()).Do(context.Background())
    fmt.Println(result, err)
  • 5、实际操作中不创建索引也可以直接插入数据

六、go语言直接操作es文档(数据)

  • 1、单个插入数据到es

    go 复制代码
    user := models.UserModel{
    		ID:        1,                     // 主键id
    		UserName:  "张三",                  // 用户名
    		NickName:  "张三昵称",                // 昵称
    		CreatedAt: "2026-03-04 12:00:00", // 创建时间
    		Age:       18,                    // 年龄
    	}
    	result, err := global.ESClient.Index().Index(models.UserModel{}.Index()).BodyJson(user).Do(context.Background())
    	fmt.Println(utils.MapToJson(result), err)
    // {"_index":"user_index","_type":"_doc","_id":"5JxMuZwBrv37MzDrrnku","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
  • 2、批量插入数据

    go 复制代码
    userList := []models.UserModel{
    		{
    			ID:        1,                     // 主键id
    			UserName:  "张三",                  // 用户名
    			NickName:  "张三昵称",                // 昵称
    			CreatedAt: "2026-03-04 12:00:00", // 创建时间
    			Age:       18,                    // 年龄
    		},
    		{
    			ID:        2,                     // 主键id
    			UserName:  "李四",                  // 用户名
    			NickName:  "李四昵称",                // 昵称
    			CreatedAt: "2026-03-05 12:00:00", // 创建时间
    			Age:       20,                    // 年龄
    		},
    		{
    			ID:        3,                     // 主键id
    			UserName:  "王五",                  // 用户名
    			NickName:  "王五昵称",                // 昵称
    			CreatedAt: "2026-03-06 12:00:00", // 创建时间
    			Age:       22,                    // 年龄
    		},
    	}
    	bulk := global.ESClient.Bulk().Index(models.UserModel{}.Index()).Refresh("true")
    	for _, user := range userList {
    		req := elastic.NewBulkCreateRequest().Doc(user)
    		bulk.Add(req)
    	}
    	res, err := bulk.Do(context.Background())
    	fmt.Println(utils.MapToJson(res), err)
  • 3、根据id来删除数据

    go 复制代码
    res, err := global.ESClient.Delete().Index(models.UserModel{}.Index()).Id("45xMuZwBrv37MzDrTnn7").Do(context.Background())
    fmt.Println(utils.MapToJson(res), err)
  • 4、根据id列表批量删除数据

    go 复制代码
    idList := []string{
      "tGcofYkBWS69Op6QHJ2g",
      "tWcpfYkBWS69Op6Q050w",
    }
    bulk := global.ESClient.Bulk().Index(models.UserModel{}.Index()).Refresh("true")
    for _, s := range idList {
      req := elastic.NewBulkDeleteRequest().Id(s)
      bulk.Add(req)
    }
    res, err := bulk.Do(context.Background())
    fmt.Println(utils.MapToJson(res), err)
  • 5、修改数据

    go 复制代码
    res, err := global.ESClient.Update().Index(models.UserModel{}.Index()).Id("5JxMuZwBrv37MzDrrnku").Doc(map[string]interface{}{
      "user_name": "张三1",
      "nick_name": "张三昵称1",
    }).Do(context.Background())
    fmt.Println(utils.MapToJson(res), err)
  • 6、分页查询数据

    go 复制代码
    limit := 2
    page := 1
    from := (page - 1) * limit
    res, err := global.ESClient.Search(models.UserModel{}.Index()).From(from).Size(limit).Do(context.Background())
    fmt.Println(utils.MapToJson(res), err)
    
    // 查询数据结果
    // {"took":1,"hits":{"total":{"value":4,"relation":"eq"},"max_score":1,"hits":[{"_score":1,"_index":"user_index","_type":"_doc","_id":"5ZxSuZwBrv37MzDrNHlz","_seq_no":null,"_primary_term":null,"_source":{"id":1,"user_name":"张三","nick_name":"张三昵称","created_at":"2026-03-04 12:00:00","age":18}},{"_score":1,"_index":"user_index","_type":"_doc","_id":"5pxSuZwBrvNHlz","_seq_no":null,"_primary_term":null,"_source":{"id":2,"user_name":"李四","nick_name":"李四昵称","created_at":"2026-03-05 12:00:00","age":20}}]},"_shards":{"total":1,"successfufailed":0}}
  • 7、精确查找

    go 复制代码
    // 增加查询条件
    query := elastic.NewTermQuery("user_name.keyword", "张三")
    res, err := global.ESClient.Search(models.UserModel{}.Index()).Query(query).From(from).Size(limit).Do(context.Background())
    fmt.Println(utils.MapToJson(res), err)
  • 8、模糊查找

    go 复制代码
    query := elastic.NewMatchQuery("user_name", "张三")
    res, err := global.ESClient.Search(models.UserModel{}.Index()).Query(query).From(from).Size(limit).Do(context.Background())
    fmt.Println(utils.MapToJson(res), err)
  • 9、因为上面都是自动创建mapping

    json 复制代码
    "user_name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword"
        }
      }
    }

    user_name → text(会分词)

    user_name.keyword → keyword(不分词)

相关推荐
小邓的技术笔记3 小时前
C# 异步编程深水区:Task、ValueTask、线程池饥饿与背压设计
开发语言·c#
马士兵教育3 小时前
AI大模型的未来职业发展方向!
开发语言·人工智能·面试·职场和发展
阿蒙Amon3 小时前
C#常用类库-详解Dapper
开发语言·c#
不会写DN3 小时前
golang的fs除了定权限还能干什么?
开发语言·爬虫·golang
共享家95273 小时前
C++ string 类从原理到实战
开发语言·c++
库奇噜啦呼3 小时前
【iOS】Effective Objective-C第一章
开发语言·ios·objective-c
风中凌乱3 小时前
linux服务器安装部署mayfly-go
linux·服务器·golang
不会写DN4 小时前
Go 语言并发编程的 “工具箱”
开发语言·后端·golang
叶宇燚4 小时前
Java整理--数据结构篇
java·开发语言·数据结构