`
qindongliang1922
  • 浏览: 2183779 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117530
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125921
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59896
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71301
社区版块
存档分类
最新评论

如何在elasticsearch里面使用深度分页功能

    博客分类:
  • ELK
阅读更多

前面的文章提到过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),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

0
0
分享到:
评论

相关推荐

    ES深度分页.docx

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

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

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

    PHP中 对es中的数据分页 查询

    同时,确保在处理大量数据时考虑到性能优化,例如使用`scroll` API进行深度分页,避免`from`过大导致的性能下降。 总的来说,PHP与Elasticsearch的集成能帮助开发者高效地处理和查询大数据。通过封装查询类,不仅...

    Java架构直通车——ElasticSearch深度分页解决方案

    总结,Elasticsearch深度分页的问题主要由其分布式和分片的特性导致,可以通过限制分页数、调整设置或使用Scroll API等方法来应对。开发者应当根据实际业务场景选择合适的策略,平衡性能与功能的需求。

    Elasticsearch之分页变量

    遍历文档集的 api,以快照的方式来避免深度分页的问题 – 不能用来做实时搜索,因为数据不是实时的 – 尽量不要使用复杂的 sort 条件,使用 _doc 最高效 – 使用稍微复杂 第一步需要发起1个 scroll search, 如下所...

    PyPI 官网下载 | elasticsearch-dsl-5.3.0.tar.gz

    要使用`elasticsearch-dsl`,首先需要在你的Python环境中安装它,可以通过pip命令完成: ```bash pip install elasticsearch-dsl ``` 安装完成后,在Python代码中导入并初始化Elasticsearch连接: ```python from ...

    java api 检索elasticsearch数据

    - 导出数据:可以使用`Scroll` API进行深度分页遍历所有数据,然后将结果保存到文件或数据库。创建滚动搜索请求,如`SearchResponse response = client.prepareSearch(indexName).setTypes(type).setSearchType...

    Lucene5学习之分页查询

    当处理大量数据时,传统的分页方式可能会遇到效率问题,特别是在处理深度分页(如第几百页)时。这是因为Lucene需要计算所有可能的匹配文档,再从中选择指定范围。为解决这个问题,可以使用`IndexSearcher`的`...

    EDB数据库分页操作源码

    特别是在处理大量数据和深度分页时,`search_after`比`from`和`size`更为高效,因为它避免了重新计算从初始位置到当前页的所有文档。 此外,为了提供更好的用户体验,可以结合前端技术实现无限滚动或懒加载效果,即...

    PyPI 官网下载 | collective.elasticsearch-4.0.0.tar.gz

    《PyPI上的collective.elasticsearch-4.0.0:Python库与Elasticsearch的深度集成》 在Python的世界里,PyPI(Python Package Index)是众多开发者获取和分享开源软件包的重要平台。今天我们将深入探讨PyPI上的一款...

    Java_Elasticsearch在动作书.zip

    《Java Elasticsearch实战》这本书主要探讨了如何利用Java API与Elasticsearch进行深度集成,从而实现高效的数据检索和分析。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于日志分析、...

    分布式存储+Elasticsearch+数据存储技术+分布式缓存避坑

    - **避免深度分页**:深度分页可能会导致性能瓶颈,建议使用 `search_after` API 替代传统的 `from` 和 `size` 参数。 - **优化查询**:避免使用复杂的查询语句,尤其是在处理大规模数据集时。利用缓存和预过滤技术...

    毕业设计-毕设项目:基于Scrapy+ElasticSearch+Django的小型全文搜索引擎

    基于Scrapy、ElasticSearch和Django构建一个小型全文搜索引擎是一个很好的毕业设计项目,它结合了爬虫、搜索引擎和Web开发等多个技术领域。以下是一个可能的项目开发流程: ### 1. 需求分析 - 确定搜索引擎的目标...

    The Do's And Don'ts Of Elasticsearch Scalability And Performance

    在大数据和实时搜索需求日益增长的今天,Elasticsearch作为一款基于Lucene的开源搜索引擎,凭借其强大的搜索能力、高性能和高扩展性,在众多场景下得到了广泛的应用。然而,为了充分利用Elasticsearch的能力并确保...

    elasticsearch-dsl

    这个工具使得开发者能够以Python编程语言的方式与Elasticsearch进行交互,极大地简化了在Python应用中使用Elasticsearch的过程。 **Elasticsearch:分布式搜索引擎** Elasticsearch是一款基于Lucene的开源、分布式...

    ELK芒果日志系统实践.pdf

    - 避免深度分页:ES中的深度分页会消耗大量资源,应该尽量避免。 3. Linux参数优化 Linux作为运行ELK服务的操作系统,其性能参数对整个系统至关重要: - 文件系统优化:例如使用XFS文件系统,它支持大容量存储...

    ES核心知识篇part2

    本知识篇主要涵盖了Elasticsearch(简称ES)的核心概念和技术,包括分布式文档系统、搜索引擎原理、Java API的使用、索引管理和内核优化等方面,旨在帮助读者深入理解并掌握ES在实际应用中的关键技能。 **1. 分布式...

    Python库 | elastic_wikidata-1.0.0-py3-none-any.whl

    2. **查询和检索**:通过Elasticsearch的强大查询功能,"elastic_wikidata"库支持复杂的数据查询,包括基于属性、值或关系的过滤,以及对返回结果的排序和分页。 3. **数据更新和同步**:由于Wikidata数据不断更新...

    面试指南-Lucene:ES篇.md

    - **避免深度分页**:通过scroll search或search after方法减少单次查询返回的文档数量。 - **注意index type的使用**:正确选择index type可以减少不必要的性能损耗。 - **避免使用稀疏数据**:稀疏数据可能导致...

    react-searchkitReactUI组件部件集合

    React-Searchkit是一个专门针对React开发的UI组件库,旨在帮助开发者轻松地构建功能强大的、基于Elasticsearch的搜索界面。这个库提供了各种易于使用的组件,使得用户能够快速构建出美观且响应式的搜索应用。 ### 1...

Global site tag (gtag.js) - Google Analytics