[Mark]解決ElasticSearch深度分頁機制中Result window is too large問題
問題描述
今天在使用ElacticSearch做分頁查詢的時候,遇到一個奇怪的問題,分頁獲取前9999條資料的時候都是正常的,但每次獲取第10000條資料的時候就無法獲取到結果。檢查自己程式碼中的分頁邏輯也未發現什麼問題,於是進行單步除錯,當單步獲取第10000條資料的時候捕捉到了下面的異常:
Failed to execute phase [query_fetch], all shards failed; shardFailures {[1w_m0BF0Sbir4I0hRWAmDA][fuxi_user_feature-2018.01.09][0]: RemoteTransportException[[10.1.113.169][10.1.113.169:9300][indices:data/read/search[phase/query+fetch]]]; nested: QueryPhaseExecutionException[Result window is too large, from + size must be less than or equal to: [10000] but was [10100]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.]; }
解決方案
最後通過查閱瞭解到出現這個問題是由於ElasticSearch的預設 深度翻頁 機制的限制造成的。ES預設的分頁機制一個不足的地方是,比如有5010條資料,當你僅想取第5000到5010條資料的時候,ES也會將前5000條資料載入到記憶體當中,所以ES為了避免使用者的過大分頁請求造成ES服務所在機器記憶體溢位,預設對深度分頁的條數進行了限制,預設的最大條數是10000條,這是正是問題描述中當獲取第10000條資料的時候報Result window is too large
異常的原因。
要解決這個問題,可以使用下面的方式來改變ES預設深度分頁的index.max_result_window
最大視窗值
curl -XPUT http://127.0.0.1:9200/my_index/_settings -d '{ "index" : { "max_result_window" : 500000}}'
- 1
其中my_index為要修改的index名,500000為要調整的新的視窗數。將該視窗調整後,便可以解決無法獲取到10000條後資料的問題。
注意事項
通過上述的方式解決了我們的問題,但也引入了另一個需要我們注意的問題,視窗值調大了後,雖然請求到分頁的資料條數更多了,但它是用犧牲更多的伺服器的記憶體、CPU資源來換取的。要考慮業務場景中過大的分頁請求,是否會造成叢集服務的OutOfMemory問題。在ES的官方文件中對深度分頁也做了討論
https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html
https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html
核心的觀點如下:
Depending on the size of your documents, the number of shards, and the hardware you are using, paging 10,000 to 50,000 results (1,000 to 5,000 pages) deep should be perfectly doable. But with big-enough from values, the sorting process can become very heavy indeed, using vast amounts of CPU, memory, and bandwidth. For this reason, we strongly advise against deep paging.
這段觀點表述的意思是:根據文件的大小,分片的數量以及使用的硬體,分頁10,000到50,000個結果(1,000到5,000頁)應該是完全可行的。 但是,從價值觀上來看,使用大量的CPU,記憶體和頻寬,分類過程確實會變得非常重要。 為此,我們強烈建議不要進行深度分頁。
自己的看法是,ES作為一個搜尋引擎,更適合的場景是使用它進行搜尋,而不是大規模的結果遍歷。 大部分場景下,沒有必要得到超過10000個結果專案, 例如,只返回前1000個結果。如果的確需要大量資料的遍歷展示,考慮是否可以用其他更合適的儲存。或者根據業務場景看能否用ElasticSearch的 滾動API (類似於迭代器,但有時間視窗概念)來替代。
原文地址:https://blog.csdn.net/lisongjia123/article/details/79041402
相關文章
- Java程式碼解決ElasticSearch的Result window is too large問題JavaElasticsearch
- ES報錯Result window is too large問題處理薦
- gunzip時,提示file too large(問題已解決)
- ElasticSearch 深度分頁詳解Elasticsearch
- MySQL、Elasticsearch 深度分頁MySqlElasticsearch
- 處理分頁的result型別問題型別
- nodejs Error: request entity too large解決方案NodeJSError
- Mysql中too many connections問題的解決MySql
- Mysql 報Row size too large 65535解決方法MySql
- Row size too large (> 8126)解決辦法
- MySQL資料庫index column size too large. the maximum column size is 767 bytes問題解決MySql資料庫Index
- Ubuntu 解決 Too many open files 問題Ubuntu
- Windows下ElasticSearch安裝中的問題解決WindowsElasticsearch
- Nginx出現413 Request Entity Too Large錯誤解決方法Nginx
- 分頁機制
- 分頁機制圖文詳解
- File name too long window和linux排查,解決Linux
- 【解決方法】Dubbo報錯Data length too large,調整payload大小解決
- 【問題&解決】手機網頁Html程式碼實現(解決顯示頁面很小的問題)網頁HTML
- 解決WPF中過載Window.OnRender函式失效問題函式
- mysql Index column size too large 超過767錯誤解決方案(轉)MySqlIndex
- insert:key too large to index…Index
- 分頁Bean的同步問題,,請大家幫忙解決Bean
- ElasticSearch實戰系列十一: ElasticSearch錯誤問題解決方案Elasticsearch
- mySql\oracle分頁機制MySqlOracle
- 這種錯誤怎麼解決??pojoService問題,反射機制問題嗎?POJO反射
- 急求:如何使用反射機制解決這個問題!!!???反射
- Oracle分頁查詢中排序與效率問題解決方法詳解Oracle排序
- ElasticSearch第3篇 大資料處理3大問題(“10000條”問題解決方案、hits total值統計總數不精確解決方案、大資料深度分頁效能問題3種最佳化方案)Elasticsearch大資料
- 解決 Specified key was too long ... 767 bytes 的本質問題
- 用nginx的反向代理機制解決前端跨域問題Nginx前端跨域
- oracle 分頁問題Oracle
- Java中關於十進位制數取反問題解決Java
- Elasticsearch 分頁查詢Elasticsearch
- 聊聊 Elasticsearch 中的任務管理機制Elasticsearch
- Elasticsearch 線上實戰問題及解決方案探討Elasticsearch
- ElasticSearch 文件(document)內部機制詳解Elasticsearch
- 解決動靜分離架構後臺重定向頁面問題架構