使用 go-elasticsearch v8 基本请求

使用 go-elasticsearch 请求示例

你可以通过参考Go 官方文档找到简单的示例,所以我认为先看看这个是个好主意。

连接客户端有两种方式,如下图。
至于两者的特点,TypedClient有类型,更容易编写,但文档较少。另外,批量索引不支持TypedClient。由于普通客户端都是基于json的,所以我觉得从文档转换到代码还是比较容易的。

我的建议基本上是使用 TypedClient!
虽然文档很稀疏,但它是基于规律性的类型化的,所以你越习惯它(特别是当涉及到有很多变化的东西时,比如查询),从 json 转换为类型化代码就越容易。

func main() {// clientes, err := elasticsearch.NewClient(elasticsearch.Config{Addresses: []string{"http://localhost:9200"},})if err != nil {log.Fatalf("Error creating the client: %s", err)}// typed clientes, err := elasticsearch.NewTypedClient(elasticsearch.Config{Addresses: []string{"http://localhost:9200"},})if err != nil {log.Fatalf("Error creating the client: %s", err)}
}

Index Create/Delete

关于索引创建,Go官方文档中有一个示例,所以我简单介绍一下。


func main() {es, err := elasticsearch.NewTypedClient(elasticsearch.Config{Addresses: []string{"http://localhost:9200"},})if err != nil {log.Fatalf("Error creating the client: %s", err)}ignoreAbove := 256keywordProperty := types.NewKeywordProperty()keywordProperty.IgnoreAbove = &ignoreAbovedateProperty := types.NewDateProperty()format := "yyyy/MM/dd||yyyy/MM||MM/dd||yyyy||MM||dd"dateProperty.Format = &format// index作成_, err = es.Indices.Create("sample_index").Request(&create.Request{Settings: &types.IndexSettings{IndexSettings: map[string]json.RawMessage{// 設定項目// bulk index里面的数据更新感觉。如果不需要频繁更新,设置得更长会提高性能。"refresh_interval": json.RawMessage(`"30s"`),// 可取得的最大件数的上限"max_result_window": json.RawMessage(`"1000000"`),},},Mappings: &types.TypeMapping{Properties: map[string]types.Property{// 映射的定义"name":       keywordProperty,"age":        types.NewIntegerNumberProperty(),"is_checked": types.NewBooleanProperty(),"created_at": dateProperty,},},}).Do(context.TODO())if err != nil {log.Fatalf("Error creating the client: %s", err)}// index削除_, err = es.Indices.Delete("sample_index").Do(context.TODO())if err != nil {log.Fatalf("Error deleting the client: %s", err)}
}

Bulk Index

批量索引代码基于go-elasticsearch 示例。

var jsonitier = jsoniter.ConfigCompatibleWithStandardLibrarytype SampleIndexData struct {ID        int64  `json:"id"`Name      string `json:"name"`Age       int    `json:"age"`IsChecked bool   `json:"is_checked"`CreatedAt string `json:"created_at"`
}func main() {es, err := elasticsearch.NewClient(elasticsearch.Config{Addresses: []string{"http://localhost:9200"},})if err != nil {log.Fatalf("Error creating the client: %s", err)}esRef, err := elasticsearch.NewTypedClient(elasticsearch.Config{Addresses: []string{"http://localhost:9200"},})if err != nil {log.Fatalf("Error creating the client: %s", err)}datas := []*SampleIndexData{}for i := 1; i <= 100; i++ {datas = append(datas, &SampleIndexData{ID:        int64(i),Name:      fmt.Sprintf("name_%d", i),Age:       20,IsChecked: true,CreatedAt: time.Date(2021, 1, 15, 17, 28, 55, 0, jst).Format("2006/01/02"),})}bi, err := esutil.NewBulkIndexer(esutil.BulkIndexerConfig{Index:      "sample_index", // The default index nameClient:     es,             // The Elasticsearch clientNumWorkers: 1,              // The number of worker goroutines})if err != nil {log.Fatalf("Error creating the indexer: %s", err)}for _, a := range datas {data, err := jsonitier.Marshal(a)if err != nil {log.Fatalf("Cannot encode article %d: %s", a.ID, err)}err = bi.Add(context.Background(),esutil.BulkIndexerItem{// Delete时,action为“delete”,body为nil。Action: "index",DocumentID: strconv.Itoa(int(a.ID)),Body: bytes.NewReader(data),OnSuccess: func(ctx context.Context, item esutil.BulkIndexerItem, res esutil.BulkIndexerResponseItem) {fmt.Println("success")},OnFailure: func(ctx context.Context, item esutil.BulkIndexerItem, res esutil.BulkIndexerResponseItem, err error) {fmt.Println("failure")},},)if err != nil {log.Fatalf("Unexpected error: %s", err)}}if err := bi.Close(context.Background()); err != nil {log.Fatalf("Unexpected error: %s", err)}// 取决于refresh_interval的值,但是如果感觉很长,在所有的index结束后刷新,数据会立即反映出来,所以很好_, err = esRef.Indices.Refresh().Index("sample_index").Do(context.Background())if err != nil {log.Fatalf("Error getting response: %s", err)}
}

Query

基本查询如下所示:

Go 的官方文档仅包含搜索 API 的简单示例。您基本上必须自己组装上述详细信息。就我而言,我正在检查QueryDSL页面上的查询并在包中复制我需要的内容。

var jst = time.FixedZone("Asia/Tokyo", 9*60*60)
var formatTime = "2006-01-02T15:04:05.999999-07:00"func main() {es, err := elasticsearch.NewTypedClient(elasticsearch.Config{Addresses: []string{"http://localhost:9200"},})if err != nil {log.Fatalf("Error creating the client: %s", err)}ageLte := 40.0ageLteC := (*types.Float64)(&ageLte)ageGte := 13.0ageGteC := (*types.Float64)(&ageGte)pageStart := 0size := 50req := &search.Request{// 查询Query: &types.Query{Bool: &types.BoolQuery{// 过滤器(过滤器)Filter: []types.Query{// 范围过滤器(过滤器){Range: map[string]types.RangeQuery{"age": types.NumberRangeQuery{Gte: ageGteC,Lte: ageLteC,},},},// 术语过滤器(过滤器){Term: map[string]types.TermQuery{"is_checked": {Value: true},},},},},},// 页面的起点From: &pageStart,// 返回的数量Size: &size,// 排序指定Sort: []types.SortCombinations{types.SortOptions{SortOptions: map[string]types.FieldSort{"created_at": {Order: &sortorder.Desc},}},},}res, err := es.Search().Index("sample_index").Request(req).Do(context.TODO())if err != nil {log.Fatalf("Error query: %s", err)}// totalfmt.Println(res.Hits.Total)ds := []*SampleIndexData{}for _, hit := range res.Hits.Hits {var d *SampleIndexDataif err := json.Unmarshal(hit.Source_, &d); err != nil {log.Fatalf("Error decoding: %s", err)}ds = append(ds, d)}// 拿出数据.fmt.Println(ds)
}

此外,您还可以使用 kibana 中的 devtools 轻松检查详细错误,以查看查询是否正确。为了调整查询以使其正确,最好使用一个围绕此问题的工具(在代码中,它也包含在 err 中,所以也在那里检查它。我可以)。

综上所述

我已经简要描述了基本的索引创建/删除、使用 Bulk API 的批量处理以及如何在 go-elasticsearch 中使用 SearchAPI 编写搜索查询。

就我个人而言,我发现很容易迷失在 Elasticsearch 的文档中,当我尝试做一些详细的事情时,我最终会输入大量代码并进行反复试验,因此需要花费大量时间来理解整体概念并编写代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/229611.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux文件的扩展属性 attr cap

文件属性 Linux文件属性分为常规属性与扩展属性&#xff0c;其中扩展属性有两种&#xff1a;attr与xattr. 一般常规的文件属性由stat API 读取&#xff0c;一般是三种权限&#xff0c;ower, group&#xff0c;时间等。 扩展属性attr 用户态API ioctl(fd, FS_IOC32_SETFLAGS…

QQ邮件发送(PHP的Laravel)

1. 开启 QQ 邮箱的 SMTP 支持 2.里面会一个类似于密码之类&#xff08;复制一下&#xff09; 3.然后再 .env文件里面配置一下 MAIL_DRIVERsmtp —— 使用支持 ESMTP 的 SMTP 服务器发送邮件&#xff1b; MAIL_HOSTsmtp.qq.com —— QQ 邮箱的 SMTP 服务器地址&#xff0c;必…

OCP NVME SSD规范解读-3.NVMe管理命令-part2

NVMe-AD-8&#xff1a;在某些情况下&#xff08;如Sanitize命令、Format NVM命令或TCG Revert方法后数据被清除&#xff09;&#xff0c;设备应允许读取已清除的LBAs而不产生错误&#xff0c;并在最后一次清除完成后&#xff0c;对未写入LBAs的读取返回所有零值给主机 NVMe-AD…

什么牌子的护眼灯好用?2024好用护眼台灯分享

不良的光线、长时间的用眼都会给眼睛带来压力&#xff0c;影响视力健康&#xff01; 本人就是一个因为工作原因需要长时间坐电脑前码字和P图的打工人&#xff0c;对于出现眼睛酸痛、疲劳以及眼球出现红血丝的情况有多难受我是深有体会&#xff0c;在此之前我搜索了好多缓解眼睛…

golang并发编程-channel

在golang 并发编程里&#xff0c;经常会听到一句话&#xff1a;不要通过共享内存进行通信&#xff0c;通过通信来共享内存。下面我们会介绍下channel, 通过源码的方式去了解channel是怎么工作的。 基本结构 流程图 代码解读 type hchan struct {qcount uint // …

(NeRF学习)NeRFStudio安装win11

参考&#xff1a; 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程nerfstudio介绍及在windows上的配置、使用NeRFStudio官网githubRuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory原因及解决 目录 requireme…

不同角度深入探讨Maya和Blender这两款软件的差异

当我们面对三维建模软件的选择时&#xff0c;许多初学者可能会感到迷茫。今天&#xff0c;我们将从不同角度深入探讨Maya和Blender这两款软件的差异&#xff0c;特别是对于游戏建模领域的用户来说&#xff0c;这将有助于您更好地理解两者之间的区别。 软件授权与开发背景&#…

Python爬虫中的协程

协程 基本概念 协程&#xff1a;当程序执行的某一个任务遇到了IO操作时&#xff08;处于阻塞状态&#xff09;&#xff0c;不让CPU切换走&#xff08;就是不让CPU去执行其他程序&#xff09;&#xff0c;而是选择性的切换到其他任务上&#xff0c;让CPU执行新的任务&#xff…

引导过程的解析以及教程za

bios加电自检------mbr--------grub-------加载内核文件------启动第一个进程 bios的主要作用&#xff1a;检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 boot开机启动项顺序&#xff0c;你可以把内核文件放在何处&#xff1f; 1.硬盘 …

MySQL将多条数据合并成一条的完整示例

数据库中存的是多条数据&#xff0c;展示的时候需要合并成一条 数据表存储形式如下图 以type分组&#xff0c;type相同的算一条&#xff0c;且保留image和link的所有数据&#xff0c;用groupBy只保留一条数据 解决方案&#xff1a;用GROUP_CONCAT 完整语法如下 group_concat…

基于YOLOv8深度学习的人脸面部表情识别系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

10 个值得收藏的顶级手机数据恢复软件【2024年最新】

手机数据恢复&#xff0c;不要担心&#xff0c;今天就给大家分享10款数据恢复软件&#xff01; 现代人的手机中存储了许多重要数据&#xff0c;如照片、视频、消息、联系人等文件&#xff0c;如果手机损坏或数据丢失&#xff0c;这是一件非常烦恼的事情。此时&#xff0c;一款好…

解决jenkins的Exec command命令不生效,或者执行停不下来的问题

Jenkins构建完后将war包通过 Publish Over SSH 的插件发布到服务器上&#xff0c;在服务器上执行脚本时&#xff0c;脚本中的 nohup 命令无法执行&#xff0c;并不生效&#xff0c;我配置的Exec command命令是后台启动一个war包&#xff0c;并输出日志文件。 nohup java -jar /…

nginx源码分析-4

这一章内容讲述nginx的模块化。 ngx_module_t&#xff1a;一个结构体&#xff0c;用于描述nginx中的各个模块&#xff0c;其中包括核心模块、HTTP模块、事件模块等。这个结构体包含了一些模块的关键信息和回调函数&#xff0c;以便nginx在运行时能够正确地加载和管理这些模块。…

《动手学深度学习》学习笔记 第5章 深度学习计算

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知道&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

算法学习系列(十四):并查集

目录 引言一、并查集概念二、并查集模板三、例题1.合并集合2.连通块中点的数量 引言 这个并查集以代码短小并且精悍的特点&#xff0c;在算法竞赛和面试中特别容易出&#xff0c;对于面试而言&#xff0c;肯定不会让你去写一两百行的代码&#xff0c;一般出的都是那种比较短的…

[GKCTF 2020]ez三剑客-eztypecho

[GKCTF 2020]ez三剑客-eztypecho 考点&#xff1a;Typecho反序列化漏洞 打开题目&#xff0c;发现是typecho的CMS 尝试跟着创建数据库发现不行&#xff0c;那么就搜搜此版本的相关信息发现存在反序列化漏洞 参考文章 跟着该文章分析来&#xff0c;首先找到install.php&#xf…

Unable to connect to Redis server

报错内容&#xff1a; Exception in thread "main" org.redisson.client.RedisConnectionException: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 175.24.186.230/175.24.186.230…

使用idea构建父子类springboot项目教程

第一步创建一个父类java项目&#xff08;最外层java项目&#xff09; 1.点击File 然后点击new 再点击Project 2.点击Maven 配置Java版本 再点击next 3.GroupId&#xff1a;包结构&#xff0c;ArtifactId&#xff1a;项目名称&#xff0c;填写完&#xff0c;点击next 4.点击…

IOS - 手机安装包 ipa 常见几种方式

安装 ipa 包的方法有很多中&#xff0c;可以通过不同的软件安装&#xff0c;本文只列出了常用的几种&#xff0c;做个简单的归纳整理 1、iTunes 安装 数据线连接手机之后&#xff0c;会自动连接iTunes&#xff0c;&#xff08;第一次连接的时候会提示是否信任此电脑&#xff0…