免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

如何解析ElasticSearch分頁方案

本篇文章為大家展示了如何解析ElasticSearch分頁方案,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)臨朐,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

1:from + size 淺分頁

"淺"分頁是最簡單的分頁方案。es會(huì)根據(jù)查詢條件在每一個(gè)DataNode分片中取出from+size條文檔,然后在MasterNode中聚合、排序,再截取size-from的文檔返回給調(diào)用方。當(dāng)頁數(shù)越靠后,也就是from+size越大,es需要讀取的數(shù)據(jù)也就是越大,聚合和排序的時(shí)候處理的數(shù)據(jù)量也越大,此時(shí)會(huì)加大服務(wù)器CPU和內(nèi)存的消耗。

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ù)。

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

2:scroll 深分頁

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

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

scroll 類似于sql中的cursor,使用scroll,每次只能獲取一頁的內(nèi)容,然后會(huì)返回一個(gè)scroll_id。根據(jù)返回的這個(gè)scroll_id可以不斷地獲取下一頁的內(nèi)容,所以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表示設(shè)置scroll_id保留5分鐘可用。

使用scroll必須要將from設(shè)置為0。

size決定后面每次調(diào)用_search搜索返回的數(shù)量

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

GET _search/scroll

{

  "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAJZ9Fnk1d......",

  "scroll": "5m"

}

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

scroll刪除

根據(jù)官方文檔的說法,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

3:search_after 深分頁

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

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

為了找到每一頁最后一條數(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作為唯一值排序。

我們在返回的最后一條數(shù)據(jù)里拿到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"

      }

    }

  ]

}

4:修改默認(rèn)分頁限制值10000

可以使用下面的方式來改變ES默認(rèn)深度分頁的index.max_result_window 最大窗口值

curl -XPUT http://127.0.0.1:9200/my_index/_settings -d '{ "index" : { "max_result_window" : 500000}}'

其中my_index為要修改的index名,500000為要調(diào)整的新的窗口數(shù)。將該窗口調(diào)整后,便可以解決無法獲取到10000條后數(shù)據(jù)的問題。

注意事項(xiàng)

通過上述的方式解決了我們的問題,但也引入了另一個(gè)需要我們注意的問題,窗口值調(diào)大了后,雖然請求到分頁的數(shù)據(jù)條數(shù)更多了,但它是用犧牲更多的服務(wù)器的內(nèi)存、CPU資源來換取的。要考慮業(yè)務(wù)場景中過大的分頁請求,是否會(huì)造成集群服務(wù)的OutOfMemory問題。

5:獲取總數(shù)據(jù)量

修改最大限制值之后確實(shí)可以使from+size查詢到更后面頁的數(shù)據(jù),但是每次查詢得到的總數(shù)量最大任然是10000,要想獲取大于1萬的查詢數(shù)據(jù)量,可以分兩步查詢,第一步使用scroll查詢獲取總數(shù)據(jù)量;第二部使用from+size查詢每頁的數(shù)據(jù),并設(shè)置分頁。這樣即解決了from+size無法查詢10000之后的數(shù)據(jù),也解決了scroll無法跳頁的問題。

使用scroll可能遇到的問題:

Caused by: org.elasticsearch.ElasticsearchException: Trying to create too many scroll contexts. Must be less than or equal to: [500]. This limit can be set by changing the [search.max_open_scroll_context] setting.

這個(gè)報(bào)錯(cuò)是從es的日志文件中查出來的,大致意思是:嘗試創(chuàng)建更多的scroll對象失敗了,scroll對象總數(shù)量應(yīng)該控制在500以內(nèi)。可修改search.max_open_scroll_context的值來改變500這個(gè)閾值。

原因:通過scroll 深分頁可知道,es服務(wù)端會(huì)在內(nèi)存中生成一個(gè)scroll_id對象,并會(huì)為該值指定過期時(shí)間,翻頁的時(shí)候使用scroll_id來獲取下一頁的數(shù)據(jù)。默認(rèn)情況下,一個(gè)實(shí)例下面僅可以創(chuàng)建最多500個(gè)scroll上下文對象,也就是500個(gè)scroll_id。報(bào)此錯(cuò)誤的原因就是創(chuàng)建scroll上下文對象失敗,因?yàn)楫?dāng)前已經(jīng)存在500個(gè)這樣的對象了。

解決辦法:

1:通過觀察可以發(fā)現(xiàn),即使不做任何的處理,過一會(huì)就又可以發(fā)起scroll請求了,這是因?yàn)闀r(shí)間超過了scroll生命周期時(shí)間,scroll對象自己死掉了一些。

2:按照提示說的,修改search.max_open_scroll_context的值

put http://{{es-host}}/_cluster/settings

{

"persistent": {

    "search.max_open_scroll_context": 5000

},

"transient": {

    "search.max_open_scroll_context": 5000

}

}

[圖片上傳失敗...(image-4dc354-1583253824871)]

image.png

3:在使用完scroll_id之后立即調(diào)用刪除接口,刪除該scroll對象

刪除單個(gè)scroll

DELETE http://{{es-host}}/_search/scroll

{

"scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAdsMqFmVkZTBJalJWUmp5UmI3V0FYc2lQbVEAAAAAAHbDKRZlZGUwSWpSVlJqeVJiN1dBWHNpUG1RAAAAAABpX2sWclBEekhiRvpsRktHWXFudnVaQ3dIQQAAAAAAaV9qFnJQRHpIYkVaUkZLR1lxbnZ1WkN3SEEAAAAAAGlfaRZyUER6SGJFWlJGS0dZcW52dVpDd0hB"

}

刪除所有scroll

delete http://{{es-host}}/_search/scroll/_all

上述內(nèi)容就是如何解析ElasticSearch分頁方案,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:如何解析ElasticSearch分頁方案
分享網(wǎng)址:http://m.newbst.com/article4/jesiie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站域名注冊網(wǎng)站營銷品牌網(wǎng)站制作商城網(wǎng)站網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司