前面的文章提到过es默认的from+size的分页方式返回的结果数据集不能超过1万点,超过之后返回的数据越多性能就越低。
这是因为es要计算相似度排名,需要排序整个整个结果集,假设我们有一个index它有5个shard,现在要读取1000到1010之间的这10条数据,es内部会在每个shard上读取1010条数据,然后返回给计算节点,这里有朋友可能问为啥不是10条数据而是1010条呢?这是因为某个shard上的10条数据,可能还没有另一个shard上top10之后的数据相似度高,所以必须全部返回,然后在计算节点上,重新对5050条数据进行全局排序,最后在选取top 10出来,这里面排序是非常耗时的,所以这个数量其实是指数级增长的,到后面分页数量越多性能就越下降的厉害,而且大量的数据排序会占用jvm的内存,很有可能就OOM了,这也是为什么es默认不允许读取超过1万条数据的原因。
那么问题来了,我就是想要深度的分页数据应该怎么办? es里面提供了两种方式来读取深度分页的数据:
(1)离线的读取深度分页数据的Scroll方法
(2)能够用于实时和高并发场景的searchAfter方法(5.x之后)
Scroll方式在前面的文章提到过,它通过一次查询请求后维护一个索引快照的search context,然后每次再去批量的读取数据,效率比较高。在5.x之后,还可以通过slice分片来实现并行导出。
它的缺点就是维护一个search context需要占用很多资源,而且在快照建立之后数据变化如删除和更新操作是不能被感知到的,所以不能够用于实时和高并发的场景。
searchAfter的方式通过维护一个实时游标来避免scroll的缺点,它可以用于实时请求和高并发场景。
它的缺点是不能够随机跳转分页,只能是一页一页的向后翻,并且需要至少指定一个唯一不重复字段来排序。
此外还有一个与scorll的不同之处是searchAfter的读取数据的顺序会受索引的更新和删除影响而scroll不会,因为scroll读取的是不可变的快照。
下面来看下如何使用searchAfter:
我们先查询一页数据:
````js
GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"sort": [
{"date": "asc"},
{"_id": "desc"}
]
}
````
注意,上面用了两个字段来排序,第一个是业务字段可能不唯一,但是第二个id字段一定唯一不重复的。只有这样才能确保searchAfter的翻页顺序读取。
另外searchAfter的from字段一定要设置成0,不然会有问题。
第一个请求发出之后,我们需要获取第一个请求里面最后一条的数据的date和id,然后把这个信息传送到下一个批次,依次类推直到把所有的数据处理完。
如下第二个请求的查询体:
````
GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [1463538857, "654323"],
"sort": [
{"date": "asc"},
{"_id": "desc"}
]
}
````
总结:
本篇文章介绍了如何在es里面使用深度分页的功能,并对比了scroll和searchAfter的优缺点及不同之处,了解这些知识之后,我们就可以在适合的场景下正确的选择最优的处理方式。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
ES 深度分页是 Elasticsearch 中的一种分页机制,主要有四种:浅分页、scroll 深分页、search_after 分页和deep pagination。下面将对每种机制进行详细的介绍和分析。 1. 分页概述 ES 中的分页顾名思义,即让我们...
本压缩包文件"Java API整合ES实现深分页,高亮等操作.zip"可能包含了一个Java应用程序,该程序展示了如何使用Java API来实现Elasticsearch的高级功能,如深度分页和高亮显示。深度分页是指在大数据量下,能够有效地...
同时,确保在处理大量数据时考虑到性能优化,例如使用`scroll` API进行深度分页,避免`from`过大导致的性能下降。 总的来说,PHP与Elasticsearch的集成能帮助开发者高效地处理和查询大数据。通过封装查询类,不仅...
总结,Elasticsearch深度分页的问题主要由其分布式和分片的特性导致,可以通过限制分页数、调整设置或使用Scroll API等方法来应对。开发者应当根据实际业务场景选择合适的策略,平衡性能与功能的需求。
遍历文档集的 api,以快照的方式来避免深度分页的问题 – 不能用来做实时搜索,因为数据不是实时的 – 尽量不要使用复杂的 sort 条件,使用 _doc 最高效 – 使用稍微复杂 第一步需要发起1个 scroll search, 如下所...
要使用`elasticsearch-dsl`,首先需要在你的Python环境中安装它,可以通过pip命令完成: ```bash pip install elasticsearch-dsl ``` 安装完成后,在Python代码中导入并初始化Elasticsearch连接: ```python from ...
- 导出数据:可以使用`Scroll` API进行深度分页遍历所有数据,然后将结果保存到文件或数据库。创建滚动搜索请求,如`SearchResponse response = client.prepareSearch(indexName).setTypes(type).setSearchType...
当处理大量数据时,传统的分页方式可能会遇到效率问题,特别是在处理深度分页(如第几百页)时。这是因为Lucene需要计算所有可能的匹配文档,再从中选择指定范围。为解决这个问题,可以使用`IndexSearcher`的`...
特别是在处理大量数据和深度分页时,`search_after`比`from`和`size`更为高效,因为它避免了重新计算从初始位置到当前页的所有文档。 此外,为了提供更好的用户体验,可以结合前端技术实现无限滚动或懒加载效果,即...
《PyPI上的collective.elasticsearch-4.0.0:Python库与Elasticsearch的深度集成》 在Python的世界里,PyPI(Python Package Index)是众多开发者获取和分享开源软件包的重要平台。今天我们将深入探讨PyPI上的一款...
《Java Elasticsearch实战》这本书主要探讨了如何利用Java API与Elasticsearch进行深度集成,从而实现高效的数据检索和分析。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于日志分析、...
- **避免深度分页**:深度分页可能会导致性能瓶颈,建议使用 `search_after` API 替代传统的 `from` 和 `size` 参数。 - **优化查询**:避免使用复杂的查询语句,尤其是在处理大规模数据集时。利用缓存和预过滤技术...
基于Scrapy、ElasticSearch和Django构建一个小型全文搜索引擎是一个很好的毕业设计项目,它结合了爬虫、搜索引擎和Web开发等多个技术领域。以下是一个可能的项目开发流程: ### 1. 需求分析 - 确定搜索引擎的目标...
在大数据和实时搜索需求日益增长的今天,Elasticsearch作为一款基于Lucene的开源搜索引擎,凭借其强大的搜索能力、高性能和高扩展性,在众多场景下得到了广泛的应用。然而,为了充分利用Elasticsearch的能力并确保...
这个工具使得开发者能够以Python编程语言的方式与Elasticsearch进行交互,极大地简化了在Python应用中使用Elasticsearch的过程。 **Elasticsearch:分布式搜索引擎** Elasticsearch是一款基于Lucene的开源、分布式...
- 避免深度分页:ES中的深度分页会消耗大量资源,应该尽量避免。 3. Linux参数优化 Linux作为运行ELK服务的操作系统,其性能参数对整个系统至关重要: - 文件系统优化:例如使用XFS文件系统,它支持大容量存储...
本知识篇主要涵盖了Elasticsearch(简称ES)的核心概念和技术,包括分布式文档系统、搜索引擎原理、Java API的使用、索引管理和内核优化等方面,旨在帮助读者深入理解并掌握ES在实际应用中的关键技能。 **1. 分布式...
2. **查询和检索**:通过Elasticsearch的强大查询功能,"elastic_wikidata"库支持复杂的数据查询,包括基于属性、值或关系的过滤,以及对返回结果的排序和分页。 3. **数据更新和同步**:由于Wikidata数据不断更新...
- **避免深度分页**:通过scroll search或search after方法减少单次查询返回的文档数量。 - **注意index type的使用**:正确选择index type可以减少不必要的性能损耗。 - **避免使用稀疏数据**:稀疏数据可能导致...
React-Searchkit是一个专门针对React开发的UI组件库,旨在帮助开发者轻松地构建功能强大的、基于Elasticsearch的搜索界面。这个库提供了各种易于使用的组件,使得用户能够快速构建出美观且响应式的搜索应用。 ### 1...