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

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

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

关注我的头条号:@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

    相关推荐

    249个Linux Shell脚本经典案例,拿来即用(附PDF)

    作为一名Linux运维工程师,会写好的脚本不仅能提高工作效率,还能有更多的时间做自己的事。最近在网上冲浪的时候,发现大家对Shell脚本都有“心结”,要么觉得自己写出来不好看,要么根本无从下手。下...

    分享一个实用脚本—centos7系统巡检

    概述这周闲得慌,就根据需求写了差不多20个脚本(部分是之前分享过的做了一些改进),今天主要分享一个给平时运维人员用的centos7系统巡检的脚本,或者排查问题检查系统情况也可以用..实用脚本#!/bi...

    Go 语言 Web 框架 Echo 系列:基础篇—搭建 Echo 开发环境

    工欲善其事必先利其器。我们先搞定Echo环境。Go开发环境这个系列基于Go1.14.4,Linux系统。安装Go的方式有很多,可以在这里https://studygolang.com/...

    连Shell的基本输出都不会,还写什么脚本?echo和printf命令总结

    在Linux系统中使用echo命令和printf命令都可以实现信息的输出功能,下面我们分别看这两个命令的应用案例。echo1.使用echo命令创建一个脚本文件菜单功能描述:echo命...

    在Linux中改变echo输出颜色的方法

    技术背景在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色。例如,在脚本中使用不同颜色区分错误信息、警告信息和正常信...

    Spring框架中applicationContext.xml和spring - servlet.xml的区别

    技术背景在Spring框架里,applicationContext.xml和spring-servlet.xml是两个重要的配置文件。Spring允许在父子层次结构中定义多个上下文,这两个文件在不...

    Tomcat服务器配置与优化:让Java应用飞得更高更远

    Tomcat服务器配置与优化:让Java应用飞得更高更远Tomcat作为一款轻量级且功能强大的开源JavaServlet容器,无疑是许多中小型项目的首选服务器。然而,Tomcat的性能和稳定性并非天...

    分享 5 个正则表达式的实际应用场景案例

    转载说明:原创不易,未经授权,谢绝任何形式的转载在计算机编程的广泛领域中,某些技术具有改变我们如何处理和提取文本内容中信息的能力。在这些强大工具中,正则表达式成为每个开发者工具库中基本且不可或缺的组成...

    最简洁详细的SSM框架整合(ssm框架详细介绍)

    创建项目和SSM框架整合思路一、创建项目因为后面会配置springMVC,所以用IDEA的web骨架创建一个maven项目。创建项目目录如下,同时,项目需要的包和文件已手动创建好了:项目目录上图中,a...

    使用JSP 2避免JSP文件中的Java代码

    技术背景在早期的JSP开发中,使用脚本片段(<%%>、<%!%>、<%=%>)嵌入Java代码是常见做法,但这种方式存在诸多弊端。随着JSP2的出现,标签库...

    微信安卓测试版8.0.28开发者更新内容公布

    IT之家9月7日消息,微信安卓平台迎来了8.0.28测试版更新,相比上一次更新安装包体积有所减小,文件详细信息如下:微信安卓内测版8.0.28(ARM64)安装包文件大小254MB...

    疯传阿里内网的SpringMVC笔记,被一个离职员工泄露,手慢无

    一、简介1.介绍SpringMVC是实现MVC的轻量级Web框架,底层封装了servlet2.特点1.轻量级,简单易学2.约定优于配置3.与Spring兼容性好,无缝结合5.支持直接一个方法对一...

    学习笔记之Struts2—工作原理图(struts1工作原理)

    本文以Struts2的官方工作原理图作为主线讲解(参考部分书籍与视频)1.初始概念struts2是web.xml进行配置的一个过滤器,当web项目启动的时候,这个过滤器就会生效。2.web.xml&l...

    Spring MVC工作流程及请求处理机制全解

    SpringMVC工作流程及请求处理机制全解作为一个Java开发者,你一定对Spring框架有所耳闻。今天我们就来详细聊聊SpringMVC,这是Spring家族中最常用的Web层框架之一。Spr...

    在Javaweb中实现发送简单邮件(java实现邮件收发)

    前言当我们在一个网站中进行注册账户成功后,通常会收到一封来自该网站的邮件。邮件中显示我们刚刚申请的账户和密码以及一些其他的广告信息。在上一篇中用Java实现了发送qq邮件的功能,今天我们来实现一个这样...