1. 程式人生 > >Elasticsearch使用Scroll-Scan實現資料遍歷

Elasticsearch使用Scroll-Scan實現資料遍歷

       Elasticsearch 是一個實時的分散式搜尋與分析引擎,被廣泛用來做全文搜尋、結構化搜尋、結果分析。在實際應用中有時需要遍歷某個索引的全部資料,這時使用分頁檢索的形式效率會比較差。

      分頁檢索即from-size形式,from指的是從哪裡開始拿資料,size是結果集中返回的文件個數。from-size的工作原理是:如size=10&from=100,那麼Elasticsearch會從每個分片裡取出110條資料,然後彙集到一起再排序,取出101~110序號的文件。由此可見,from-size的效率必然不會很高,特別是分頁越深,需要排序的資料越多,其效率就越低。 

      這時更為有效的方法是使用Scroll-Scan。Scroll是先做一次初始化搜尋把所有符合搜尋條件的結果快取起來生成一個快照,然後持續地、批量地從快照里拉取資料直到沒有資料剩下。而這時對索引資料的插入、刪除、更新都不會影響遍歷結果,因此scroll 並不適合用來做實時搜尋。Scan是搜尋型別,告訴Elasticsearch不用對結果集進行排序,只要分片裡還有結果可以返回,就返回一批結果。scroll- scan使用中不能跳頁獲取結果,必須一頁接著一頁獲取。

      為了使用scroll-scan,需要執行一個初始化搜尋請求,將search_type設定成scan,並且傳遞一個scroll引數來告訴 Elasticsearch快取應該持續多長時間,在快取持續時間內初始化搜尋請求後對索引的修改不會反應到快照中。每次搜尋請求後都會返回一個scrollId,是一個 64 位的字串編碼,後續會使用此scrollId來獲取資料。scroll時間指的是本次資料處理所需要的時間,如果超過此時間,繼續使用該scrollId搜尋資料則會報錯。在使用scroll-scan時可以指定返回結果集大小,在 scan 的時候,size 作用在每個分片上,所以將會在每批次中得到最大為 size * 主分片數 個文件。

      JAVA示例

public class ScrollTest {
	public static void main(String[] args) {
		JSONObject resultObject = null;
		Client esClient = ESClientHelper.getInstance().getClient();
		SearchResponse searchResponse = esClient.prepareSearch("index")
				.setSearchType(SearchType.SCAN)
				// 實際返回的數量為5*index的主分片個數
				.setSize(5)
				// 這個遊標維持多長時間
				.setScroll(TimeValue.timeValueMinutes(8)).execute().actionGet();
		// 第一次查詢,只返回數量和一個scrollId
		System.out.println(searchResponse.getScrollId());
		System.out.println(searchResponse.getHits().getTotalHits());
		System.out.println(searchResponse.getHits().hits().length);
		System.out.println("------------------------------");
		// 使用上次的scrollId繼續訪問
		ScrollTest scroll = new ScrollTest();
		do{
			int num = scroll.scanData(esClient,searchResponse.getScrollId());
			if(num ==0) break;
		}while(true);
		System.out.println("------------------------------END");
	}
	
	private int scanData (Client esClient, String scrollId){
		SearchResponse searchResponse = esClient.prepareSearchScroll(scrollId)
				.setScroll(TimeValue.timeValueMinutes(8)).execute().actionGet();
		System.out.println(searchResponse.getScrollId());
		System.out.println(searchResponse.getHits().getTotalHits());
		int num = searchResponse.getHits().hits().length;
		System.out.println(searchResponse.getHits().hits().length);
		JSONObject resultObject = null;
		for (SearchHit hit : searchResponse.getHits()) {
			String json = hit.getSourceAsString();
			try {
				resultObject = new JSONObject(json);
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		return num;
	}
}


相關推薦

Elasticsearch使用Scroll-Scan實現資料

       Elasticsearch 是一個實時的分散式搜尋與分析引擎,被廣泛用來做全文搜尋、結構化搜尋、結果分析。在實際應用中有時需要遍歷某個索引的全部資料,這時使用分頁檢索的形式效率會比較差。       分頁檢索即from-size形式,from指的是從哪裡開始拿

【sql】-儲存過程實現迴圈一列資料

前言      專案中要實現前端頁面動態配置行為,每個行為呼叫不同的儲存過程的功能,於是乎小編一頭扎進了儲存過程的海洋中,愈發覺得之前寫的儲存過程算是基礎了。遇到一個問題:查詢到表中一列資料,需要取出每一行資料來執行下一個儲存過程。這可怎麼鬧?別急,小編來給

資料學習[16]--使用scroll實現Elasticsearch資料和深度分頁[轉]

題目:使用scroll實現Elasticsearch資料遍歷和深度分頁 作者:星爺 出處: http://lxWei.github.io/posts/%E4%BD%BF%E7%94%A8scroll%E5%AE%9E%E7%8E%B0Elasticsearch%E6%95%B0%E6%8

foreach 實現 MyBatis 集合與批量操作資料

一、寫在前面 MyBatis 動態 SQL 的一個常用的操作需求是對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。foreach允許你指定一個集合,宣告可以在元素體內使用的集合項(item)和索引(index)變數。foreach 是動態 SQL 中

算法-實現each多維數組(javascript)

算法# 實現each遍歷多維數組 <script type="text/javascript"> // var arr=[1,2,3,4,[1,2,3,4]] // arr.forEach(function(item,index,array)){} var arr=[12

Java實現深度和廣度歷數及其應用

fss blog nac emd fan 深度遍歷 apu soc use dc9mr6賦炮炮窖屠韌http://docstore.docin.com/hhmg5158wbx7ax睪躍茁胤駁諭http://shufang.docin.com/sina_6372926856g

golang實現

order tac root clas postorder ont 後序 pri bsp package main import ( "container/list" "fmt" ) type MyStack struct { List *l

AJAX資料輸出

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=d

select下拉選擇框實現迴圈資料庫

  <select class="form-control input-medium" id="organ"> <option value="">所屬部門</option> <c:forEach var="organ"

excel 資料讀取,資料,獲取日期資料和合並單元格資料

需求:現有一個excel表格,讀取date列的內容和合並單元格的內容 Sheet1頁的資料內容如下: 程式碼如下: import xlrd import collections import json import operator from ctypes import * f

C語言實現序列構造二叉樹

 程式需要包含二叉樹的基本運算演算法,我在之前的文章中已經寫過,詳見:C語言實現二叉樹各種基本運算的演算法 #define "btree.cpp" //包含二叉樹的基本運算演算法,詳見文章頂部連結 #define MaxWidth 40 /* 由中序遍歷序列構造二叉樹 */

freemarker網頁靜態化生成靜態頁面,資料,freemarker編輯器

如果eclipse中沒有freemarker編輯器,開啟頁面是這樣的。 頁面中都是黑色,不好看是不是 可以下載一個freemarker編輯器,在eclipse中, Help–>Eclipse MarketPlace 搜尋freemarker,選擇Freemarker IDE fr

相關子查詢——用子查詢實現類似的效果(部門工資前三高的員工)

在leetcode上看到了一道sql題目,但是不太會,看了題解以後感覺還是雲裡霧裡的,經過一番搜尋終於感覺明白了點 原來子查詢還有兩種 一種叫相關子查詢,一種叫巢狀(非相關)子查詢,區別就是子查詢是否和外部查詢相關 非相關:不多說,學過sql基礎的都會,執行過程也

Java 實現深度和廣度歷數及其應用

一、深度遍歷和廣度遍歷原理及實現 1、深度優先 英文縮寫為DFS即Depth First Search.其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。對於上面的例子來說深度優先遍歷的結果就是:A,B,D,E,I,C,F,G

無限極分類如何把 資料 成 tree 結構

關鍵 子類 pid 等於 父類 id 參考網址 https://blog.csdn.net/LYPHPER/article/details/70332425 public function xuqiu333() { echo '<pre>'; $list

js構建二叉樹,實現深度

最近研究了一下二叉樹,閒來沒事用js自己動手實現了一遍,歡迎各位大牛拍磚  一個二叉樹資料結構的屬性一般包含:節點及節點的值(程式碼中的node);節點之間的邊關係(連線關係,程式碼中的line) // 二叉樹物件實現 function binaryTree (o

八:go陣列及資料

go陣列及陣列遍歷 初始化陣列 array := [5]int(1,2,3,4,5) 陣列長度:arrLength := len(array) 元素訪問: for i := 0; i < len(array); i++{ fmt.PrintIn(array[

小程式ajax獲取資料 前幾名樣式不一樣

直接上程式碼 <view class='list' wx:for-index="idx" wx:for="{{datas}}" wx:key='index' bindtap="btnanniu" > <view style='height:50px;' w

解決後端資料 前端標籤新增事件

//點選 function getMaterial(x){ var chuangTong = $("#changtong").val(); //點選傳統和注塑和cpu一體的值 var name=x; //材質的值 $

PTA 6-2 二叉樹的(25 分) 25分程式碼 (陣列實現層次

前三個 中序 先序 後序遍歷直接遞迴就可以了 最後一個層次遍歷 可以把每一層 用陣列存起來,容易實現 (注: 部落格作為交流使用,請勿抄襲應付作業) /* 你的程式碼將被嵌在這裡 */ void