golang中使用elasticsearch

golang分布式中间件之ElasticSearch 在本文中,我们将介绍如何使用Go语言来实现ElasticSearch分布式中间件,并探讨ElasticSearch的一些核心概念和特性。go-elasticsearch是一个基于Elasticsearch官方客户端库开发的开源库,提供了简单、高效的Elasticsearch客户端实现。每个索引都包含多个文档,而文档则是索引中的最小存储单元。集群由一个唯一的名称来进行标识,节点可以在不同的物理服务器上,也可以在同一台机器上运行。然后,我们使用es.Index方法将其添加到指定的索引中,并指定了该文档的ID。 阅读详情

本文首发于我的个人博客

这是一篇介绍如何利用golang第三方库https://github.com/olivere/elastic进行elasticsearch的操作的文章。
文章中并不会介绍非常详细的API,更侧重于作者在工作中的使用经验和查文档经验。文章中主要包括以下内容:

  1. 作者认为比较重要的API设计理念以及文档查阅方式
  2. 作者在工作中使用到的elasticsearch的实例,包括从接到需求,查阅文档,并实现的过程

API设计理念思考

API的分类

在使用elasticsearch的golang Client过程中,我觉得可以将olivere/elastic的常用API分作三类:

  1. 面向elasticsearch的metadata的Service
  2. 面向elasticsearch的data的Service
  3. 面向Query

而这三类分别对应了对elasticsearch的不同类别的操作:

  1. 面向elasticsearch的metadata的Service,主要是对elasticsearch的metadata进行查询和操作,比如
    • 配置elasticsearch
    • 查询elasticsearch的状态,比如集群状态,节点数目等
  2. 面向elasticsearch的data的Service,住哟是对elasticsearch内的数据和数据格式进行操作
    1. elasticsearch中的index的metadata进行操作,比如
      1. 查询是否存在某个index
      2. 创建并配置index
    2. elasticsearch中的index下的document的增删改操作
  3. 面向Query,主要是对index下的document的查询操作

分类在代码中的体现

首先需要说明,在olivere/elastic的所有操作都是依靠生成一个XXXService对象然后XXXService.Do(ctx)来实现的,这里将他们分成面向Service和面向Query只是表示后者我们的主要精力都会集中在构造Query上

面向elasticsearch的metadata的Service

面向elasticsearch的metadata的Service,一般是通过建立连接的ESClient,新建出查询或者操作所需的Service,而后进行操作的模式

比如如下,查询集群内es节点数

// 建立连接的Client
esClient, _ := elastic.NewClient()
// 新建出用于操作的Service
clusterHealthClient := elastic.NewClusterHealthService(esClient)
// 查询,拿到结果
result, _:= clusterHealthClient.Do(context.Background())
fmt.Println(result.NumberOfNodes)
面向elasticsearch的data的Service

面向elasticsearch的data的Service,一般是通过建立连接的ESClient的成员函数直接取得Service,而后进行操作

比如如下,新建索引

// Create a new index.
mapping := `{
    "settings":{
        "number_of_shards":1,
        "number_of_replicas":0
    },
    "mappings":{
        "properties":{
            "tags":{
                "type":"keyword"
            },
            "location":{
                "type":"geo_point"
            },
            "suggest_field":{
                "type":"completion"
            }
        }
    }
}`
ctx := context.Background()
createIndex, _ := esClient.CreateIndex("twitter").BodyString(mapping).Do(ctx)
fmt.Println(createIndex.Index)
面向Query

面向Query,一般是先新建出Query,而后通过client.Search().Index(index).Query(query).Do(ctx)的方式执行查询操作

比如如下,查询上一个构造的索引中,tags字段含有test的document

query := elastic.NewBoolQuery()
query = query.Must(elastic.NewTermQuery("tags", "test"))
result, _ := esClient.Search().Index("twitter").Query(query).Do(context.Background())

API文档的查询方法

查询olivere/elastic的文档,主要有三个来源:

  1. 项目Wiki https://github.com/olivere/elastic/wiki
  2. 源代码 https://github.com/olivere/elastic
  3. elasticsearch官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

这三者各有特点:

  1. 项目Wiki
    • 优点:简单直接,并且会给出相应的操作的示例代码,上手很快
    • 缺点:示例较简单,且不全面,面对复杂逻辑/特定逻辑很可能缺乏指导性,或者找不到相关文档
  2. 源代码
    • 优点:全面而且本质的东西,掌握了源代码就掌握了一切
    • 缺点:复杂,费力,考虑投入产出比,几乎绝无必要源码级掌握(除非想成为库的开发者)
  3. elasticsearch官方文档
    • 优点:比较齐全的同时仍然是可读性较高的文档,难度在项目Wiki和源代码之间
    • 缺点:没有直接对应到olivere/elastic的API上,找到elasticsearch的API之后,要回头再找olivere/elastic的API

一般的查询方式如下:

  1. 首先明确需求,即到底需要获得elasticsearch的什么信息或者对其进行什么操作
  2. 明确需求后先查阅Wiki,如果有相应的条目,可用的就可以直接用了
  3. Wiki中找不到,那就按照api设计理念思考中描述的进行分类
  4. 分类后有两条路径
    1. 源代码中寻找对应的Service或者Query接口,找到后去elasticsearch文档验证
    2. elasticsearch文档中寻找对应的查询接口,找到后去olivere/elastic中找对应的接口

当然,合理利用其他资源作为文档入口也是有必要的(或许这才是很多人的首选):

  1. Stack Overflow,启动!
  2. 输入关键字查询,能找到合适的问答,就直接采用,不能就返回上述的一般查询方式

使用实例与解决过程

查询集群的健康状态

过程:

  1. 查阅Wiki,没有
  2. 查阅源代码,cluster为关键字查找,找到cluster_health.go,前往注释中指定的elasticsearch文档http://www.elastic.co/guide/en/elasticsearch/reference/7.0/cluster-health.html验证想法
  3. 想法验证成功,编程

实现text类型的字段的模糊查找

过程:

  1. 查找Wiki,没有
  2. 源代码,elasticsearch文档没有“模糊查找”相关的部分
  3. stack overflow 搜索 match part of text,找到使用正则表达式查询RegexQuery的方法
  4. 返回elasticsearch文档验证,验证成功
在优快云学Golang分布式中间件(ElasticSearch) 倒排索引是一种用于快速查找文本中特定单词或短语的数据结构。它将文本中的每个单词或短语与包含该单词或短语的文档列表相关联。这使得可以轻松地查找包含给定单词或短语的所有文档。在 Go 中,可以使用 map 和 slice 来实现倒排索引。具体来说,可以使用一个 map 将每个单词映射到包含该单词的文档列表。这样就可以通过检索特定单词来获取包含该单词的所有文档。另一方面,Lucene 是一个全文搜索引擎库,可用于建立更高效和更复杂的倒排索引。 阅读详情

相关推荐

Go 语言操作 Elasticsearch

本文档将介绍如何使用 Go 语言对 Elasticsearch 进行基本操作。我们将使用第三方库对 Elasticsearch 进行操作。请先确保您已经正确安装了 Go 和 Elasticsearch。

weixin_41974725的博客 604

golang elasticsearch入门教程

golang elasticsearch入门教程目前golang操作elasticsearch的第三方包中最流行的是:https://github.com/olivere/elastic本教程也是基于elastic开发包进行讲解。版本说明golang的elastic开发包和elasticsearch版本有一些对应关系,在开发前需要注意下,必须选择正确的版本,下面是golang elastic开发包...

lxw1844912514的博客 2619

使用 go-elasticsearch 实时同步 MySQL 数据到 ES

当需要把 MySQL 的数据实时同步到 ES 时,为了实现低延迟的检索到 ES 中的数据或者进行其它数据分析处理。本文给出以同步 mysql binlog 的方式实时同步数据到 ES 的思路,实践并验证该方式的可行性,以供参考。...

yonggeit的博客 15万+

Golang使用Elasticsearch

创建es.go文件 根据elasticsearch版本拉取对应的go包:github.com/elastic/go-elasticsearch API文档:https://pkg.go.dev/github.com/elastic/go-elasticsearch/v6@v6.8.5/esapi?tab=doc package es import ( "bytes" "context" "encoding/json" "fmt" "github.com/elastic/go-elasticsea

m0_67391870的博客 2069

从 Java 到 Go:使用 Elasticsearch Go 客户端构建全文搜索引擎

文章存储(Article Storage):用于存储博客文章的数据结构。索引管理器(Index Manager):用于管理 Elasticsearch 索引的创建和删除。搜索服务(Search Service):提供搜索功能,使用 Elasticsearch 进行全文搜索。API 服务(API Service):提供 RESTfulAPI接口,用于创建、删除和搜索博客文章。

斌擎科技 295

【医学影像】超声(UltraSound)影像的增强与目标检测

文章目录1 综述1.1 超声发展简史1.2 超声类型2 超声影像的去噪与增强2.1 各向异性扩散去噪模型2.2 色彩恢复的视网膜增强算法SSR和MSR2.3 MSRCR增强算法(基于MSR算法改进版)2.4 参考文献3 超声影像的目标识别3.1 基于跨模态数据迁移进行DL训练3.2 参考文献 1 综述 因工作需要,最近调研了超声(UltraSound)影像的相关知识,包含超声类型、超声影像的去噪和增强,目标检测等,并对相关资料文献进行梳理整合。 本人另外一篇博文主要讲了UltraSound 影像与CT/MR

muyijames的博客 1万+

mysql+es+go_使用go-mysql-elasticsearch将mysql实时同步到es

注意:mysql binlog必须是ROW模式 ,并且binlog_row_image必须为full要同步的mysql数据表必须包含主键,否则直接忽略不支持程序运行过程中修改表结构要赋予用于连接mysql的账户RELOAD权限以及REPLICATION权限, SUPER权限:GRANT REPLICATION SLAVE ON *.* TO 'elastic'@'127.0.0.1';GRANT ...

weixin_35916466的博客 489

深信服桌面云实战:从零部署到高效运维的关键配置指南

本文提供了一份深信服桌面云从零部署到高效运维的实战指南。内容涵盖项目启动阶段的资源、网络与存储规划,详细演示了VMP与VDC平台的安装与对接,并深入讲解了制作虚拟机模板、配置用户体系、优化终端策略等核心步骤。最后,分享了包括CPU公平分配、智能调度在内的关键性能调优与高阶运维技巧,旨在帮助管理员构建稳定、高效的云桌面环境。

blockchain9miner的博客 451

golang使用es go-elasticsearch template_kubernetes使用 CronJob 运行自动化任务

我们的es集群是跑在kubernetes上的,直接使用crontab去执行索引的方式不太云原生(言必称希腊了),所以打算在kubernetes上运行crontab去实现历史索引的迁移。CronJobs 在创建周期性以及重复性的任务时很有帮助,例如执行备份操作或者发送邮件。CronJobs 也可以在特定时间调度单个任务,例如计划当集群看起来很空闲时 执行某个 Job。参考下官网的cronJob的示例...

weixin_42324002的博客 183

uniapp自定义tabbar闪屏?3步搞定原生tabbar隐藏+自定义占位(附完整代码)

本文针对UniApp开发中自定义TabBar切换页面闪烁的痛点,提供了一套根治方案。通过隐藏原生TabBar并利用自定义组件进行视觉占位,巧妙结合原生切换的无闪烁优势与自定义设计的灵活性。文章详细解析了闪屏根源,并附上完整的page.json配置与代码实现,帮助开发者彻底解决此问题,提升小程序应用质感。

postgres8guard的博客 1529

基于51单片机的通讯聊天系统

通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时

m0_47419053的博客 3638

golang 使用 es 遇到的问题

golang 使用 es 遇到的问题 1.使用Golang客户端连接docker中es报错: no active connection found: no Elasticsearch node available 使用的第三方库:"github.com/olivere/elastic" 节点的 es ip 必须使用 本机ip,不能使用 127.0.0.1 或者 localhost ,其他地方可以不用指定,否则必须显性的指示操作的type es7 type 只能为 _doc 可以省略 3. do

转身那一瞬 718

【 Git学习记录(三)】推荐四款主流的Git代码托管平台 —— GitHub、GitLab、Gitee、Coding

了解过Git之后,作为一个程序猿最基本的,你还需要了解目前主流的在线代码托管平台,并至少选择其中一款在平时开发中使用。这里特别介绍以下四款: 国外平台 GitHub —— 全球最流行的代码托管平台 GitLab —— 基于git的仓库管理程序 国内平台 Gitee —— 开源中国旗下的代码托管平台 Coding —— 支持社交元素的代码托管平台 一. GitHub 链接地址:https://github.com/ GitHub目前是全球最流行的代码托管平台(别称:全球最大的同性交友.

JZevin的博客 6091

go-zero中使用elasticsearch的示例

go-zero中使用elasticsearch的示例:模拟一个常见的业务,就是写入系统日志的功能,在go-zero中将系统日志写入到ES中。文件,这个文件中主要实现ES索引的定义和写入数据、以及查询数据的逻辑。

码农兴哥的技术笔记 1003

实验5 振幅调制(集成乘法器幅度调制电路)

目录5-1 振荡调制的基本工作原理一.振幅调制和调幅波1.普通调幅波(AM)(1)调幅波的表达式、波形(2)调幅波的频谱2.抑制载波双边带调幅(DSB)3.抑制载波单边带调幅(SSB)二.普通调幅波的产生电路三.抑制载波调幅的产生电路5-2 振幅调制实验电路 5-1 振荡调制的基本工作原理 根据电磁波理论知道,只有频率较高的振荡才能被天线有效地辐射。但是人的讲话声音变换为相应电信号的频率较低,不适于直接从天线上辐射。因此,为了传递信息,就必须将要传递的信息“记载”到高频振荡上去。这一“记载”过程称为调

胡毛毛的博客 3万+

一文搞懂 JavaScript 模块化规范:CommonJS、AMD、ES6 Module

在现代 JavaScript 开发中,模块化是提升代码组织性和可维护性的关键。本文深入解析三种主流的模块化规范——CommonJS、AMD 和 ES6 Module。

Allen- 3477

Go项目优化——使用Elasticsearch搜索引擎

go项目——搜索优化: 使用Elasticsearch搜索引擎

脑袋装水的博客 948

ADS基础教程23 - 有限元电磁仿真(FEM)可视化操作

一、引言 二、FEM可视化操作流程1.打开可视化界面2.查看介质的网格3.设置网格颜色4.选择网格5.传感器选择6.编辑传感器7.选择频率8.动画 三、总结介绍了在ADS中如何进行FEM仿真场视图操作过程。

XZ_ZC的博客 1815

golang 使用 elasticsearch ik 分词器

golang 使用 elasticsearch https://github.com/olivere/elastic/wiki https://github.com/olivere/elastic ik分词器 https://github.com/medcl/elasticsearch-analysis-ik 安装 参照词表找对应的 ik 版本 IK version ES version master 7.x -> master 6.x 6.x 5.x 5.x 1.10

转身那一瞬 2198

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

go-elasticsearch 使用指南

本文是 go-elasticsearch 库的使用指南。go-elasticsearch是Elasticsearch 官方提供的 Go 客户端。每个 Elasticsearch 版本会有一个对应的 go-elasticsearch 版本。官方会维护最近的两个主要版本。go-elasticsearch 提供了 Low-level 和 Fully-typed 两套API。本文以 Fully-typed API 为例介绍 go-elasticsearch 的常用方法。

笔记 499

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

golang使用es go-elasticsearch template_一个普通开发者对曾经使用过的swoole和php的感想...

先表明身份,两年phper最近转golang,最近经常看到swoole 的撕逼事件出来发表下个人中肯的看法.三个主流swoole框架我都使用过,第一个使用的es框架的actor组件写游戏服务器,再之后学习了swoft了解到了注解和aop的概念,最后是hyperf,使用起来和laravel很类似文档基本和laravel 一样,前后学习加上使用swoole半年多,对于我的人生的第一门编程语言php我是...

weixin_34501965的博客 409

golang使用es,报错Elasticsearch health check failed

然后又去es管理端看,明明节点是绿色的,估计是golang的这个有问题,时间紧迫,我就直接关掉了健康检测。即在声明es的参数里加上elastic.SetSniff(false)就可以关闭健康检测。今天golang代码里调用es,结果一直报错。

weixin_42094764的博客 1040

[golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

ElasticSearch 全文搜索引擎的基本概念,安装,准备工作,启动,以及Kibana的使用

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 2306

【ElasticSearch】使用docker compose,通过编写yml安装es8.15和kibana可视化界面操作,go连接es

Docker 搭建环境,并在过程中标注常见问题和解决方案。

m0_74282926的博客 1357
上一篇: A New Page In My Life, As A Programmer
下一篇: Vue+Axios自动更新
FitzLeopard
博客等级 码龄9年 6粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值