热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch分页查询策略详解

本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。

Elasticsearch 分页查询概述


在Elasticsearch中,分页查询是一种常见的需求,特别是在处理大量数据时。通常,分页查询的过程如下:



  1. 客户端向集群中的任意节点发送请求。

  2. 该节点将请求转发至各个分片,每个分片返回指定数量的结果。

  3. 节点收集所有分片返回的数据,合并并排序,最后返回给客户端。


当需要获取特定范围的数据时,例如第10条到第20条记录,就需要使用分页查询功能。



'from-size' 浅分页


'from-size'分页是一种简单的分页方式,通过设置'from'参数来指定起始位置,'size'参数来指定返回的记录数。例如,查询前10条记录的请求如下:


{
"from": 0,
"size": 10,
"query": {
"term": {
"user": "kimchy"
}
}
}

这种方式虽然简单,但随着分页深度的增加,性能会显著下降。测试表明,随着'from'值的增大,查询时间也会相应增加,尤其是在数据量较大的情况下。



'scroll' 深分页


'scroll'分页主要用于一次性检索大量数据,类似于数据库中的游标。它通过维护一个快照来记录当前读取的位置,确保后续查询能够快速继续。使用'scroll'时,首先发起一个搜索请求,并获取一个'_scroll_id',之后使用这个ID继续检索:


curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d '{"query": {"match": {"title": "elasticsearch"}}}'

然后使用返回的'_scroll_id'继续检索:


curl -XGET 'localhost:9200/_search/scroll?scroll=1m&scroll_id=c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1'

'_scroll_id'是一个经过Base64编码的字符串,包含了查询的相关信息。'scroll'分页在处理大数据集时表现出色,因为它避免了重复查询和数据剔除的过程。



性能测试


为了比较'from-size'和'scroll'分页的性能,我们进行了如下测试。首先,使用Java客户端初始化Elasticsearch连接:



org.elasticsearch
elasticsearch
5.5.1


private static TransportClient client;
private static String INDEX = "index_name";
private static String TYPE = "type_name";

public static TransportClient init() {
Settings settings = Settings.builder()
.put("client.transport.sniff", true)
.put("cluster.name", "cluster_name")
.build();
client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
return client;
}

public static void main(String[] args) {
TransportClient client = init();
// 使用client执行查询
}

以下是'from-size'分页的测试代码:


System.out.println("from-size模式启动!");
Date begin = new Date();
long count = client.prepareCount(INDEX).setTypes(TYPE).execute().actionGet().getCount();
SearchRequestBuilder requestBuilder = client.prepareSearch(INDEX).setTypes(TYPE).setQuery(QueryBuilders.matchAllQuery());

for (int i = 0, sum = 0; sum SearchResponse respOnse= requestBuilder.setFrom(i * 50000).setSize(50000).execute().actionGet();
sum += response.getHits().hits().length;
System.out.println("总量" + count + " 已经查到" + sum);
}

Date end = new Date();
System.out.println("耗时: " + (end.getTime() - begin.getTime()));

以下是'scroll'分页的测试代码:


System.out.println("scroll模式启动!");
begin = new Date();
SearchResponse scrollRespOnse= client.prepareSearch(INDEX)
.setSearchType(SearchType.SCAN)
.setSize(10000)
.setScroll(TimeValue.timeValueMinutes(1))
.execute().actionGet();
count = scrollResponse.getHits().getTotalHits();

for (int i = 0, sum = 0; sum scrollRespOnse= client.prepareSearchScroll(scrollResponse.getScrollId())
.setScroll(TimeValue.timeValueMinutes(8))
.execute().actionGet();
sum += scrollResponse.getHits().hits().length;
System.out.println("总量" + count + " 已经查到" + sum);
}

end = new Date();
System.out.println("耗时: " + (end.getTime() - begin.getTime()));

测试结果显示,在33万多条数据的情况下,'scroll'分页的性能远优于'from-size'分页。对于大数据量的操作,建议使用'scroll'分页以提高查询效率。


推荐阅读
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • 本文将指导如何在JFinal框架中快速搭建一个简易的登录系统,包括环境配置、数据库设计、项目结构规划及核心代码实现等环节。 ... [详细]
  • 构建Filebeat-Kafka-Logstash-ElasticSearch-Kibana日志收集体系
    本文介绍了如何使用Filebeat、Kafka、Logstash、ElasticSearch和Kibana构建一个高效、可扩展的日志收集与分析系统。各组件分别承担不同的职责,确保日志数据能够被有效收集、处理、存储及可视化。 ... [详细]
  • This pull request introduces the ability to provide comprehensive paragraph configurations directly within the Create Note and Create Paragraph REST endpoints, reducing the need for additional configuration calls. ... [详细]
  • 本文探讨了Jeddict工具的应用价值,特别是在快速构建和部署CRUD服务系统方面的能力。通过介绍其核心功能和优势,以及当前的使用状况,文章还展望了Jeddict未来的改进方向。 ... [详细]
  • mysql 分库分表策略_【数据库】分库分表策略
    关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多, ... [详细]
author-avatar
碳酸钙baby_849
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有