1. 程式人生 > >ElasticSearch通過Scroll方式遍歷索引(Python程式碼)

ElasticSearch通過Scroll方式遍歷索引(Python程式碼)

當我們要查詢的資料量過大的時候,用es的from+size的方式會報錯,會提示你from+size不能大於10000

那麼可以用es的scroll方式,實際是一種深度分頁機制

直接上程式碼:

#-*- coding:utf8 -*-

from elasticsearch import Elasticsearch, helpers
import json
import pdb

class ElasticsearchService:

    def __init__(self, hosts):
        self.__elasticsearch = Elasticsearch(hosts, sniff_on_start=True, sniff_on_connection_fail=True, sniffer_timeout=60, timeout=30, retry_on_timeout=True, max_retries=5)

    def search_scroll(self, index, doc_type, query):
        try:
            return self.__elasticsearch.search(index=index, doc_type=doc_type, body=query, search_type="query_then_fetch", scroll="1m")
        except BaseException as e:
            print str(e)
            pass

        return {}

    def scroll_scan(self, query):
        try:
            resJson = self.__elasticsearch.scroll(body=query)
            return resJson 
        except BaseException as e:
            print str(e)
            pass

        return []

    def delete_by_query(self, index, doc_type, query):
        try:
            resJson = self.__elasticsearch.delete_by_query(index=index, doc_type=doc_type, body=query)
            return resJson.get('deleted')
        except BaseException as e:
            print 'delete fail'
            pass

        return 0

    def update_by_query(self, index, doc_type, query):
        try:
            resJson = self.__elasticsearch.update_by_query(index=index, doc_type=doc_type, body=query)
            return resJson.get('updated')
        except BaseException as e:
            pass

        return 0 

    def insert_bulk(self, data_lst):
        try:
            return helpers.bulk(self.__elasticsearch, data_lst, request_timeout=60) 
        except BaseException as e:
            return [0, []]


if __name__ == '__main__':
    es_hosts = ["10.234.22.22:9200"]
    baike_all_index = 'baike_index'
    baike_all_type = 'baike_all'
    elastic_service = ElasticsearchService(es_hosts)
    #這裡是進行第一次查詢,query中size指定每個批次的大小,返回的結果中不僅有查詢到的資料,還有一個scroll_id, 這個scrool_id可以認為是下一次查詢的起始位置
    res = elastic_service.search_scroll(baike_all_index, baike_all_type, {"query": {"match_all": {}},"_source": ["url"], "size": 10000})
    hits = res.get('hits')
    if hits.get('total') > 0:
        for hit in hits.get('hits'):
            print hit['_source']['url']  #這裡是取我自己的資料
    while res.get('_scroll_id') and hits.get('total') > 0:
        #後續的每次查詢都需要帶上上一次查詢結果中得到的scroll_id引數
        res = elastic_service.scroll_scan({'scroll': '1m', 'scroll_id': res.get('_scroll_id')})
        hits = res.get('hits')
        if hits.get('total') > 0:
            for hit in hits.get('hits'):
                print hit['_source']['url']

相關推薦

ElasticSearch通過Scroll方式索引Python程式碼

當我們要查詢的資料量過大的時候,用es的from+size的方式會報錯,會提示你from+size不能大於10000那麼可以用es的scroll方式,實際是一種深度分頁機制直接上程式碼:#-*- cod

【小白學PyTorch】6 模型的構建訪問儲存程式碼

文章轉載自微信公眾號:機器學習煉丹術。歡迎大家關注,這是我的學習分享公眾號,100+原創乾貨。 文章目錄: [TOC] 本文是對一些函式的學習。函式主要包括下面四個方便: - 模型構建的函式:```add_module```,```add_module```,```add_module``` - 訪問子

各種輸出經典版----java基礎總結

blog long arr 基礎 each循環 mage pan 之前 es2017 前言:關於共有3中遍歷輸出方式,很早之前我就想整理,無奈一直沒有抽出時間,分別是傳統的for循環遍歷,叠代器Iterator,foreach,這次我通過測試代碼,測試了一下。 先用一張草圖

2018-6-3_《JS方法12個

turn undefine map defined ever fin asc dex ole /* 12個遍歷方法: 1. forEach ES5 2. every ES5 3. some ES5 4. filter ES5 5. map ES5 6. redu

DOM方法基於jQuery

get In 篩選 lin bsp 所有 ngs OS ron 在使用$()創建了jQuery對象之後,通過調用下列DOM遍歷方法,可以修改其中匹配的元素,以便將來操作。 篩選元素 .filter(selector)

二叉樹的演算法js實現

之前我的部落格中講到了如何通過js去實現一顆二叉樹,有興趣的可以去我的部落格中看下。今天我們來一起實現下二叉樹的遍歷演算法。歡迎大家幫忙指出不當之處,或者進行深入的挖掘。大家一起進步。二叉樹吶,有三種遍歷演算法,1:中序遍歷,2:先序遍歷,3:後序遍歷。在我們看具體實現之前,我們想下為什麼要這樣做?二叉樹廣泛

劍指offer23 二叉搜尋樹的後序序列java實現

題目 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路(遞迴) 後序遍歷,即根節點最後輸出。這是解題線索。 我們根據陣列最後一個數來遍歷整個陣列 比陣列小的是這

遞迴先序、非遞迴層次建立二叉樹並用三序C語言

 先序就是直接用遞迴的方法建立,層次使用了輔助陣列,後一種方法我覺得友好多了。 #include "stdio.h" #define MAXSIZE 50 #define TRUE 1 #define FALSE 0 typedef int boo

深度優先DFS 與 廣度優先BFSjava實現

圖的遍歷方式有倆種: 深度優先遍歷(DFS) 廣度優先遍歷(BFS) (1)深度優先遍歷(利用棧和遞迴來實現) 思路:先以一個點為起點,這裡假如是點A,那麼就將A相鄰的點放入堆疊,然後在棧中再取出棧頂的頂點元素(假如是點B),再將B

劍指offer_面試題24_二叉搜尋樹的後序序列遞迴

題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。 二叉搜尋樹規律: 1、若 左子樹 不空,則 左子樹上所有結點的值 均小於它的根結點的值。 2、若 右子樹 不空,則 右子

Java二維陣列的方法兩種

class printArray { public static void main(String[] args) { int[][] arr = {{1,2,3},{4,5},

二叉樹的前序、後序、中序規則遞歸

ref style deb strchr pri efi href oid 二叉 1.前序遍歷的規則:(根左右) (1)訪問根節點 (2)前序遍歷左子樹 (3)前序遍歷右子樹 對於圖中二叉樹,前序遍歷結果:ABDECF 2.中序遍歷的規則:(左根右)

Java實現二叉樹的創建和操作有更新

inf pre 讓我 保存 number 定義 ++ 錯誤 ole 博主強烈建議跳過分割線前面的部分,直接看下文更新的那些即可。 最近在學習二叉樹的相關知識,一開始真的是毫無頭緒。本來學的是C++二叉樹,但苦於編譯器老是出故障,於是就轉用Java來實現二叉樹的操作。但是

C# TreeView 建立、遞迴

剛接觸treeview這個功能,惡補了幾天,博主總結下實現的功能以備用,希望能幫到需要的親~~ C#gui程式中建立樹狀結構、遍歷樹狀結構、樹狀結構節點選中聯動(選中父節點時,自動選中其全部子節點,取消選中的某子節點,取消其相應的所有父節點的選中),讀取選中節

Java實現二叉樹的建立和操作有更新

博主強烈建議跳過分割線前面的部分,直接看下文更新的那些即可。 最近在學習二叉樹的相關知識,一開始真的是毫無頭緒。本來學的是C++二叉樹,但苦於編譯器老是出故障,於是就轉用Java來實現二叉樹的操作。但是二者原理是一致的,而且實現的方式也是大同小異! 下面

二叉樹的建立與(一)c++實現

【目標】 建立如下所示的一棵二叉樹,並且輸出其對應的前序遍歷、中序遍歷、後序遍歷。 【程式碼實現】 建立二叉樹以及實現遍歷的操作存放在Binarytree.h檔案中 //Binarytree.h #ifndef Binarytree_H #d

freemarker 迴圈map踩坑

哎呀,真是痛苦啊,用以前用過的方式進行迴圈遍歷,總是報錯,程式碼和錯誤如下: 程式碼: <#list stringMap?keys as strKey>  <#list stringMap[strKey] as

jsp 頁面中用struts2 標籤集合list map

1,list: public class ListTestAction extends ActionSupport { private List<String> list1; private List<User> list2;

PHP 使用list函式each函式陣列實現foreach解析

PHP使用list函式each函式遍歷陣列(實現foreach)淺析 直接進入主題吧。 先看看list函式: list() 函式用於在一次操作中給一組變數賦值,並且無限引數(引數超過索引數組裡元素

用最容易的方式學會單鏈表Python實現

單鏈表與陣列 在本部落格中,我們介紹單鏈表這種資料結構,連結串列結構為基於陣列的序列提供了另一種選擇(例如Python列表)。 基於陣列的序列也會有如下缺點: 一個動態陣列的長度可能超過實際儲存陣列元素所需的長度 在實時系統中對操作的攤銷邊界是不可接受的 在一個數組內部執行插入和刪除操作的代價太高 基於陣