日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何在Elasticsearch中进行深分页

發布時間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在Elasticsearch中进行深分页 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何在Elasticsearch中進行深分頁

業務背景

在傳統業務系統中,一個常見的信息展現方式就是“分頁列表”,隨著數據量的增大,就會遇到“深分頁”問題。比如用戶一頁一頁的翻,一直翻到第5萬頁。比如導出全部列表數據到excel,實現時一頁一頁的把數據追加到excel,直到導出全部數據。“深分頁”通常的一個問題就是:隨著頁數越來越大,ES或者關系數據庫響應越來越慢,甚至內存溢出OOM!其中的原理是什么呢?如何在ES中進行深分頁呢?

技術原理

  • 分頁的本質
    分頁的本質是從“大的數據集”中取出一部分。比如10000條記錄,每頁10條數據。取第二頁即第11條到20條數據。ES或者數據庫怎么知道哪些數據是第二部分(第2頁),哪些是第三部分(第3頁)呢?答案是ES或者數據庫不知道,所以正確的分頁必須要指定分頁的順序,即要有order by或者sort語句

  • 單機數據庫系統分頁
    單機數據庫系統有一種分頁實現叫做“先正序排后倒排序排”。即先對"offset+limit"的數據集根據order字段正序排列,然后再倒序找到limit條數據。

  • 分布式數據庫系統分頁

分布式數據庫系統相對于單機數據庫系統,在各個節點取出limit條數據后,還要將各個節點的"limit"條數據匯總到master節點。由master節點對limit*N(節點數)再排序,找到最終的limit條數據返回給應用程序。所以在深分頁時,offset+limit過大,要排序的數據過多,對于內存分頁數據庫很容易超過進程的內存限制,產生OOM!

分頁方式

在ES中有三種方式可以實現分頁:from+size、scroll、search_after

  • from+size
    ES的標準分頁方法是from+size。from相當于postgresql的offset,size相當于limit的作用。每頁10條數據,獲取第11頁的數據,其語法如下:
POST rzfx-sqlinfo/sqlinfo/_search {"query": {"bool": {"must": [{"term": {"architect.keyword": {"value": "郭鋒"}}},{"range": {"NRunTime": {"lte": 100}}}]}},"size": 10,"from": 100 }

ES為了保證分頁不占用大量的堆內存,避免OOM,參數 index.max_result_window 設置了 from+size的最大值為10000。即每頁10條的話,最多可以翻到1000頁。index的全部參數可以通過以下語句查看:

GET /rzfx-sqlinfo/_settings?flat_settings=true&include_defaults=true

對于結構比較簡單、size比較小的文檔,可以適當的擴大index.max_result_window參數,部分實現深分頁。

  • scroll

  • search_after

最佳實踐

轉載于:https://www.cnblogs.com/wangzhen3798/p/10070977.html

總結

以上是生活随笔為你收集整理的如何在Elasticsearch中进行深分页的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。