使用 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.mzph.cn/news/592090.shtml

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

相关文章

以 RoCE+软件定义存储同时实现信创转型与架构升级

目前&#xff0c;不少企业数据中心使用 FC 交换机和集中式 SAN 存储&#xff08;以下简称“FC-SAN 架构”&#xff09;&#xff0c;支持核心业务系统、数据库、AI/ML 等高性能业务场景。而在开展 IT 基础架构信创转型时&#xff0c;很多用户受限于国外交换机&#xff1a;FC 交换…

往期精彩推荐

所有的内容都在这个博客中&#xff0c;此博客为推广导航博客&#xff0c;过后会删掉https://blog.csdn.net/weixin_41620184/article/details/135042416 往期精彩&#xff1a;快来学习吧~~~ 机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归PySpark大数据处…

向日葵远程工具安装Mysql的安装与配置

目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…

VS2017 搭建opencv工程

VS2017 搭建opencv工程 opencv在处理图像方面具有很强的能力&#xff0c;在使用opencv之前先需要造好轮子。 1、opencv 官网 &#xff0c;下载对应的资源文件包。 根据自身选择。下载包之后&#xff0c;解压。分为build和sources source目录下分别存放&#xff1a; modules: …

侯捷C++ 2.0 新特性

关键字 nullptr and std::nullptr_t auto 一致性初始化&#xff1a;Uniform Initialization 11之前&#xff0c;初始化方法包括&#xff1a;小括号、大括号、赋值号&#xff0c;这让人困惑。基于这个原因&#xff0c;给他来个统一&#xff0c;即&#xff0c;任何初始化都能够…

React使用动态标签名称

最近在一项目里&#xff08;React antd&#xff09;遇到一个需求&#xff0c;某项基础信息里有个图标配置&#xff08;图标用的是antd的Icon组件&#xff09;&#xff0c;该项基础信息的图标信息修改后&#xff0c;存于后台数据库&#xff0c;后台数据库里存的是antd Icon组件…

用Redis实现实现全局唯一ID

全局唯一ID 如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显受表数据量的限制 全局ID生成器&#xff0c;是一种在分布式系统下用来生成全局唯一ID的工具&#xff0c;一般要满足下列特性&#xff1a; 唯一性高可用递增性安全性高性能 为了增加ID的安全性…

Django 后台与便签

1. 什么是后台管理 后台管理是网页管理员利用网页的后台程序管理和更新网站上网页的内容。各网站里网页内容更新就是通过网站管理员通过后台管理更新的。 2. 创建超级用户 1. python .\manage.py createsuperuser 2. 输入账号密码等信息 Username (leave blank to use syl…

在Android设备上设置和使用隧道代理HTTP

随着互联网的深入发展&#xff0c;网络信息的传递已经成为人们日常生活中不可或缺的一部分。对于我们中国人来说&#xff0c;由于某些特殊的原因&#xff0c;访问国外网站时常常会遇到限制。为了解决这个问题&#xff0c;使用代理服务器成为了许多人的选择。而在Android设备上设…

微服务智慧工地信息化解决方案(IOT云平台源码)

智慧工地是指应用智能技术和互联网手段对施工现场进行管理和监控的一种工地管理模式。它利用传感器、监控摄像头、人工智能、大数据等技术&#xff0c;实现对施工现场的实时监测、数据分析和智能决策&#xff0c;以提高工地的安全性、效率和质量。 智慧工地平台是一种智慧型、系…

Redis双写一致性

文章目录 Redis双写一致性1. 延迟双删&#xff08;有脏数据风险&#xff09;2. 异步通知&#xff08;保证数据最终一致性&#xff09;3. 分布式锁&#xff08;数据的强一致&#xff0c;性能低&#xff09; Redis双写一致性 当修改了数据库的数据也要同时更新缓存的数据&#xf…

Linux 系统拉取 Github项目

一、安装Git 在Linux上拉取GitHub项目可以使用Git命令。首先确保已经安装了Git。如果没有安装&#xff0c;可以通过包管理器&#xff08;比如apt、yum&#xff09;来进行安装。 sudo yum install git #查看安装版本 git -version二、关联GitHub 配置本地账户和邮箱 >>…

iOS实时查看App运行日志

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

Rust 圣经 阅读 引用与借用

Rust 通过 借用&#xff08;Borrowing&#xff09; 在使用某个变量的指针或引用。 获取变量的引用&#xff0c;称之为 借用&#xff08;borrowing&#xff09; 。 引用与解引用 引用是为了解决在使用函数时&#xff0c;频繁地传递所有权。 引用只是获取了引用权&#xff0c;而…

魔改Stable Diffusion,开源创新“单目深度估计”模型

单目深度估计一直是计算机视觉领域的难点。仅凭一张 RGB 图像,想要还原出场景的三维结构,在几何结构上非常不确定,必须依赖复杂的场景理解能力。 即便使用更强大的深度学习模型来实现&#xff0c;也面临算力需求高、图像数据注释量大、泛化能力弱等缺点。 为了解决这些难题&a…

线性代数第一课+第二课总结

第一课 第一课是简单的行列式计算&#xff0c;主要就是要把左下角的数字全部转换为0&#xff0c;通过减去其他行的式子即可实现&#xff0c;最后把对角线的所有数字相乘&#xff0c;得到的结果是最后行列式的答案 第二课 例题1 硬算理论上其实也是可行的&#xff0c;但是使…

R语言——reshape2包、tidyr包、dplyr包(五)

目录 一、数据转换之reshape2包&#xff1a;melt与dcast函数 二、数据转换之tidyr包&#xff1a;gather与spread函数&#xff0c;separate与unite函数 三、据转换之dplyr包 四、参考 一、数据转换之reshape2包&#xff1a;melt与dcast函数 merge 函数 使用merge函数 x &l…

听GPT 讲Rust源代码--library/proc_macro

File: rust/library/proc_macro/src/bridge/rpc.rs 在Rust源代码中&#xff0c;rust/library/proc_macro/src/bridge/rpc.rs文件的作用是实现了Rust编程语言的编译过程中的远程过程调用&#xff08;RPC&#xff09;机制。 这个文件定义了与编译器的交互过程中使用的各种数据结构…

阿里云2核2G3M服务器能放几个网站?有限制吗?

阿里云2核2g3m服务器可以放几个网站&#xff1f;12个网站&#xff0c;阿里云服务器网的2核2G服务器上安装了12个网站&#xff0c;甚至还可以更多&#xff0c;具体放几个网站取决于网站的访客数量&#xff0c;像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

万界星空科技低代码平台基本模块与优势

低代码平台&#xff08;Low-Code Development Platform&#xff0c;LCDP&#xff09;就是使用低代码的方式进行开发&#xff0c;能快速设置和部署的平台。低代码平台旨在简化应用开发过程&#xff0c;降低开发难度&#xff0c;缩短开发周期&#xff0c;并使非专业程序员&#x…