go es实例

news2024/9/26 1:25:33

go es实例

1、下载第三方库

go get github.com/olivere/elastic

下载过程中出现如下报错:
在这里插入图片描述
解决方案:
在这里插入图片描述

2、示例

  • import
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"reflect"
	"time"

	"github.com/olivere/elastic"
)
  • es中用于序列化/反序列化数据的结构

json中字段若有omitempty标记,则这个字段为空时,json序列化为string时不会包含该字段。

type Tweet struct {
	User     string                `json:"user"`
	Message  string                `json:"message"`
	Retweets int                   `json:"retweets"`
	Image    string                `json:"image,omitempty"`
	Created  time.Time             `json:"created,omitempty"`
	Tags     []string              `json:"tags,omitempty"`
	Location string                `json:"location,omitempty"`
	Suggest  *elastic.SuggestField `json:"suggest_field,omitempty"`
}
const mapping = `
{
	"settings":{
		"number_of_shards": 1,
		"number_of_replicas": 0
	},
	"mappings":{
		"tweet":{
			"properties":{
				"user":{
					"type":"keyword"
				},
				"message":{
					"type":"text",
					"store": true,
					"fielddata": true
				},
				"image":{
					"type":"keyword"
				},
				"created":{
					"type":"date"
				},
				"tags":{
					"type":"keyword"
				},
				"location":{
					"type":"geo_point"
				},
				"suggest_field":{
					"type":"completion"
				}
			}
		}
	}
}`
func main(){
	//从elastic.v5开始,必须传递ctx上下文来执行每个服务
	ctx := context.Background()

	//获取客户端连接到es默认安装地址127.0.0.1:9200
	client, err := elastic.NewClient()
	if err != nil {
		// Handle error
		panic(err)
	}

	//Ping es服务去获取版本号
	if err != nil {
		// Handle error
		panic(err)
	}
	fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)

	//获取es版本号的快捷方式
	esversion, err := client.ElasticsearchVersion("http://127.0.0.1:9200")
	if err != nil {
		// Handle error
		panic(err)
	}
	fmt.Printf("Elasticsearch version %s\n", esversion)

	//使用IndexExists服务检查指定索引是否存在
	exists, err := client.IndexExists("twitter").Do(ctx)
	if err != nil {
		// Handle error
		panic(err)
	}
	if !exists {
		// Create a new index.
		createIndex, err := client.CreateIndex("twitter").BodyString(mapping).Do(ctx)
		if err != nil {
			// Handle error
			panic(err)
		}
		if !createIndex.Acknowledged {
			// Not acknowledged
		}
	}

	//索引tweet(使用JSON序列化)
	tweet1 := Tweet{User: "olivere", Message: "Take Five", Retweets: 0}
	put1, err := client.Index().
		Index("twitter").
		Type("tweet").
		Id("1").
		BodyJson(tweet1).
		Do(ctx)
	if err != nil {
		// Handle error
		panic(err)
	}
	fmt.Printf("Indexed tweet %s to index %s, type %s\n", put1.Id, put1.Index, put1.Type)

	//索引第二条推文(按字符串)
	tweet2 := `{"user" : "olivere", "message" : "It's a Raggy Waltz"}`
	put2, err := client.Index().
		Index("twitter").
		Type("tweet").
		Id("2").
		BodyString(tweet2).
		Do(ctx)
	if err != nil {
		// Handle error
		panic(err)
	}
	fmt.Printf("Indexed tweet %s to index %s, type %s\n", put2.Id, put2.Index, put2.Type)

	//通过指定ID获取推文
	get1, err := client.Get().
		Index("twitter").
		Type("tweet").
		Id("1").
		Do(ctx)
	if err != nil {
		// Handle error
		panic(err)
	}
	if get1.Found {
		fmt.Printf("Got document %s in version %d from index %s, type %s\n", get1.Id, get1.Version, get1.Index, get1.Type)
	}

	//刷新确保文档已经写好
	_, err = client.Flush().Index("twitter").Do(ctx)
	if err != nil {
		panic(err)
	}

	//使用term查询语句进行搜索
	termQuery := elastic.NewTermQuery("user", "olivere")
	searchResult, err := client.Search().
		Index("twitter").   // 在索引"twitter"中搜索
		Query(termQuery).   // 指定查询
		Sort("user", true). // 按"user"字段升序排序
		From(0).Size(10).   // take documents 0-9
		Pretty(true).       // pretty print request and response JSON
		Do(ctx)             // 执行请求
	if err != nil {
		// Handle error
		panic(err)
	}

	//searchResilt是SearchRusult类型,返回hits、suggestions和所有来自es的其他信息
	fmt.Printf("Query took %d milliseconds\n", searchResult.TookInMillis)

	//Each是一个方便的函数,迭代搜索结果中的hits
	//它确保你不需要去检查响应中的nil值
	//但是,它忽略序列化中的错误,如果你想完全控制遍历hits,见如下代码:
	var ttyp Tweet
	//reflect.TypeOf()用来动态获取输入参数接口中的值的类型,如果接口为空返回nil。实际就是获取interface{}的pair中的type
	for _, item := range searchResult.Each(reflect.TypeOf(ttyp)) {
		if t, ok := item.(Tweet); ok {
			fmt.Printf("Tweet by %s: %s\n", t.User, t.Message)
		}
	}
	//TotalHits是另一个遍历函数,即使出现问题也能正常工作
	fmt.Printf("Found a total of %d tweets\n", searchResult.TotalHits())

	//在完全控制每个步骤的情况下迭代结果
	if searchResult.Hits.TotalHits > 0 {
		fmt.Printf("Found a total of %d tweets\n", searchResult.Hits.TotalHits)

		// 遍历结果
		for _, hit := range searchResult.Hits.Hits {
			// hit.Index 包含索引的名称

			// 反序列化 hit.Source到一个Tweet (也可以只是一个map[string]interface{}).
			var t Tweet
			err := json.Unmarshal(*hit.Source, &t)
			if err != nil {
				// Deserialization failed
			}

			// Work with tweet
			fmt.Printf("Tweet by %s: %s\n", t.User, t.Message)
		}
	} else {
		// No hits
		fmt.Print("Found no tweets\n")
	}

	//通过es的Update API更新tweet
	//增加retweets的数量
	update, err := client.Update().Index("twitter").Type("tweet").Id("1").
		Script(elastic.NewScriptInline("ctx._source.retweets += params.num").Lang("painless").Param("num", 1)).
		Upsert(map[string]interface{}{"retweets": 0}).
		Do(ctx)
	if err != nil {
		// Handle error
		panic(err)
	}
	fmt.Printf("New version of tweet %q is now %d\n", update.Id, update.Version)

	//删除一个index
	deleteIndex, err := client.DeleteIndex("twitter").Do(ctx)
	if err != nil {
		// Handle error
		panic(err)
	}
	if !deleteIndex.Acknowledged {
		// Not acknowledged
	}	
}

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

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

相关文章

电脑文件删除了可以找回吗?3种文件恢复办法!

在日常工作中,我们经常会需要处理很多的工作文件,但有时候会不小心误删电脑中的文件。 那么,电脑上面的文件被删除了可以找回吗?答案是肯定的!下面就来分享三种比较好用的方法,一起来看下吧。 方法一&…

C++初阶——构造函数的初始化列表

前言:C中,初始化列表是构造函数中极为重要的一部分,是每个成员变量定义的地方。 目录 一.什么是初始化列表二.何时用初始化列表声明处赋值——缺省值 三.注意点 一.什么是初始化列表 初始化列表是每个成员变量定义的地方。不管我们有没有写,成…

带你了解—使用内网穿透,公网远程访问本地硬盘文件

文章目录 前言1. 下载cpolar和Everything软件3. 设定http服务器端口4. 进入cpolar的设置5. 生成公网连到本地内网穿透数据隧道 总结 前言 随着云概念的流行,不少企业采用云存储技术来保存办公文件,同时,很多个人用户也感受到云存储带来的便利…

测试右移,也就是生产环境下的QA

一、一个生产环境 Bug 的解决办法 先来跟大家分享一个生产环境下的 Bug: 一个在线订购葡萄酒的系统,订购流程相对复杂,下单过程中后台会有随机的失败,系统采取的措施是重试,就是说顾客下单后,后台如果有错…

中期国际:MT4数据挖掘与分析方法:以数据为导向,制定有效的交易策略

在金融市场中,制定有效的交易策略是成功交易的关键。而要制定一份可靠的交易策略,数据挖掘与分析方法是不可或缺的工具。本文将介绍如何以数据为导向,利用MT4进行数据挖掘与分析,从而制定有效的交易策略。 首先,我们需…

易服客工作室:Uncode主题 - 创意和WooCommerce WordPress主题

Uncode主题是一款像素完美的创意 WordPress 主题,适用于任何类型的网站(作品集、代理机构、自由职业者、博客),也是适用于商店(电子商务、在线商店、企业)的顶级 WooCommerce 主题。Uncode 的设计非常注重细…

C linux struct sigaction

在linux中定义struct sigaction结构体时, 在已经包含signal.h头文件的情况下, 仍旧提示找不到这个结构体. 需要在代码中定义 _POSIX_C_SOURCE 宏,并将其设为大于等于 199309L 的值。这样可以确保相关的函数和结构体在编译时可用。 这将告诉编译器以符合 POSIX 标准要…

vue项目打包成exe

目标:vue的项目打包成为exe可执行文件 工具:需要使用到Electron框架 首先,我们了解一下什么是Electron; Electron 是由 GitHub 开发而成的。它是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序的框架&#…

[JavaWeb]【三】Maven

目录 一 什么是Maven 二 Maven的作用 2.1 依赖管理 2.2 统一项目目录 2.3 标准项目构建 三 Maven概述 3.1 介绍 3.2 安装 四 IDEA集成Maven 4.1 配置Maven环境 4.1.1 单个项目配置 4.1.1.1 创建项目 4.1.1.2 配置项目JDK版本 4.1.1.3 配置maven 4.1.2 配置全局Maven环…

2023年我国重点水利工程建设全面提速,数字孪生赋能智慧水利

一、水利工程行业概述和分类 从定义上来看,水利工程是用于控制和调配自然界的地表水和地下水,达到除害兴利目的而修建的工程。也称为水工程。 根据观研报告网发布的《中国水利工程行业现状深度调研与投资趋势预测报告(2023-2030年&#xff…

入门jdk1.8处理空指针API-Optional

文章目录 入门jdk1.8处理空指针API-Optional类图结构简要说明常用api实践操作应用场景场景一: 对象不为空,做一些逻辑处理场景二:对象为空抛异常,或者对象某个字段为空抛指定异常场景三:级联判空,父节点&am…

【Control Net】第二章——模型介绍,线稿类

ControlNet1.1版本中发布了15个模型,有点过于多了。这里给分成三类: 线稿类(5个) 线稿类顾名思义,是处理线稿的,或者把图片提取成线稿的。 Canny,硬边缘提取 最早的边缘提取算法,提取的效果已经不如Lineart效果好了,处理有些粗糙。 MLSD,直线检测 可以识别建筑、…

【Linux】查看系统内存命令(详细讲解)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

【Apollo】赋能移动性:阿波罗自动驾驶系统的影响

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

Nvidia Jetson 编解码开发(1)介绍

前言 由于项目需要,需要开发Jetson平台的硬件编解码; 优化CPU带宽,后续主要以介绍硬件编解码为主 1.Jetson各平台编解码性能说明 如下是拿了Jetson nano/tx2/Xavier等几个平台做对比; 这里说明的编解码性能主要是对硬件来说的 2. 编解码实现说明 2.1 软件编解码 优点:…

CAS 一些隐藏的知识,您了解吗

目录 ConcurrentHashMap 一定是线程安全的吗 ConcurrentHashMap 在JDK1.8中ConcurrentHashMap 内部使用的是数组加链表加红黑树的结构,通过CASvolatile或synchronized的方式来保证线程安全的,这些原理已毋庸置疑,一言不合上代码. 模拟2个线程累计&#…

I/O软件层次到底是怎么分的?以及对库函数和系统调用的一些联想

其中,设备驱动程序和中断处理程序是直接和硬件打交道的 相关题目: 将系统调用参数翻译成设备操作命令的工作由()完成 A. 用户层I/O; B. 设备无关的操作系统软件;C. 中断处理;D. 设备驱动程序 …

vue3 videojs实现播放器,动态更改src

一、背景 vue3下载第三方插件videojs,达到播放器的效果,并且点击事件能够动态更改播放器的src。实现思路: 场景一:只有一个播放器,当点击事件,直接赋值,动态更改封装好的组件的src参数&#xff…

【AI】如何用AI生成XMind思维导图

哈喽,大家好,我是木头左,物联网搬砖工一名,致力于为大家淘出更多好用的AI工具! 背景 随着人工智能技术的不断发展,越来越多的应用场景开始涉及到AI技术。在办公软件领域,XMind是一款非常受欢迎…

阿里云服务区ECS,申请免费的服务器之后,如何使用xshell 登陆,找不到匹配的host key 算法

目录 1 问题2 解决 1 问题 当在阿里云免费领取服务器之后,使用xshell 登陆不上,提示 找不到匹配的host key 算法 或者 找不到匹配的keyexchange算法 咋解决 2 解决 在在服务器端配置文件:/etc/ssh/sshd_config # 在行尾增加",ecdh…