GO语言操作Elasticsearch示例分享
作者:93年的老男孩 发布时间:2023-09-03 03:38:00
标签:GO,Elasticsearch
Elasticsearch简介
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库–无论是开源还是私有。
连接Elasticsearch
// 引入g~
~~~~~-elasticsearch
import (
es8 "github.com/elastic/go-elasticsearch/v8"
)
// go-es配置
conf := es8.Config{
Addresses: "http://127.0.0.1:9200",
Username:"elastic",
Password:"jloMQ7ZCTlcZUr_hmDoB",
}
// 创建
client, err := es8.NewClient(conf);
if err != nil{
fmt.Println("============= 创建 elasticsearch 失败 =============")
return
}
// 连接
_, err1 := client.Info()
if err1 != nil{
fmt.Println("============= 连接 elasticsearch 失败 =============")
return
}
创建索引
创建model结构体
type Admin struct{
Id int `gorm:"<-" json:"id"`
UserName string `gorm:"<-" json:"user_name"`
RealName string `gorm:"<-" json:"real_name"`
Mobile string `gorm:"<-" json:"mobile"`
}
初始化model
admin := Admin{
Id: 1,
UserName: "test",
RealName: "测试",
Mobile: "15222222222",
}
创建索引
// 结构体json序列化
str,err := json.Marshal(admin);
if err != nil{
return ;
}
// 创建索引
res1, err1 := client.Index(
"db.table",
bytes.NewReader(str),
client.Index.WithDocumentID("1"), // 索引ID
client.Index.WithRefresh("true") //是否立即创建
);
搜索数据
创建返回结构体
type EsResponse struct{
Hits struct{
Total struct{
Value int `json:"value"`
} `json:"total"`
Hits []struct{
Index string `json:"_index"`
Id string `json:"_id"`
Score float32 `json:"_score"`
Source map[string]any `json:"_source"`
} `json:"hits"`
} `json:"hits"`
}
type EsData struct{
Total int `json:"total"`
List []map[string]any `json:"list"`
}
搜索数据
query := map[string]any{
"query":map[string]any{
"bool":map[string]any{
"must":[]map[string]any{
map[string]any{
"match_phrase":map[string]any{
"user_name": "test",
},
},
map[string]any{
"match_phrase":map[string]any{
"mobile": "15222222222",
},
},
},
},
},
}
str,err := json.Marshal(query);
if err != nil{
return ;
}
res1,err1 := client.Search(client.Search.WithBody(bytes.NewReader(str)));
if err1 != nil{
return ;
}
解析数据
var resData EsResponse;
err2 := json.NewDecoder(res1.Body).Decode(&resData);
if err2 != nil{
return ;
}
var esData EsData;
esData.Total = resData.Hits.Total.Value;
for _, v := range resData.Hits.Hits {
cache := v.Source
cache["_index"] = v.Index;
cache["_id"] = v.Id;
cache["_score"] = v.Score;
esData.List = append(esData.List,cache)
}
修改数据
单条修改
update := map[string]any{
"script": map[string]any{
"source":"ctx._source.user_name='test1';ctx._source.mobile='15211111111';",
"lang": "painless",
},
}
str,err1 := json.Marshal(update)
if err1 != nil{
return ;
}
res2,err2 := client.Update(
"db.table",
"1",
bytes.NewReader(str),
client.Update.WithRefresh("true")
)
if err2 != nil{
return ;
}
批量修改
update := map[string]any{
"query":map[string]any{
"bool":map[string]any{
"must":[]map[string]any{
map[string]any{
"match_phrase":map[string]any{
"user_name": "test",
},
},
map[string]any{
"match_phrase":map[string]any{
"mobile": "15222222222",
},
},
},
},
},
"script": map[string]any{
"source":"ctx._source.user_name='test1';ctx._source.mobile='15211111111';",
"lang": "painless",
},
}
str,err1 := json.Marshal(update)
if err1 != nil{
return ;
}
res2,err2 := client.UpdateByQuery(
[]string{
"db.table",
},
client.UpdateByQuery.WithBody(bytes.NewReader(str)),
client.UpdateByQuery.WithRefresh(true)
)
if err2 != nil{
return ;
}
删除数据
单条删除
res,err := client.Delete(
"db.table",
"1",
client.Delete.WithRefresh("true")
)
if err != nil{
return ;
}
批量删除
query := map[string]any{
"query":map[string]any{
"bool":map[string]any{
"must":[]map[string]any{
map[string]any{
"match_phrase":map[string]any{
"user_name": "test",
},
},
map[string]any{
"match_phrase":map[string]any{
"mobile": "15222222222",
},
},
},
},
},
}
str,err := json.Marshal(query);
if err != nil{
return ;
}
res,err := client.DeleteByQuery(
[]string{
"db.table",
},
bytes.NewReader(str),
client.DeleteByQuery.WithRefresh(true)
)
来源:https://blog.51cto.com/lzcit/6010742
0
投稿
猜你喜欢
- 目录项目地址功能概述效果图模块安装提交环境为python3.7 pyqt5==5.13.2 win10 一切正常!说一说大概的思路吧项目地址
- 相信在使用MSSQL数据库下使用事务回滚方式操作多表记录的时候,会经常出现“不能在手动或分布事务方式下创建新的连接”的出错提示信息,这个问题
- 上传控件基础知识说明:上传控件(<input type="file"/>)用于在客户端浏览并上传文件,用户选
- <% If Err.Number <> 0 Th
- 灵感来源之前在B站看到一个有意思的视频:【B站】【亦】终极云游戏!五千人同开一辆车,复现经典群体智慧实验大家可以看看,很有意思。up主通过代
- 1、绝对导入和相对导入绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPA
- 前言腾讯《Go安全指南》中提到【必须】nil指针判断:进行指针操作时,必须判断该指针是否为nil,防止程序panic,尤其在进行结构体Unm
- mysql对列求和mysql中,可以使用SELECT语句配合SUM()函数来对列求和,能够返回指定列值的总和,求和语法为&ldquo
- 本文实例为大家分享了如何利用Python对数据库的增删改查进行简单的封装,供大家参考,具体内容如下1.insert &
- 注:本文以Windos系统上Go SDK v1.17.5进行讲解1.go build命令2.手动案例2.1新建文件在桌面新建一个文件夹Hel
- 本文实例讲述了php基于协程实现异步的方法。分享给大家供大家参考,具体如下:github上php的协程大部分是根据这篇文章实现的:http:
- Numpy学习1 Numpy 介绍与应用1-1Numpy是什么NumPy 是一个运行速度非常快的数学库,一个开源的的python科学计算库,
- pandas官方文档:https://pandas.pydata.org/pandas-docs/stable/?v=20190307135
- 丢弃现有MySQL的表是很容易的。但是需要非常小心,删除任何现有的一个表后将无法恢复,因为数据丢失。语法:下面是通用的SQL语法丢弃(删除)
- (一)单一独立的参数如果命令行输入的参数都是各自单一独立的,直接用个循环把所有参数逐一读出来就行了。sys模块里面直接用args = sys
- 示例文件将以下内容保存为文件 people.csv。id,姓名,性别,出生日期,出生地,职业,爱好1,张小三,m,1992-10-03,北京
- 如下所示:#coding:utf-8 ''''' Created on 2014-7-24 @aut
- 首先看下面的代码创建存储过程1、创建存储过程,语句如下: CREATE PROC P_viewPage @TableName VARCHAR
- 一 概念Django的ORM中存在查询集的概念。查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。当调用如下过滤器方法
- MySQL 8.0.29 详细安装(windows zip版),供大家参考,具体内容如下1 官网官网地址:MySQL2 下载下载地址:MyS