国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:50日期:2022-07-15 17:02:48

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

使用ES做搜索引擎拉取數(shù)據(jù)的時候,如果數(shù)據(jù)量太大,通過傳統(tǒng)的from + size的方式并不能獲取所有的數(shù)據(jù)(默認最大記錄數(shù)10000),因為隨著頁數(shù)的增加,會消耗大量的內(nèi)存,導致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定義了目標數(shù)據(jù)的偏移值,size定義當前返回的數(shù)目。默認from為0,size為10,即所有的查詢默認僅僅返回前10條數(shù)據(jù)。

在這里有必要了解一下from/size的原理:因為es是基于分片的,假設有5個分片,from=100,size=10。則會根據(jù)排序規(guī)則從5個分片中各取回100條數(shù)據(jù)數(shù)據(jù),然后匯總成500條數(shù)據(jù)后選擇最后面的10條數(shù)據(jù)。

做過測試,越往后的分頁,執(zhí)行的效率越低。總體上會隨著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)境多久 游標查詢過期時間為10分鐘(10m)page = es.search( index='source_keyword_message', doc_type='source_keyword_message', scroll=’10m’, size=100, body={ 'query': {'match_all': {}}, } )# 游標用于輸出es查詢出的所有結果sid = page[’_scroll_id’]# es查詢出的結果總量scroll_size = page[’hits’][’total’]# es查詢出的結果第一頁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’) scroll=5m表示設置scroll_id保留5分鐘可用。 使用scroll必須要將from設置為0。默認0 size決定后面每次調(diào)用_search搜索返回的數(shù)量

三、search_after 深分頁

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

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

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

GET test/_search{ 'query': { 'bool': { 'filter': [ { 'term': { 'age': 28 } } ] } }, 'size': 20, 'from': 0, 'sort': [ { 'timestamp': { 'order': 'desc' }, '_id': { 'order': 'desc' } } ]} 使用search_after必須要設置from=0。 這里我使用timestamp和_id作為唯一值排序。 我們在返回的最后一條數(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' } } ]}

到此這篇關于python 使用elasticsearch 實現(xiàn)翻頁的三種方式的文章就介紹到這了,更多相關python elasticsearch 翻頁內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 97视频免费观看2区 97视频免费上传播放 | 久草中文网 | 一级毛片在播放免费 | 97精品国产手机 | 日本美女作爱 | 深夜做爰性大片很黄很色视频 | 日本道久久 | 国产成人精品久久二区二区 | 亚洲国产精品免费在线观看 | 免费特黄一区二区三区视频一 | 一级伦理电线在2019 | 亚州国产视频 | 91九色国产porny | 美国美女一级毛片免费全 | 欧美日韩在线永久免费播放 | 成年女人免费视频 | 中文字幕一区中文亚洲 | 亚洲日本欧美综合在线一 | 性配久久久 | 成人欧美一区二区三区黑人免费 | 男女视频免费 | 欧美日韩国产一区二区三区播放 | 明星国产欧美日韩在线观看 | 91亚洲人成手机在线观看 | 免费国产a国产片高清 | 免费观看成人www精品视频在线 | 日韩久久中文字幕 | 欧美一级成人毛片视频 | 久久免费国产视频 | 久久这里一区二区精品 | 国产精品亚洲国产三区 | 久久九九精品一区二区 | 亚洲一区二区三区免费视频 | 欧美一级特黄特色大片免费 | 成人精品 | 国产亚洲欧美日韩综合综合二区 | 国产永久高清免费动作片www | 国产成人精品一区二三区在线观看 | 日本一级全黄大片 | 久久爽久久爽久久免费观看 | 国产精品久久久久影院 |