elasticsearch學習筆記(二十三)——Elasticsearch 分頁搜索以及深分頁性能問題

在實際應用中,分頁是必不可少的,例如,前端頁面展現數據給用戶每每都是分頁進行展現的。前端

一、ES分頁搜索

Elasticsearch分頁搜索採用的是from+size。from表示查詢結果的起始下標,size表示從起始下標開始返回文檔的個數。
示例:node

GET /test/_search?from=0&size=1

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "field1" : "value1",
          "field2" : "value2"
        }
      }
    ]
  }
}

二、深分頁性能問題

什麼是深分頁(deep paging)?簡單來講,就是搜索的特別深,好比總共有60000條數據,三個primary shard,每一個shard上分了20000條數據,每頁是10條數據,這個時候,你要搜索到第1000頁,實際上要拿到的是10001~10010。性能

注意這裏千萬不要理解成每一個shard都是返回10條數據。這樣理解是錯誤的!spa

下面作一下詳細的分析:
請求首先多是打到一個不包含這個index的shard的node上去,這個node就是一個協調節點coordinate node,那麼這個coordinate node就會將搜索請求轉發到index的三個shard所在的node上去。好比說咱們以前說的狀況下,要搜索60000條數據中的第1000頁,實際上每一個shard都要將內部的20000條數據中的第10001~10010條數據,拿出來,不是才10條,是10010條數據。3個shard的每一個shard都返回10010條數據給協調節點coordinate node,coordinate node會收到總共30030條數據,而後在這些數據中進行排序,根據_score相關度分數,而後取到10001~10010這10條數據,就是咱們要的第1000頁的10條數據。
以下圖所示:
圖片描述code

deep paging問題就是說from + size分頁太深,那麼每一個shard都要返回大量數據給coordinate node協調節點,會消耗大量的帶寬,內存,CPU。blog

相關文章
相關標籤/搜索