百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Go 程序利用 ElasticSearch 游标 Scroll 实现海量数据分页查询

xsobi 2024-11-26 10:13 21 浏览

关注我的头条号:@Wooola,10 年 Java 软件开发及架构设计经验,专注于 Java、Go 语言、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。

环境准备

  • ElasticSearch v6 集群环境
  • ES 第三方包
    1. github.com/olivere/elastic 文档以及测试用例比 go-elasticsearch 丰富
    2. github.com/elastic/go-elasticsearch

    本文 olivere/elastic 包进行 es 开发。

    ElasticSearch 配置读取

    编写 conf.ini 配置文件,添加 elasticsearch 集群地址

    Bash
    [ES]
    EsAddrs = http://node1:9200,http://node2:9200,http://node3:9200

    定义 EsConf 结构体

    Bash
    EsConf struct {
    		EsAddrs string
    }

    init 方法中,利用 goconfig 读取 confPath 参数指定的 conf.ini 配置文件路径。

    func init() {
    	var (
    		iniF string
    	)
    	flag.StringVar(&iniF, "confPath", "d:/conf.ini", "Set Configuration File")
    	flag.Parse()
    	var err error
    	IniF, err = goconfig.LoadConfigFile(iniF)
    	if err != nil {
    		os.Exit(1)
    	}
    	log.Println("Load conf.ini Success!")
    } 

    main 方法中读取 EsAddrs 参数值。

    EsConf := &conf.EsConf{
    		EsAddrs: GetStringValue(EsSection, EsAddrs, ""),
    	}
    
    func GetStringValue(section string, key string, defValue string) (r string) {
    	val, err := IniF.GetValue(section, key)
    	if err != nil {
    		return defValue
    	}
    	return val
    }

    初始化 elasticsearch 客户端实例。

    EsClient, err = NewClient()
    if err != nil {
    		panic(err)
    }
    
    func NewClient() (*elastic.Client, error) {
    	esConf := EsConf
    	if len(esConf.EsAddrs) == 0 {
    		panic("EsAddrs is Empty!")
    	}
    	esAddrs := strings.Split(esConf.EsAddrs, ",")
    	client, err := elastic.NewClient(elastic.SetURL(esAddrs...))
    	log.Println("ES initial successful!")
    	return client, err
    }

    ElasticSearch 游标(Scroll)分页

    时间查询需求:

    例如,查询  到 

    对应 es 时间格式为:

    # 开始时间
    st := 20171027000000
    # 结束时间
    et :=20200328235959

    初始化游标查询,设置游标每次查询 size 大小:5000 条,注意 sort 排序时,必须是 字段 + .keyword,否则查询会报错。

    boolQry := elastic.NewBoolQuery()
    boolQry.Must(elastic.NewRangeQuery("updateDate").From(st).To(et))
    res, err := EsClient.Scroll().Index(EsHisPendDB).Type(EsHisPendType).
    			Query(boolQry).
    			Sort("updateDate.keyword", false).
    			Scroll("5m").
    			Size(Conf.ExpConf.ExpPageSize).
    			Do(context.Background())
    
    # 抽取数据
    
    
    pendingList := extractPendList(*res.Hits)

    使用 for 循环读取所有数据,直到 len(res.Hits.Hits) 大小为 0,说明 elasticsearch 查询读取完毕,停止 for 循环。

    for {
    			res, err := EsClient.Scroll("1m").ScrollId(scrollId).Do(context.TODO())		 
    			pendingList := extractPendList(*res.Hits)			 
    }
    if len(res.Hits.Hits) <= 0 {
    				break
    			}

    输出效果

    其中使用 Scroll 游标第一次查询会产生 SrcollID 值。

    DnF1ZXJ5VGhlbkZldGNoBQAAAAAABDKbFldaYi1nOUhBVF8yZHNfZkJISllSMEEAAAAAAAMrlhZMRWZNdVlNaFFiQ1pjdkFiNHBrMW1BAAAAAAAEMpwWV1piLWc5SEFUXzJkc19mQkhKWVIwQQAAAAAABDKdFldaYi1nOUhBVF8yZHNfZkJISllSMEEAAAAAAAMwQhY4YUFDNVNVNlJsRzc4NFVYRnRyZ2xB

    相关推荐

    给织梦栏目增加链接属性rel、nofollow和target

    摘要:为了方便管理,直接在织梦后台栏目里自由把控每个栏目对应的链接属性,我们来给织梦栏目增加链接属性rel="nofllow"rel="external"rel=&...

    Rust+Tauri2+React+TS剪切板管理桌面端应用开发示例

    随着Tauri2.0的发布,Tauri越来越值得关注,当然与名气更大的Electron相比仍有差距,但因其有Rust加持,仍表现出很大潜力,如果想开发【小而美】的桌面端App,Tauri是个不错的选择...

    宇宙厂:为什么前端要了解 Interaction to Next Paint (INP)

    大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!2024年3月,Interactio...

    前端知识分享:vue3中,v-model核心用法

    本文讲一下:在vue中,用于组件双向绑定的语法,v-model。什么是组件呢?简单来说,就是拼接成网页的一个个元素。我们制作网页就跟搭积木一样,这放一个button,那放一个表单,这放一个div,那...

    前端入门——html 表单

    前言前面已经学习相关html大部分知识,基本上可以制作出简单的页面,但是这些页面都是静态的,一个网站如果要实现用户的互动交流,这时表单就起到关键的作用,表单的用途很多,它主要用来收集用户的相关信息,是...

    web前端Jquery学习笔记一

    学习大纲一、了解Jquery1.什么是jqueryJquery是一款优秀的JavaScript框架,它是一个轻量的JS库,它兼容CSS3,还兼容各种浏览器(IE6.0+,火狐1.5+,谷歌,safa...

    做个简单的本地弹幕播放器

    前言本文仅仅是做一个简单的弹幕播放器本文弹幕播放器仅仅是演示一下发送弹幕功能请跳转本文底部的在线调试代码进行调试最终实现效果如下:Okay.首先你得找到一个弹幕开源库就是这个啦:https://git...

    RocketMQ源码分析七之创建ConsumerGroup

    在本章中,我们将分析RocketMQ是如何创建订阅组的。看看RocketMQ是如何实现的。如何开启&关闭在部署RocketMQ的Broker的时候,我们通常都会把autoC...

    「春运专题」“春运倒计时第二天”(教你如何抢下铺)

    工具/原料360极速浏览器方法/步骤在电脑上运行360极速浏览器,如果电脑中没有,不仿装一个试试。进入12306网站主页面。在订票中选中要坐的车次和日期,之后点击“预订”进入登录页面;按提示完成登录操...

    初识HTML——列表标签和表单标签

    列表标签在html中列表分为无序列表、有序列表和自定义列表(项目列表)。接下来就看看他们有什么不同吧!作用:如果说table标签是用来显示数据的,那么列表标签就是用来进行html页面布局的。无序列表语...

    注册windows系统服务

    一、把任意exe程序注册成windows系统服务1、方法一:使用windows自带的命令InstallUtil.exe步骤:运行--〉cmd:打开cmd命令框,在命令行里定位到InstallUtil...

    DeepSeek火爆全网!我用它做个数学计算题生成器

    作为一名家长,你是否曾为孩子的数学作业头疼不已?每天都要手动出题,检查答案,费时费力。最近,我借助DeepSeek的帮助,开发了一个简单实用的“数学计算题生成器”,彻底解决了这个问题!现在,我将分...

    “五一”假期火车票抢票攻略:如何在12306网站选择上中下铺

    目前,火车票预售期为60天计算,准备“五一”小长假铁路出行的旅客今天可以购票了。记者从北京铁路局获悉,今天(3月3日)起,电话订票与互联网同时发售5月1日之前(含1日)的车票;也就是说3月3日-5日,...

    【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> swiper

    目录1->创建Swiper组件2->添加属性3->设置样式4->绑定事件5->场景示例编辑1->创建Swiper组件在pages/index...

    表单元素之选择类型

    表单元素的选择类型可以分为三种:单选多选下拉单选和复选框的属性值可以有两个:disabled(不可操作的)和checked。下拉框的属性值可以是:selected(默认选中)、multiple(...