使用 go-elasticsearch v8 基本请求

使用 go-elasticsearch 请求示例

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

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

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

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

    // typed client
    es, 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 := 256
	keywordProperty := types.NewKeywordProperty()
	keywordProperty.IgnoreAbove = &ignoreAbove

	dateProperty := 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.ConfigCompatibleWithStandardLibrary

type 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 name
		Client:     es,             // The Elasticsearch client
		NumWorkers: 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.0
	ageLteC := (*types.Float64)(&ageLte)

	ageGte := 13.0
	ageGteC := (*types.Float64)(&ageGte)

	pageStart := 0
	size := 50

	req := &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)
	}

	// total
	fmt.Println(res.Hits.Total)

	ds := []*SampleIndexData{}
	for _, hit := range res.Hits.Hits {
		var d *SampleIndexData
		if 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 的文档中,当我尝试做一些详细的事情时,我最终会输入大量代码并进行反复试验,因此需要花费大量时间来理解整体概念并编写代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用码云(Gitee)与IDEA轻松管理远程代码库的完整指南

目录 前言1 码云简介2 码云上创建远程库3 IDEA集成码云的步骤3.1 安装Gitee插件并建立连接3.2 项目分享到码云3.3 拉取代码 4 码云复制Github4.1 迁移github项目到码云4.2 代码同步 结语 前言 在软件开发领域&#xff0c;代码托管平台是开发者不可或缺的利器。Github作为全球最…

uniapp中uview组件丰富的Code 验证码输入框的使用方法

目录 基本使用 #自定义提示语 #保持倒计时 API #Props #Methods #Event 基本使用 通过ref获取组件对象&#xff0c;再执行后面的操作&#xff0c;见下方示例。 通过seconds设置需要倒计的秒数(默认60)通过ref调用组件内部的start方法&#xff0c;开始倒计时通过监听cha…

梯度下降算法 寻找函数最小值 找最快下山路线 python写个梯度下降算法示例

梯度下降算法是一种用于寻找函数最小值的优化算法。 它在机器学习和深度学习中被广泛使用&#xff0c;特别是在训练神经网络时。我们可以通过一个简单的生活中的例子来理解它&#xff1a; 想象你在一座山上&#xff0c;需要找到最快的路线下山。你不能一眼看到最低点&#xf…

RKE安装k8s及部署高可用rancher

一 了解 Rancher 1 推荐架构 安装 Rancher 的方式有两种&#xff1a;单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境&#xff0c;而且单节点安装和高可用集群安装之间不能进行数据迁移&#xff0c;所以推荐从一开始就使用高可用集群安装的方式安装 Ran…

Java经典框架之SpringDataJPA

SpringDataJPA Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring整合Hibernate 2…

解决Gitlab Prometheus导致的磁盘空间不足问题

解决Gitlab Prometheus导致的磁盘空间不足问题 用docker搭建了一个gitlab服务&#xff0c;已经建立了多个项目上传&#xff0c;但是突然有一天就503了。 df -TH查看系统盘&#xff0c;发现已经Used 100%爆满了。。。 &#x1f4a1;Tips&#xff1a;/dev/vda1目录是系统盘目录。…

x-cmd pkg | lazygit - git 命令的终端 UI

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 lazygit 由 Jesse Duffield 于 2018 年使用 Go 语言构建的 git 终端交互式命令行工具&#xff0c;旨在终端界面中便捷管理 git 存储库。 首次用户 使用 x lazygit 即可自动下载并使用 在终端运行 eval "$(curl …

Qt实现文本编辑器(二)

上一章节讲述了如何制作文本编辑页面&#xff0c;以及应该有哪些功能需要实现&#xff0c;只是做了展示效果&#xff0c;实际的点击事件并没有处理。今天来具体讲解下是如何实现菜单栏以及工具栏上对应的需求吧~ 功能实现 功能&#xff1a; 1、动作消息触发 2、具体功能&am…

vue +elementui 项目登录通过不同账号切换侧边栏菜单的颜色

前景提要&#xff1a;要求不同权限账号登录侧边栏颜色不一样。分为 theme&#xff1a;1代表默认样式&#xff0c;theme:2代表深色主题样式。 1.首先定义一个主题文件 theme.js&#xff0c;定义两个主题样式 // 主要是切换菜单栏和菜单头部主题的设计&#xff0c;整体主题样式切…

electron进程通信之预加载脚本和渲染进程对主进程通信

主进程和预加载脚本通信 主进程 mian,js 和预加载脚本preload.js,在主进程中创建预加载脚本, const createWindow () > {// Create the browser window.const mainWindow new BrowserWindow({width: 300,height: 300,// 指定预加载脚本webPreferences: {preload: path.j…

基于rockpi4b启动流程(2)

uboot启动kernel 基于上篇文章,将开发板烧录loder和system镜像,即可开机进console。 我们将系统停到uboot命令行,printenv看下环境变量 => printenv arch=arm baudrate=1500000 board=evb_rk3399 board_name=evb_rk3399 boot_a_script=load ${devtype} ${devnum}:${di…

闭包,垃圾回收机制

1.垃圾回收机制 当函数执行完毕后,函数内部的变量就会被销毁。 代码&#xff1a; function fn() {var a 10;a;return a;}console.log(fn()); 输出的结果: 11 持续调用的结果: 2.变量的私有化 代码: function fn() {var a 10;return function fn1() {return a;}…

汽车架构解析:python cantools库快速解析arxml

文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 总结 前言 曾经有拿cantools来解析过dbc&#xff0c;用得比较浅&#xff0c;不知道可以用来解析arxml。最近有个需求需要…

鸿蒙开发第一天

一、开发准备工作 1、开发工具的安装 1&#xff09;下载地址&#xff1a;https://developer.huawei.com/consumer/cn/deveco-studio/ 2&#xff09;查询API文档链接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/syscap-00000014080893…

Spring-Retry 重试框架使用

一、Spring-Retry Spring-Retry框架是Spring自带的功能&#xff0c;具备间隔重试、包含异常、排除异常、控制重试频率等特点&#xff0c;是项目开发中很实用的一种框架。 支持手动调用方式和注解方式。 使用需引入下面依赖&#xff1a; <dependency><groupId>o…

css文本溢出处理——单行、多行

日常开发中&#xff0c;经常会遇到需要展示的文本过长&#xff0c;这种情况下&#xff0c;为了提高用户的使用体验&#xff0c;最常见的处理方式就是把溢出的文本显示成省略号。 处理文本的溢出的方式&#xff1a;1&#xff09;单行文本溢出&#xff1b; 2&#xff09;多行文本…

一年中ChatGPT使用情况

介绍 本人是独立开源软件开发者&#xff0c;参与很多项目建设&#xff0c;谈下日常使用情况。 我用了一年多&#xff0c;现在已经离不开&#xff0c;我如指挥家&#xff0c;它是我最忠诚的乐手。 编码 GitHub Copilot&#xff1a;GitHub Copilot是GitHub和OpenAI合作开发的一…

Delphi6函数大全3-SysUtils.pas

Delphi6函数大全3-SysUtils.pas首部 function FindNext(var F: TSearchRec): Integer; $[SysUtils.pas功能 返回继续文件搜索说明 搜索成功则返回0参考 function Windows.FindNextFile例子 <参见FindFirst>━━━━━━━━━━━━━━━━━━━━━首部…

WebStorm 创建一个Vue项目(1)

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器(调节根轨迹)

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器&#xff08;调节根轨迹&#xff09; 1. Plot Rootlocus 绘制根轨迹2. System Performance 系统表现3. 改善/加快收敛速度4. 超前补偿器 Lead Compe…