`

Elasticsearch search after分页检索案例

阅读更多
Elasticsearch search after分页检索案例分享
The best elasticsearch highlevel java rest api-----bboss

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

elasticsearch微信公众号:

1
0
分享到:
评论

相关推荐

    ES深度分页.docx

    ES 深度分页是 Elasticsearch 中的一种分页机制,主要有四种:浅分页、scroll 深分页、search_after 分页和deep pagination。下面将对每种机制进行详细的介绍和分析。 1. 分页概述 ES 中的分页顾名思义,即让我们...

    Java API整合ES实现深分页,高亮等操作.zip

    本压缩包文件"Java API整合ES实现深分页,高亮等操作.zip"可能包含了一个Java应用程序,该程序展示了如何使用Java API来实现Elasticsearch的高级功能,如深度分页和高亮显示。深度分页是指在大数据量下,能够有效地...

    springboot整合es-springboot-elasticsearch.zip

    - 集成Spring Data Elasticsearch的Scroll和SearchAfter功能,实现分页查询 - 使用`@Async`进行异步操作,提高性能 通过以上步骤和高级特性,你可以有效地将SpringBoot应用与Elasticsearch整合,实现高效的数据管理...

    基于Elasticsearch Java API的参考手册

    Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于大数据领域的实时分析和信息检索。Java API是Elasticsearch官方提供的与Elasticsearch服务器进行交互的主要工具,它使得开发者能够用Java...

    000057_ElasticSearch开发规范.docx

    Elasticsearch (ES) 是一个基于 Lucene 的分布式搜索引擎,广泛应用于日志分析、全文检索、实时数据分析等场景。在开发过程中遵循一定的规范可以确保系统的高效稳定运行,防止潜在问题的发生。 1. ES 适用场景 - ...

    elasticsearch demo

    总结来说,这个"elasticsearch demo"涵盖了Elasticsearch的基础和高级特性,是学习和理解如何在实际项目中利用Elasticsearch进行数据检索和分析的好资源。通过深入研究和实践,你将能够熟练地运用Elasticsearch解决...

    EDB数据库分页操作源码

    EDB(Elasticsearch Database)是一种分布式、RESTful风格的搜索和分析引擎,常用于大数据存储、分析和检索。在处理大量数据时,分页操作是必不可少的功能,它可以帮助用户有组织地查看和管理海量信息。本文将深入...

    Lucene5学习之分页查询

    例如,Solr支持`start`和`rows`参数来实现分页,Elasticsearch则有`from`和`size`参数,同时提供了更丰富的分页策略,如`scroll` API。 总结来说,理解和掌握Lucene5中的分页查询对于进行高效全文检索开发至关重要...

    scrollDemo

    在IT行业中,尤其是在大数据检索和分析领域,Elasticsearch(ES)是一个非常重要的工具。它是一个基于Lucene的分布式、RESTful风格的搜索和数据分析引擎,能够提供实时、高可扩展性的全文检索服务。本节将详细讲解...

    面试指南-Lucene:ES篇.md

    ### Lucene与Elasticsearch核心知识点详解 #### 一、倒排索引深入骨髓 **1. 倒排索引的原理及其应用场景** 倒排索引是一种用于快速检索文档的技术,它改变了传统索引从文档指向关键词的方式,转而以关键词指向...

    summer-mall-api

    在Elasticsearch中,`from`和`size`参数用于实现分页,其中`from`表示从哪个位置开始检索,`size`表示每次返回的结果数量。 通常,我们期望第一页的`from`值为0,表示从索引的第一条记录开始,`size`通常设置为每页...

Global site tag (gtag.js) - Google Analytics