go语言里面使用elasticsearch

📅 发布时间:2026/7/5 3:02:48 👁️ 浏览次数:
go语言里面使用elasticsearch
一、安装docker1、在ubuntu系统中直接输入docker ps如果没有安装的会直接提示你用什么命令来安装apt install docker.io2、配置docker的镜像源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、重启dockersudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl status docker二、安装elasticsearch1、配置es的环境mkdir -p /opt/es/config mkdir -p /opt/es/data mkdir -p /opt/es/plugins chmod 777 /opt/es/data2、配置对外访问echo http.host:0.0.0.0/opt/es/config/elasticsearch.yml3、docker拉取镜像docker pull elasticsearch:7.12.04、启动容器docker run -d \ --name es \ -p 9200:9200 \ -p 9300:9300 \ -e discovery.typesingle-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.05、服务器上部署要先开发安全组端口6、浏览器直接访问http://ip地址:9200/,出现下面的就表示安装成功了{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、这里使用谷歌插件来查看es2、谷歌浏览器插件市场上搜索multi Elasticsearch head3、第一次进来要添加es的连接4、这里的索引可以类比为mysql数据库中的表四、配置登录账号和密码1、使用命令启动新的容器docker run --name es \ -p 9200:9200 \ -p 9300:9300 \ -e discovery.typesingle-node \ -e xpack.security.enabledtrue \ -e ELASTIC_PASSWORD123456 \ -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.02、生成的账号和密码分别为elastic是默认超级管理员账号123456是你设置的密码五、在go里面基本使用es操作索引1、安装依赖包go get -u github.com/olivere/elastic/v72、基本连接并且挂载到全局变量上packageglobalimportgithub.com/olivere/elastic/v7var(ESClient*elastic.Client)packagecoreimport(fmtgin-admin-api/test20260304-es/globalgithub.com/olivere/elastic/v7)funcEsConnect(){client,err:elastic.NewClient(elastic.SetURL(http://101.32.208.202:9200),elastic.SetSniff(false),elastic.SetBasicAuth(elastic,123456),)iferr!nil{fmt.Println(连接es失败)return}fmt.Println(连接es成功)global.ESClientclient}3、创建数据模型(针对go语言里面的数据模型)typeUserModelstruct{IDuintjson:id// 主键idUserNamestringjson:user_name// 用户名NickNamestringjson:nick_name// 昵称CreatedAtstringjson:created_at// 创建时间Ageintjson:age// 年龄}func(UserModel)Index()string{returnuser_index}4、索引的增删查// 创建索引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中user:models.UserModel{ID:1,// 主键idUserName:张三,// 用户名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、批量插入数据userList:[]models.UserModel{{ID:1,// 主键idUserName:张三,// 用户名NickName:张三昵称,// 昵称CreatedAt:2026-03-04 12:00:00,// 创建时间Age:18,// 年龄},{ID:2,// 主键idUserName:李四,// 用户名NickName:李四昵称,// 昵称CreatedAt:2026-03-05 12:00:00,// 创建时间Age:20,// 年龄},{ID:3,// 主键idUserName:王五,// 用户名NickName:王五昵称,// 昵称CreatedAt:2026-03-06 12:00:00,// 创建时间Age:22,// 年龄},}bulk:global.ESClient.Bulk().Index(models.UserModel{}.Index()).Refresh(true)for_,user:rangeuserList{req:elastic.NewBulkCreateRequest().Doc(user)bulk.Add(req)}res,err:bulk.Do(context.Background())fmt.Println(utils.MapToJson(res),err)3、根据id来删除数据res,err:global.ESClient.Delete().Index(models.UserModel{}.Index()).Id(45xMuZwBrv37MzDrTnn7).Do(context.Background())fmt.Println(utils.MapToJson(res),err)4、根据id列表批量删除数据idList:[]string{tGcofYkBWS69Op6QHJ2g,tWcpfYkBWS69Op6Q050w,}bulk:global.ESClient.Bulk().Index(models.UserModel{}.Index()).Refresh(true)for_,s:rangeidList{req:elastic.NewBulkDeleteRequest().Id(s)bulk.Add(req)}res,err:bulk.Do(context.Background())fmt.Println(utils.MapToJson(res),err)5、修改数据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、分页查询数据limit:2page:1from:(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、精确查找// 增加查询条件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、模糊查找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的user_name:{type:text,fields:{keyword:{type:keyword}}}user_name→ text会分词user_name.keyword→ keyword不分词