欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

一、from + size 淺分頁

"淺"分頁可以理解為簡單意義上的分頁。它的原理很簡單,就是查詢前20條數(shù)據(jù),然后截斷前10條,只返回10-20的數(shù)據(jù)。這樣其實白白浪費了前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的原理:
因為es是基于分片的,假設(shè)有5個分片,from=100,size=10。則會根據(jù)排序規(guī)則從5個分片中各取回100條數(shù)據(jù)數(shù)據(jù),然后匯總成500條數(shù)據(jù)后選擇最后面的10條數(shù)據(jù)。

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

二、scroll 深分頁

 from+size查詢在10000-50000條數(shù)據(jù)(1000到5000頁)以內(nèi)的時候還是可以的,但是如果數(shù)據(jù)過多的話,就會出現(xiàn)深分頁問題。為了解決上面的問題,elasticsearch提出了一個scroll滾動的方式。
scroll 類似于sql中的cursor,使用scroll,每次只能獲取一頁的內(nèi)容,然后會返回一個scroll_id。根據(jù)返回的這個scroll_id可以不斷地獲取下一頁的內(nèi)容,所以scroll并不適用于有跳頁的情景。

# -*- 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)查詢過期時間為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é)果第一頁
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 深分頁

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

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

為了找到每一頁最后一條數(shù)據(jù),每個文檔必須有一個全局唯一值,官方推薦使用 _uid 作為全局唯一值,其實使用業(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. 我們在返回的最后一條數(shù)據(jù)里拿到sort屬性的值傳入到search_after。

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

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 實現(xiàn)翻頁的三種方式的文章就介紹到這了,更多相關(guān)python elasticsearch 翻頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pycharm不能運行.py文件的解決方法

    pycharm不能運行.py文件的解決方法

    今天小編就為大家分享一篇pycharm不能運行.py文件的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python求解水仙花數(shù)的方法

    python求解水仙花數(shù)的方法

    這篇文章主要介紹了python求解水仙花數(shù)的方法,較為詳細(xì)的分析了水仙花數(shù)問題的概念與對應(yīng)解決方法的實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • python中函數(shù)的參數(shù)詳解

    python中函數(shù)的參數(shù)詳解

    本文詳細(xì)講解了python中函數(shù)的參數(shù),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 在Python中畫圖(基于Jupyter notebook的魔法函數(shù))

    在Python中畫圖(基于Jupyter notebook的魔法函數(shù))

    這篇文章主要介紹了在Python中畫圖(基于Jupyter notebook的魔法函數(shù)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Python執(zhí)行程序獲取所在目錄的解決方案

    Python執(zhí)行程序獲取所在目錄的解決方案

    工作需要,寫一個小腳本,其中有個需求是獲取實際的執(zhí)行程序所在路徑(python代碼由pyinstaller打包成執(zhí)行程序),這篇文章主要介紹了Python執(zhí)行程序獲取所在目錄的解決方案,需要的朋友可以參考下
    2024-05-05
  • Python中字符串的常用方法總結(jié)

    Python中字符串的常用方法總結(jié)

    字符串是?字符的序列?。字符串基本上就是一組單詞。我?guī)缀蹩梢员WC你在每個Python程序中都要用到字符串。本文為大家總結(jié)了15個常用的方法,希望對大家有所幫助
    2022-12-12
  • Django項目實戰(zhàn)之配置文件詳解

    Django項目實戰(zhàn)之配置文件詳解

    這篇文章主要給大家介紹了關(guān)于Django項目實戰(zhàn)之配置文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python GUI庫圖形界面開發(fā)之PyQt5訪問系統(tǒng)剪切板QClipboard類詳細(xì)使用方法與實例

    python GUI庫圖形界面開發(fā)之PyQt5訪問系統(tǒng)剪切板QClipboard類詳細(xì)使用方法與實例

    這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5訪問系統(tǒng)剪切板QClipboard類詳細(xì)使用方法與實例,需要的朋友可以參考下
    2020-02-02
  • wxpython實現(xiàn)圖書管理系統(tǒng)

    wxpython實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了wxpython實現(xiàn)圖書管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python實現(xiàn)字典去除重復(fù)的方法示例

    Python實現(xiàn)字典去除重復(fù)的方法示例

    這篇文章主要介紹了Python實現(xiàn)字典去除重復(fù)的方法,涉及Python字典遍歷、文件讀取、去除重復(fù)等相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07

最新評論