文档章节

Elasticsearch search after分页查询案例分享

bboss
 bboss
发布于 04/16 15:33
字数 893
阅读 2140
收藏 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

粉丝 100
博文 58
码字总数 64274
作品 8
长沙
程序员
私信 提问
加载中

评论(1)

iclubs
iclubs
赞一个
Elasticsearch插件一——-head插件安装详解(Elasticsearch教程08)|MVP讲堂

作者:阿里云MVP 铭毅 往期内容: 死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招! Elasticsearch学习,请先看这一篇!(Elasticsearch教程01) Elasticsearch增、删、改、查操...

辰悠
12/14
0
0
Scrapy分布式爬虫打造搜索引擎-(八)elasticsearch结合django搭建搜索引擎

Python分布式爬虫打造搜索引擎 基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站 推荐前往我的个人博客进行阅读:http://blog.mtianyan.cn/ 目录分章效果更佳哦 分章查看...

天涯明月笙
2017/07/01
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
Elastic 在年度用户大会 Elastic{ON} 2018 上发布众多新功能和技术预览

下载超过 2.25 亿次,Elastic 公开 X-Pack 源代码 旧金山 (Elastic{ON} 2018) – 2018 年 2 月 27 日 – Elastic,Elasticsearch 和 Elastic Stack背后的公司,今天宣布其产品累计下载次数达...

Medcl
03/01
0
0
【上海Meetup回放视频+PPT下载整理】Elasticsearch Meetup系列第二期

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

黯灭_邓彬
07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
15分钟前
3
0
vimrc

set rtp+=/usr/local/lib/python3.7/site-packages/powerline/bindings/vim/set laststatus=2set t_Co=256set cursorlinehi cursorline cterm=none term=nonehighlight CursorLine gui......

kut
17分钟前
1
0
ubuntu常用操作

显卡GPU 查看显卡信息sudo lshw -numeric -class video# 查看显卡型号lspci | grep -i nvidia# 查看驱动版本sudo dpkg --list | grep nvidia-*或者 ubuntu-drivers devices#查看显卡...

hc321
昨天
2
0
mysql密码重置

方法一: 在my.ini的[mysqld]字段加入: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 update user set password=pas...

architect刘源源
昨天
7
1
SpringBoot + Mybatis 配置多数据源(Srping boot 二)

前置条件,你已经配置好spring boot+mybatis,可以参考之前的博客 实现逻辑通过注解+aop切面编程来动态更新datasource 第一步,配置多个DataSource server: port: 8080freezing: ...

小海bug
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部