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

python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式

 更新時(shí)間:2020年07月31日 09:56:39   作者:禰唿  
這篇文章主要介紹了python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

使用ES做搜索引擎拉取數(shù)據(jù)的時(shí)候,如果數(shù)據(jù)量太大,通過傳統(tǒng)的from + size的方式并不能獲取所有的數(shù)據(jù)(默認(rèn)最大記錄數(shù)10000),因?yàn)殡S著頁(yè)數(shù)的增加,會(huì)消耗大量的內(nèi)存,導(dǎo)致ES集群不穩(wěn)定。因此延伸出了scroll,search_after等翻頁(yè)方式。

一、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/_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ù)。

做過測(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ù)過多的話,就會(huì)出現(xiàn)深分頁(yè)問題。為了解決上面的問題,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è)的情景。

# -*- coding: utf-8 -*-
# @Time : 
# @Author :
 
from elasticsearch import Elasticsearch
 
es = Elasticsearch(hosts="ip:9200", timeout=20, max_retries=10, retry_on_timeout=True)
 
# Elasticsearch 需要保持搜索的上下文環(huán)境多久 游標(biāo)查詢過期時(shí)間為10分鐘(10m)
page = es.search(
    index="source_keyword_message", doc_type="source_keyword_message",
    scroll='10m',
    size=100,
    body={
     "query": {"match_all": {}},
    }
   )
# 游標(biāo)用于輸出es查詢出的所有結(jié)果
sid = page['_scroll_id']
# es查詢出的結(jié)果總量
scroll_size = page['hits']['total']
# es查詢出的結(jié)果第一頁(yè)
datas = page.get('hits').get('hits')
 
while (scroll_size > 0):
  page = es.scroll(scroll_id=sid, scroll='5m')
  sid = page['_scroll_id']
  scroll_size = len(page['hits']['hits'])
  datas = page.get('hits').get('hits')
  
  
  1. scroll=5m表示設(shè)置scroll_id保留5分鐘可用。
  2. 使用scroll必須要將from設(shè)置為0。默認(rèn)0
  3. size決定后面每次調(diào)用_search搜索返回的數(shù)量

三、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ù)來確定下一頁(yè)的位置,同時(shí)在分頁(yè)請(qǐng)求的過程中,如果有索引數(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/_search
{
 "query": {
 "bool": {
  "filter": [
  {
   "term": {
   "age": 28
   }
  }
  ]
 }
 },
 "size": 20,
 "from": 0,
 "sort": [
 {
  "timestamp": {
  "order": "desc"
  },
  "_id": {
  "order": "desc"
  }
 }
 ]
}
  1. 使用search_after必須要設(shè)置from=0。
  2. 這里我使用timestamp和_id作為唯一值排序。
  3. 我們?cè)诜祷氐淖詈笠粭l數(shù)據(jù)里拿到sort屬性的值傳入到search_after。

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

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

 到此這篇關(guān)于python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式的文章就介紹到這了,更多相關(guān)python elasticsearch 翻頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何以Winsows Service方式運(yùn)行JupyterLab

    如何以Winsows Service方式運(yùn)行JupyterLab

    這篇文章主要介紹了如何以Winsows Service方式運(yùn)行JupyterLab的教程
    2020-08-08
  • Python常見的pandas用法demo示例

    Python常見的pandas用法demo示例

    這篇文章主要介紹了Python常見的pandas用法,結(jié)合實(shí)例形式總結(jié)分析了Python使用pandas模塊的常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • python 根據(jù)pid殺死相應(yīng)進(jìn)程的方法

    python 根據(jù)pid殺死相應(yīng)進(jìn)程的方法

    下面小編就為大家?guī)硪黄猵ython 根據(jù)pid殺死相應(yīng)進(jìn)程的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Numpy的np.random隨機(jī)模塊詳解

    Numpy的np.random隨機(jī)模塊詳解

    這篇文章主要介紹了Numpy的np.random隨機(jī)模塊詳解,平時(shí)都會(huì)使用到隨機(jī)模塊,一般是torch.random或者是numpy.random,有或者是直接使用ramdom這個(gè)python內(nèi)置的工具包,那么下面就簡(jiǎn)單記錄一下numpy.random常用的函數(shù),需要的朋友可以參考下
    2023-08-08
  • Python為何不能用可變對(duì)象作為默認(rèn)參數(shù)的值

    Python為何不能用可變對(duì)象作為默認(rèn)參數(shù)的值

    這篇文章主要介紹了Python為何不能用可變對(duì)象作為默認(rèn)參數(shù)的值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python區(qū)塊鏈交易類教程

    Python區(qū)塊鏈交易類教程

    這篇文章主要為大家介紹了Python區(qū)塊鏈交易類的示例詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 只用50行Python代碼爬取網(wǎng)絡(luò)美女高清圖片

    只用50行Python代碼爬取網(wǎng)絡(luò)美女高清圖片

    第一次寫文章,技術(shù)不成熟之處望各位大神輕噴,今天教大家只用50行Python代碼爬取網(wǎng)絡(luò)美女圖片是怎么操作的,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-06-06
  • python設(shè)置中文界面實(shí)例方法

    python設(shè)置中文界面實(shí)例方法

    在本篇文章里小編給大家整理的是關(guān)于python設(shè)置中文界面實(shí)例方法,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-10-10
  • python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式

    python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式

    這篇文章主要介紹了python用matplotlib繪制二維坐標(biāo)軸,設(shè)置箭頭指向,文本內(nèi)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python進(jìn)行添加,讀取和刪除Word文檔屬性

    Python進(jìn)行添加,讀取和刪除Word文檔屬性

    在Python中處理Word文檔時(shí),對(duì)文檔屬性進(jìn)行操作是一項(xiàng)重要的任務(wù),下面我們來看看如何使用Python實(shí)現(xiàn)對(duì)Word文檔屬性的添加,讀取和刪除操作吧
    2025-02-02

最新評(píng)論

胶南市| 龙里县| 平安县| 泰州市| 安陆市| 芒康县| 固原市| 青龙| 朝阳区| 临清市| 上虞市| 民县| 萝北县| 北辰区| 石棉县| 广南县| 眉山市| 寻乌县| 漠河县| 尖扎县| 永春县| 新巴尔虎左旗| 华亭县| 泸西县| 南江县| 兴城市| 山丹县| 宝应县| 华蓥市| 和龙市| 化德县| 平果县| 景宁| 三亚市| 稷山县| 彭州市| 新乐市| 高青县| 云阳县| 临猗县| 徐汇区|