中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Elasticsearch實現分頁的方法有哪些

發布時間:2022-07-05 13:51:50 來源:億速云 閱讀:430 作者:iii 欄目:開發技術

這篇文章主要介紹“Java中Elasticsearch實現分頁的方法有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java中Elasticsearch實現分頁的方法有哪些”文章能幫助大家解決問題。

    ES 簡介

    Elasticsearch 是一個基于 Lucene 實現的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch是用Java語言開發的,并作為Apache許可條款下的開放源碼發布,是一種流行的企業級搜索引擎。Elasticsearch用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。

    ES 的特點:

    分布式實時文件存儲,可以將每一個字段都編入索引,使其可以被檢索

    可以作為一個大型分布式集群(數百臺服務器)技術,處理PB級數據

    Elasticsearch不是什么新技術,主要是將全文檢索、數據分析以及分布式技術,合并在了一起,才形成了獨一無二的ES。

    一、from + size 淺分頁

    "淺"分頁可以理解為簡單意義上的分頁。

    它的原理很簡單,就是查詢前20條數據,然后截斷前10條,只返回10-20的數據。這樣其實白白浪費了前10條的查詢。

    GET test_dev/_search
    {
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "age": 28
              }
            }
          ]
        }
      },
      "size": 10,
      "from": 20,
      "sort": [
        {
          "timestamp": {
            "order": "desc"
          },
          "_id": {
            "order": "desc"
          }
        }
      ]
    }

    其中,from定義了目標數據的偏移值,size定義當前返回的數目。默認from為0,size為10,即所有的查詢默認僅僅返回前10條數據。

    在這里有必要了解一下from/size的原理:

    因為es是基于分片的,假設有5個分片,from=100,size=10。則會根據排序規則從5個分片中各取回100條數據數據,然后匯總成500條數據后選擇最后面的10條數據。

    做過測試,越往后的分頁,執行的效率越低。總體上會隨著from的增加,消耗時間也會增加。而且數據量越大,就越明顯!

    二、scroll 深分頁

    from+size查詢在10000-50000條數據(1000到5000頁)以內的時候還是可以的,但是如果數據過多的話,就會出現深分頁問題。

    為了解決上面的問題,elasticsearch提出了一個scroll滾動的方式。

    scroll 類似于sql中的cursor,使用scroll,每次只能獲取一頁的內容,然后會返回一個scroll_id。根據返回的這個scroll_id可以不斷地獲取下一頁的內容,所以scroll并不適用于有跳頁的情景。

    GET test_dev/_search?scroll=5m
    {
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "age": 28
              }
            }
          ]
        }
      },
      "size": 10,
      "from": 0,
      "sort": [
        {
          "timestamp": {
            "order": "desc"
          },
          "_id": {
            "order": "desc"
          }
        }
      ]
    }
    • scroll=5m表示設置scroll_id保留5分鐘可用。

    • 使用scroll必須要將from設置為0。

    • size決定后面每次調用_search搜索返回的數量

    然后我們可以通過數據返回的_scroll_id讀取下一頁內容,每次請求將會讀取下10條數據,直到數據讀取完畢或者scroll_id保留時間截止:

    GET _search/scroll
    {
      "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAJZ9Fnk1d......",
      "scroll": "5m"
    }

    注意:請求的接口不再使用索引名了,而是 _search/scroll,其中GET和POST方法都可以使用。

    scroll刪除

    根據官方文檔的說法,scroll的搜索上下文會在scroll的保留時間截止后自動清除,但是我們知道scroll是非常消耗資源的,所以一個建議就是當不需要了scroll數據的時候,盡可能快的把scroll_id顯式刪除掉。

    清除指定的scroll_id

    DELETE _search/scroll/DnF1ZXJ5VGhlbkZldGNo.....

    清除所有的scroll:

    DELETE _search/scroll/_all

    三、search_after 深分頁

    scroll 的方式,官方的建議不用于實時的請求(一般用于數據導出),因為每一個 scroll_id 不僅會占用大量的資源,而且會生成歷史快照,對于數據的變更不會反映到快照上。

    search_after 分頁的方式是根據上一頁的最后一條數據來確定下一頁的位置,同時在分頁請求的過程中,如果有索引數據的增刪改查,這些變更也會實時的反映到游標上。但是需要注意,因為每一頁的數據依賴于上一頁最后一條數據,所以無法跳頁請求。

    為了找到每一頁最后一條數據,每個文檔必須有一個全局唯一值,官方推薦使用 _uid 作為全局唯一值,其實使用業務層的 id 也可以。

    GET test_dev/_search
    {
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "age": 28
              }
            }
          ]
        }
      },
      "size": 20,
      "from": 0,
      "sort": [
        {
          "timestamp": {
            "order": "desc"
          },
          "_id": {
            "order": "desc"
          }
        }
      ]
    }
    • 使用search_after必須要設置from=0

    • 這里我使用timestamp和_id作為唯一值排序。

    • 我們在返回的最后一條數據里拿到sort屬性的值傳入到search_after

    使用sort返回的值搜索下一頁:

    GET test_dev/_search
    {
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "age": 28
              }
            }
          ]
        }
      },
      "size": 10,
      "from": 0,
      "search_after": [
        1541495312521,
        "d0xH6GYBBtbwbQSP0j1A"
      ],
      "sort": [
        {
          "timestamp": {
            "order": "desc"
          },
          "_id": {
            "order": "desc"
          }
        }
      ]
    }

    關于“Java中Elasticsearch實現分頁的方法有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    阳高县| 历史| 古浪县| 通城县| 集安市| 嵊州市| 九江县| 崇州市| 宜都市| 临漳县| 都兰县| 西充县| 潍坊市| 台南县| 景洪市| 江阴市| 丰都县| 乌兰浩特市| 临夏县| 渝中区| 集贤县| 平果县| 礼泉县| 佛学| 紫云| 武宁县| 瑞昌市| 从化市| 天柱县| 陵水| 安西县| 东丽区| 长岛县| 太康县| 忻城县| 东乡县| 阜阳市| 拜泉县| 昭通市| 双鸭山市| 甘孜|