最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Elasticsearch 實(shí)現(xiàn)分頁(yè)方式(三種方式)

 更新時(shí)間:2022年07月05日 10:56:55   作者:Java技術(shù)棧  
Elasticsearch是用Java語(yǔ)言開(kāi)發(fā)的,并作為Apache許可條款下的開(kāi)放源碼發(fā)布,是一種流行的企業(yè)級(jí)搜索引擎,這篇文章主要介紹了Elasticsearch實(shí)現(xiàn)分頁(yè)的3種方式,需要的朋友可以參考下

ES 簡(jiǎn)介

Elasticsearch 是一個(gè)基于 Lucene 實(shí)現(xiàn)的搜索服務(wù)器。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch是用Java語(yǔ)言開(kāi)發(fā)的,并作為Apache許可條款下的開(kāi)放源碼發(fā)布,是一種流行的企業(yè)級(jí)搜索引擎。Elasticsearch用于云計(jì)算中,能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定,可靠,快速,安裝使用方便。

ES 的特點(diǎn):

分布式實(shí)時(shí)文件存儲(chǔ),可以將每一個(gè)字段都編入索引,使其可以被檢索

可以作為一個(gè)大型分布式集群(數(shù)百臺(tái)服務(wù)器)技術(shù),處理PB級(jí)數(shù)據(jù)

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

下面介紹下Java中Elasticsearch 實(shí)現(xiàn)分頁(yè)的 3 種方式,還有誰(shuí)不會(huì)??

一、from + size 淺分頁(yè)

"淺"分頁(yè)可以理解為簡(jiǎn)單意義上的分頁(yè)。

它的原理很簡(jiǎn)單,就是查詢前20條數(shù)據(jù),然后截?cái)嗲?0條,只返回10-20的數(shù)據(jù)。這樣其實(shí)白白浪費(fèi)了前10條的查詢。

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

其中,from定義了目標(biāo)數(shù)據(jù)的偏移值,size定義當(dāng)前返回的數(shù)目。默認(rèn)from為0,size為10,即所有的查詢默認(rèn)僅僅返回前10條數(shù)據(jù)。

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

因?yàn)閑s是基于分片的,假設(shè)有5個(gè)分片,from=100,size=10。則會(huì)根據(jù)排序規(guī)則從5個(gè)分片中各取回100條數(shù)據(jù)數(shù)據(jù),然后匯總成500條數(shù)據(jù)后選擇最后面的10條數(shù)據(jù)。

做過(guò)測(cè)試,越往后的分頁(yè),執(zhí)行的效率越低??傮w上會(huì)隨著from的增加,消耗時(shí)間也會(huì)增加。而且數(shù)據(jù)量越大,就越明顯!

二、scroll 深分頁(yè)

from+size查詢?cè)?0000-50000條數(shù)據(jù)(1000到5000頁(yè))以內(nèi)的時(shí)候還是可以的,但是如果數(shù)據(jù)過(guò)多的話,就會(huì)出現(xiàn)深分頁(yè)問(wèn)題。

為了解決上面的問(wèn)題,elasticsearch提出了一個(gè)scroll滾動(dòng)的方式。

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

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表示設(shè)置scroll_id保留5分鐘可用。
  • 使用scroll必須要將from設(shè)置為0。
  • size決定后面每次調(diào)用_search搜索返回的數(shù)量

然后我們可以通過(guò)數(shù)據(jù)返回的_scroll_id讀取下一頁(yè)內(nèi)容,每次請(qǐng)求將會(huì)讀取下10條數(shù)據(jù),直到數(shù)據(jù)讀取完畢或者scroll_id保留時(shí)間截止:

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

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

scroll刪除

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

清除指定的scroll_id

DELETE _search/scroll/DnF1ZXJ5VGhlbkZldGNo.....

清除所有的scroll:

DELETE _search/scroll/_all

三、search_after 深分頁(yè)

scroll 的方式,官方的建議不用于實(shí)時(shí)的請(qǐng)求(一般用于數(shù)據(jù)導(dǎo)出),因?yàn)槊恳粋€(gè) scroll_id 不僅會(huì)占用大量的資源,而且會(huì)生成歷史快照,對(duì)于數(shù)據(jù)的變更不會(huì)反映到快照上。

search_after 分頁(yè)的方式是根據(jù)上一頁(yè)的最后一條數(shù)據(jù)來(lái)確定下一頁(yè)的位置,同時(shí)在分頁(yè)請(qǐng)求的過(guò)程中,如果有索引數(shù)據(jù)的增刪改查,這些變更也會(huì)實(shí)時(shí)的反映到游標(biāo)上。但是需要注意,因?yàn)槊恳豁?yè)的數(shù)據(jù)依賴于上一頁(yè)最后一條數(shù)據(jù),所以無(wú)法跳頁(yè)請(qǐng)求。

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

GET test_dev/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "age": 28
          }
        }
      ]
    }
  },
  "size": 20,
  "from": 0,
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      },
      "_id": {
        "order": "desc"
      }
    }
  ]
}
  • 使用search_after必須要設(shè)置from=0。
  • 這里我使用timestamp和_id作為唯一值排序。
  • 我們?cè)诜祷氐淖詈笠粭l數(shù)據(jù)里拿到sort屬性的值傳入到search_after。

使用sort返回的值搜索下一頁(yè):

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"
      }
    }
  ]
}

到此這篇關(guān)于Elasticsearch 實(shí)現(xiàn)分頁(yè)的 3 種方式,還有誰(shuí)不會(huì)??的文章就介紹到這了,更多相關(guān)Elasticsearch 實(shí)現(xiàn)分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載)

    快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載)

    這篇文章主要介紹了快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • java web用servlet監(jiān)聽(tīng)器實(shí)現(xiàn)顯示在線人數(shù)

    java web用servlet監(jiān)聽(tīng)器實(shí)現(xiàn)顯示在線人數(shù)

    這篇文章主要為大家詳細(xì)介紹了java web用servlet監(jiān)聽(tīng)器實(shí)現(xiàn)顯示在線人數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Java之next()、nextLine()區(qū)別及問(wèn)題解決

    Java之next()、nextLine()區(qū)別及問(wèn)題解決

    這篇文章主要介紹了Java之next()、nextLine()區(qū)別及問(wèn)題解決,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 解決redisTemplate向redis中插入String類型數(shù)據(jù)時(shí)出現(xiàn)亂碼問(wèn)題

    解決redisTemplate向redis中插入String類型數(shù)據(jù)時(shí)出現(xiàn)亂碼問(wèn)題

    這篇文章主要介紹了解決redisTemplate向redis中插入String類型數(shù)據(jù)時(shí)出現(xiàn)亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 使用MQ消息隊(duì)列的優(yōu)缺點(diǎn)詳解

    使用MQ消息隊(duì)列的優(yōu)缺點(diǎn)詳解

    這篇文章主要介紹了使用MQ消息隊(duì)列的優(yōu)缺點(diǎn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • MapStruct升級(jí)遇到的問(wèn)題及解決方案

    MapStruct升級(jí)遇到的問(wèn)題及解決方案

    MapStruct是一個(gè)用于生成類型安全,本文來(lái)介紹一下MapStruct升級(jí)遇到的問(wèn)題及解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • Java內(nèi)存之happens-before和重排序

    Java內(nèi)存之happens-before和重排序

    在JMM(Java內(nèi)存模型)中,如果一個(gè)操作執(zhí)行的結(jié)果需要對(duì)另一個(gè)操作可見(jiàn),那么這兩個(gè)操作之間必須存在happens-before關(guān)系。下面小編來(lái)簡(jiǎn)單介紹一下
    2019-05-05
  • 基于springboot實(shí)現(xiàn)數(shù)據(jù)可視化的示例代碼

    基于springboot實(shí)現(xiàn)數(shù)據(jù)可視化的示例代碼

    本文主要介紹了基于springboot實(shí)現(xiàn)數(shù)據(jù)可視化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-07-07
  • Java數(shù)組擴(kuò)容的三大小結(jié)

    Java數(shù)組擴(kuò)容的三大小結(jié)

    當(dāng)數(shù)組需要容納更多元素時(shí),可以通過(guò)擴(kuò)容來(lái)增加其容量,本文主要介紹了Java數(shù)組擴(kuò)容的三大小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • JAVA生成pdf文件的實(shí)操指南

    JAVA生成pdf文件的實(shí)操指南

    最近項(xiàng)目需要實(shí)現(xiàn)PDF下載的功能,由于沒(méi)有這方面的經(jīng)驗(yàn),從網(wǎng)上花了很長(zhǎng)時(shí)間才找到相關(guān)的資料,下面這篇文章主要給大家介紹了關(guān)于JAVA生成pdf文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10

最新評(píng)論

镇原县| 扶沟县| 光泽县| 阿拉善右旗| 定陶县| 娱乐| 松潘县| 铁力市| 安新县| 西安市| 遂川县| 酒泉市| 晋城| 慈溪市| 蓝山县| 驻马店市| 施甸县| 奉节县| 岳阳县| 柘荣县| 万安县| 周至县| 安乡县| 通海县| 烟台市| 东乌珠穆沁旗| 谷城县| 平定县| 康定县| 理塘县| 甘孜| 栖霞市| 汝阳县| 荆门市| 大悟县| 资兴市| 清丰县| 西和县| 安龙县| 井陉县| 邵阳市|