文档章节

Elasticsearch search after分页查询案例分享

bboss
 bboss
发布于 04/16 15:33
字数 893
阅读 1457
收藏 5

Elasticsearch search after分页查询案例分享

1.准备工作

参考文档《高性能elasticsearch ORM开发库使用介绍》导入和配置es客户端

2.编写创建索引表和初始化数据方法

创建索引表和初始化数据的组件DocumentCRUD 实现本文不做重点介绍,请访问视频教程了解:

/**
 * 创建索引表并导入测试数据
 */
public void initIndiceAndData(){
   DocumentCRUD documentCRUD = new DocumentCRUD();
   documentCRUD.testCreateIndice();//创建索引表
   documentCRUD.testBulkAddDocuments();//导入测试数据
}

3.定义searchAfter dsl配置文件

新建配置文件-esmapper/searchafter.xml

定义searchAfterDSL

<properties>
    <property name="searchAfterDSL">
        <![CDATA[{
            #*
               以demoId,_uid为searchAfter的分页条件 _uid值格式type#_id 由索引类型加#号加id拼接而成
               如果按照多个字段的值做searchAter分页,则用逗号分隔每个值
            *#
            #if($searchAfterId) ## 第一次检索的时候,没有searchAfterId变量,只有做翻页操作的时候才会传递代表分页起点的searchAfterId变量进来
                 "search_after": [#[demoId],"demo#[searchAfterId,quoted=false,lpad=#]"],
            #end
            "size": $pageSize, ##searchAfter分页每页最多显示的记录条数
            #*
                searchAfter分页检索时,必须用翻页字段作为排序字段,这里是demoId和_uid两个字段,如果是多个字段,则按照searchAfter的顺序来设置对应的排序属性
            *#
            "sort": [
                {"demoId": "asc"},
                {"_uid": "asc"}
            ],
            ## 其他检索条件,按照时间范围查询数据,所有数据按照上面的searchAter机制进行分页
            "query": {
                "bool": {
                    "filter": [
                        {
                            "range": {
                                "agentStarttime": {
                                    "gte": #[startTime],
                                    "lt": #[endTime]
                                }
                            }
                        }
                    ]
                }
            }
        }]]>
    </property>
</properties>

4.定义实现searchAfter的代码

    public void doSeachAfter() throws ParseException {
		//创建加载配置文件的客户端工具,用来检索文档,单实例多线程安全
		ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/searchafter.xml");
		Map params = new HashedMap();//定义检索条件,将dsl中需要的参数放置到params中
		params.put("pageSize",100);
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		params.put("startTime",dateFormat.parse("2017-09-02 00:00:00").getTime());
		params.put("endTime",new Date().getTime());
		//执行查询,demo为索引表,_search为检索操作action
		ESDatas<Demo> esDatas =  //ESDatas包含当前检索的记录集合,最多1000条记录,由dsl中的size属性指定
				clientUtil.searchList("demo/_search",//demo为索引表,_search为检索操作action
						"searchAfterDSL",//esmapper/demo.xml中定义的dsl语句
						params,//变量参数
						Demo.class);//返回的文档封装对象类型
		//获取结果对象列表,最多返回1000条记录
		List<Demo> demos = esDatas.getDatas();
		//获取总记录数
		long totalSize = esDatas.getTotalSize();

		do{
			if(demos != null)
				System.out.println("返回当前页记录数:"+demos.size());
			if(demos != null && demos.size() == 100) { //还有数据,则通过searchAfter继续获取下一页数据
				String searchAfterId = (String) demos.get(99).getId();//获取最后一条记录的_id值
				params.put("searchAfterId", searchAfterId);//设置searchAfterId为分页起点_id值
				long demoId =  demos.get(99).getDemoId();//获取最后一条记录的demoId值
				params.put("demoId", demoId);//设置searchAfterId为分页起点demoId值
				esDatas =  //ESDatas包含当前检索的记录集合,最多1000条记录,由dsl中的size属性指定
						clientUtil.searchList("demo/_search",//demo为索引表,_search为检索操作action
								"searchAfterDSL",//esmapper/demo.xml中定义的dsl语句
								params,//变量参数
								Demo.class);//返回的文档封装对象类型

				demos = esDatas.getDatas();

			}
			else{//如果是最后一页,没有数据返回或者获取的记录条数少于100结束分页操作
				break;
			}
		}while(true);
		System.out.println("总记录数:"+totalSize);

	}

5.通过junit单元测试用例运行案例

	@Test
	public void testSeachAfter() throws ParseException {
		DocumentSearchAfter documentSearchAfter = new DocumentSearchAfter();
		documentSearchAfter.initIndiceAndData();//创建索引表并导入searchAfter分页测试数据
		documentSearchAfter.doSeachAfter();//执行searchAfter分页操作
	}

6.参考文档

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-after.html

案例对应源码工程:

https://gitee.com/bboss/eshelloword

elasticsearch技术交流群:166471282

bboss elasticsearch微信公众号:

bboss微信公众号:bbossgroups

© 著作权归作者所有

共有 人打赏支持
bboss

bboss

粉丝 91
博文 54
码字总数 57173
作品 8
长沙
程序员
加载中

评论(1)

iclubs
iclubs
赞一个
【上海Meetup回放视频+PPT下载整理】Elasticsearch Meetup系列第二期

Elasticsearch Meetup系列第二期活动中,7位来自阿里巴巴、eBay、沪江、携程等知名企业的技术大咖现场分享了集群管理、架构、定制开发、业务支撑的使用经验。以下是此次活动的直播整理。 阿里...

黯灭_邓彬
07/25
0
0
【回放视频+PPT下载整理】Elasticsearch Meetup系列第二期

Elasticsearch Meetup系列第二期活动中,7位来自阿里巴巴、eBay、沪江、携程等知名企业的技术大咖现场分享了集群管理、架构、定制开发、业务支撑的使用经验。以下是此次活动的直播整理。 《利...

a独家记忆
07/24
0
0
当ES赶超Redis,这份ES进修攻略不容错过!

从4月DB-Engines最新发布的全球数据库排名中,我们赫然发现ElasticSearch逆袭超越了Redis,从原先的第9名上升至第8名,而Redis则落后一名,排在了其后。 事实上,这场逆袭并不算太让人意外。...

DBAplus社群
04/15
0
0
Spring Data Elasticsearch介绍

概述 在本文中,我们将以代码为中心,实战的方式探索Spring Data Elasticsearch的基础知识。 我们将展示如何使用Spring Data在Spring应用程序中索引,搜索和查询Elasticsearch - String Data...

无忌
07/26
0
0
spring-data-elasticsearch 基本案例详解(三)

『 风云说:能分享自己职位的知识的领导是个好领导。 』 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+, Spring Data Elasticsearch 1.5+ ,ElasticSearch 2.3.2 本文提纲 一、...

夜黑人模糊灬
05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(二十四)

资源整理。这一次内容有点多,拆为两篇,这一篇主要针对Coding。 Coding: 1.R语言包geex,用于估计参数的框架和来自R中的一组无偏估计方程(即M-估计)的经验夹层协方差矩阵。 geex 2.R语言...

胖胖雕
15分钟前
0
0
Python中使用SQLite

SQLite: SQLite是一种数据库,Python中集成了SQLite3,所以在Python中使用SQLite,可以直接导入SQLite包,不需要做额外的配置。 更多的SQLite简介和相关知识可以查看专门的教程:http://ww...

akane_oimo
17分钟前
0
0
05《Java核心技术36讲》之几种字符串类有什么区别?

一、提出问题 今天,我们来聊聊日常使用的字符串,别看它似乎很简单,但其实字符串几乎在所有编程语言里都是个特殊的存在,因为不管是数量还是体积,字符串都是大多数应用中的重要组成。 今天...

飞鱼说编程
36分钟前
0
0
Univalsal_ImageLoader源码结构与创建者模式 初步小结

最近在回归看Univalsal_ImageLoader源码,本想自己也实现试试写一个,看源码是为了学习看能否使用,助于自己可以写出有自己逻辑结构的代码。 首先我们初始化ImageLoader的配置初始化的时候,...

DannyCoder
今天
0
0
计算卷积神经网络浮点数运算量

前言 本文主要是介绍了,给定一个卷积神经网络的配置之后,如何大概估算它的浮点数运算量。 相关代码:CalFlops,基于MXNet框架的 Scala 接口实现的一个计算MXNet网络模型运算量的demo。 正文...

Ldpe2G
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部