1. 程式人生 > >elasticsearch核心知識--30.分頁搜尋以及deep paging效能問題深度理解和es中聚合aggregation的分組可能結果不準確的原因

elasticsearch核心知識--30.分頁搜尋以及deep paging效能問題深度理解和es中聚合aggregation的分組可能結果不準確的原因

如何使用es進行分頁搜尋的語法  [size,from]
GET /_search?size=10
GET /_search?size=10&from=0
GET /_search?size=10&from=20
GET /test_index/test_type/_search
"hits": {
    "total": 9,
    "max_score": 1,
我們假設將這9條資料分成3頁,每一頁是3條資料,來實驗一下這個分頁搜尋的效果

GET /test_index/test_type/_search?from=0&size=3
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 9,
    "max_score": 1,
    "hits": [
      {
        "_index": "test_index",
        "_type": "test_type",
        "_id": "8",
        "_score": 1,
        "_source": {
          "test_field": "test client 2"
        }
      },
      {
        "_index": "test_index",
        "_type": "test_type",
        "_id": "6",
        "_score": 1,
        "_source": {
          "test_field": "tes test"
        }
      },
      {
        "_index": "test_index",
        "_type": "test_type",
        "_id": "4",
        "_score": 1,
        "_source": {
          "test_field": "test4"
        }
      }
    ]
  }
}
第一頁:id=8,6,4
GET /test_index/test_type/_search?from=3&size=3
第二頁:id=2,自動生成,7
GET /test_index/test_type/_search?from=6&size=3
第三頁:id=1,11,3
##########重要::什麼是deep paging問題?

為什麼會產生這個問題,它的底層原理是什麼?

deep paging效能問題,以及原理深度。

1.必須1頁10條,當我們取第1000頁時,在es底層也是需要在每個分片【不限主備shard】取出滿足條件的 10010條資料,

如果三個shard ,那麼總共在coordination中會load出10010*3=30030條資料,進行排序。然後取出對應的1000頁的10條資料。儘量避免深度分頁,因為會出現消耗大量的IO 記憶體 cpu,已經會頻繁出現gc。

2.想到了es的aggregation的聚合分組, 如果原始資料中存在10個組,只需要查詢統計出三個組。那麼會出現資料不準確的問題. 因為會去每個分片中進行分組統計,每個分片中前TopN=Top3會出現 被收集到coordination中 ,再進行聚合排序。再取出前三個組的統計結果。但是可能在每個分片查詢時,最終的TopN的資料,排名在3名以上,那麼那部分的資料不會被統計進來。所以對aggregation的分組 如果想資料完全正確,要麼是單shard的索引。要麼時查處全部的分組後,在取前TopN的分組進行統計。