使用 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.hqwc.cn/news/327642.html

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

相关文章

关于谷歌Gemini大模型

2023年12月7日&#xff0c;谷歌AI宣布发布新一代基于Transformer架构的大模型Gemini。 Gemini的名字来源于双子座&#xff0c;象征着模型的双重性质&#xff1a; 一方面&#xff0c;它是一个强大的训练模型&#xff0c;可以在各种下游任务上进行微调&#xff0c;如文本摘要、机…

【面试】面向对象编程的三大概念(实例辅助记忆)

【面试】面向对象编程的三大概念&#xff08;实例辅助记忆&#xff09; 虑面向对象编程的三大特性&#xff0c;它们是&#xff1a; 封装&#xff08;Encapsulation&#xff09;&#xff1a; 将对象的状态和行为封装在一起&#xff0c;对外部隐藏对象的内部实现细节。这样可以防…

UnityVR入门之六 如何让3DUI层级在场景模型之上

一、问题来源 根据 UnityVR入门之五 射线检测交互-CSDN博客 这一章节我们了解到VR要与UI交互需要将Canvas设置为World Space属性&#xff0c;然后使用碰撞盒的方式进行射线交互。 正常我们ui是始终叠加在3d场景之上的&#xff0c;如此设置当ui与场景模型相交就会遮挡穿模 二、解…

LeetCode 2807. 在链表中插入最大公约数【链表,迭代,递归】1279

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

C# Entity Framework 中不同的数据的加载方式

延迟加载 延迟加载是指在访问导航属性时&#xff0c;Entity Framework 会自动查询数据库并加载相关数据。这种方式在我们需要访问导航属性时比较方便&#xff0c;因为我们无需手动加载相关数据&#xff0c;而且只会在需要时才会进行查询&#xff0c;从而减少了不必要的开销。但…

uniapp 文字超出多少字,显示收起全文按钮效果demo(整理)

收起展开 <template><view class"font30 color000 mL30 mR30"><text :class"showFullText ? : clamp-text">{{ text }}</text><view v-if"showToggleBtn && text.length > 42" click"toggleShowFu…

计算机组成原理 指令流水线

文章目录 指令流水线指令流水线的概念流水线性能分析流水线的吞吐率流水线的加速比流水线的效率 影响流水线的因素结构相关 (资源冲突)数据相关 (数据冲突)控制相关 (控制冲突) 流水线分类超量流水线 指令流水线 #mermaid-svg-vSsJnNqZf24LgjVK {font-family:"trebuchet m…

轻量检测模型NonoDet-Plus解析

官方解读&#xff1a;超简单辅助模块加速训练收敛&#xff0c;精度大幅提升&#xff01;移动端实时的NanoDet升级版NanoDet-Plus来了&#xff01; - 知乎 official implementation&#xff1a;https://github.com/RangiLyu/nanodet Backbone backbone部分没有变化&#xff0…

时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时序预测对比

时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现EEMD-SSA-BiLSTM、…

TypeScript 从入门到进阶之基础篇(三) 元组类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

Kettle Local引擎使用记录(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web &#x1f4da;第一章 前言&#x1f4da;第二章 demo源码&#x1f4d7;pom.xml引入Kettle引擎核心文件&#x1f4d7;java源码&#x1f4d5; controller&#x1f4d5; service&#x1f4d5; 其它&#x1f4d5; maven settings.xml &#x1f4d7;测试&#x1f4d5; 测试…

Mac打包Unix可执行文件为pkg

Mac打包Unix可执行文件为pkg 方式一&#xff1a;通过packages页面打包 1.下载packages app Distribution&#xff1a;自定义化更高&#xff0c;包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目&#xff1a;通过unix可执行文件postinstall.sh脚本实现通过ma…