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

Java使用ES?Client?調用滾動查詢及Elasticsearch滾動查詢Scrolling機制

 更新時間:2023年08月14日 10:30:26   作者:周全全  
Elasticsearch提供了一種稱為"滾動查詢"(Scrolling)的機制,用于處理大型數據集的分頁查詢,這篇文章給大家介紹滾動查詢的一般步驟及Java使用ESClient調用滾動查詢的方法,感興趣的朋友一起看看吧

Elasticsearch"滾動查詢"(Scrolling)的機制的與Java使用ES Client 調用滾動查詢

前言

ES在進行普通的查詢時,默認只會查詢出來10條數據。我們通過設置es中的size可以將最終的查詢結果從10增加到10000。如果需要查詢數據量大于es的翻頁限制或者需要將es的數據進行導出又當如何?
Elasticsearch提供了一種稱為"滾動查詢"(Scrolling)的機制,用于處理大型數據集的分頁查詢。滾動查詢允許在持續(xù)的時間段內保持一個活動的搜索上下文,然后使用滾動ID進行迭代檢索結果。滾動查詢和關系型數據庫中的游標有點類似,因此也叫游標查詢

1. 滾動查詢的一般步驟

1.1 發(fā)起初始搜索請求,返回命中結果和滾動ID

scroll=5m表示每個滾動查詢的有效時間為5分鐘

POST /your_index/_search?scroll=5m
{
  "size": 100,       // 每次返回的結果數量
  "query": { ... }   // 查詢條件
}

命中結果:

{
  "_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
  "hits": {
    "total": {
      "value": 10000,
      "relation": "eq"
    },
    "hits": [ ... ]  // 檢索到的文檔
  }
}

示例:

在這里插入圖片描述

1.2 使用滾動ID檢索下一頁結果

POST /_search/scroll
{
  "scroll": "5m",
  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

示例:

POST /_search/scroll
 {
   "scroll": "5m",
   "scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFDJPRXc0WWdCY1BLWlo1MTk4MmR3AAAAAAAAAXYWcWgwSW5CQUtScEd2T2QtRGtYaWliQQ=="
 }

1.4 重復執(zhí)行直到沒有檢索結果返回

Elasticsearch將返回下一頁結果和一個新的滾動ID。可以根據需要重復這個步驟,直到沒有更多結果為止

1.5 清除滾動上下文釋放資源

滾動查詢結束后,您可以通過發(fā)送一個清除滾動上下文的請求來釋放資源:

DELETE /_search/scroll
{
  "scroll_id": [
    "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
  ]
}

以上為滾動查詢進行分頁檢索的基本過程。在每個滾動請求中,都需要提供先前滾動請求返回的滾動ID。這樣Elasticsearch才能夠維護搜索上下文并返回正確的結果

2.Java Elasticsearch客戶端執(zhí)行滾動查詢

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    //構建es HttpHost對象
    HttpHost httpHost1 = new HttpHost("192.168.1.1", 9200, "http");
    // 滾動時間窗口
    long scrollTime = 1L;
    // 每次返回的文檔數量
    int batchSize = 20000;
    //索引名
    String indexName = "你的索引名稱";
    try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(httpHost1))) {
        //構建查詢請求
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.boolQuery());
        searchSourceBuilder.size(batchSize);
        //設置查詢返回字段
        String[] includes = {};
        searchSourceBuilder.fetchSource(includes, null);
        // 滾動查詢請求
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.source(searchSourceBuilder);
        //設置請求滾動時間窗口時間
        searchRequest.scroll(TimeValue.timeValueMinutes(scrollTime));
        //執(zhí)行首次檢索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //首次檢索返回scrollId,用于下一次的滾動查詢
        String scrollId = searchResponse.getScrollId();
        //獲取首次檢索命中結果
        SearchHit[] searchHits = searchResponse.getHits().getHits();
        //計數
        int count = 0;
        // 處理第一批結果
        for (SearchHit hit : searchHits) {
            // 處理單個文檔
            JSONObject dataJson = (JSONObject) JSON.parse(hit.getSourceAsString());
            System.out.println("====對首次請求的進行處理,當前計數:" + count++);
        }
        // 處理滾動結果
        while (searchHits != null && searchHits.length > 0) {
            SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
            scrollRequest.scroll(TimeValue.timeValueMinutes(scrollTime));
            searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
            scrollId = searchResponse.getScrollId();
            searchHits = searchResponse.getHits().getHits();
            for (SearchHit hit : searchHits) {
                JSONObject dataJson = (JSONObject) JSON.parse(hit.getSourceAsString());
                System.out.println("====滾動查詢,當前計數:" + count++);
            }
        }
        // 清理滾動上下文
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);
        ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
        boolean succeeded = clearScrollResponse.isSucceeded();
        long end = System.currentTimeMillis();
        System.out.println("共執(zhí)行時間:" + (end - start) / 1000 + " s");
    } catch (Exception e) {
        System.out.println("===error==" + e.getMessage());
        e.printStackTrace();
    }
}

3. SpringDataElasticsearch滾動查詢

import org.elasticsearch.action.search .*;
import org.elasticsearch.client .*;
import org.elasticsearch.common.unit .*;
import org.elasticsearch.index.query .*;
import org.elasticsearch.search .*;
import org.elasticsearch.search.builder .*;
import org.springframework.beans.factory.annotation .*;
import org.springframework.data.elasticsearch.core .*;
import org.springframework.data.elasticsearch.core.query .*;
public class ScrollSearchExample {
    @Autowired
    private ElasticsearchOperations elasticsearchOperations;
    public void performScrollSearch() {
        String scrollTime = "1m";  // 滾動時間窗口
        int batchSize = 100;  // 每次返回的文檔數量
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
        NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
        searchQuery.withQuery(queryBuilder).withPageable(PageRequest.of(0, batchSize)).build();
        SearchResponse searchResponse = elasticsearchOperations.startScroll(
                scrollTime,
                searchQuery,
                YourEntityClass.class,
                IndexCoordinates.of("your_index")
        );
        String scrollId = searchResponse.getScrollId();
        SearchHits<YourEntityClass> searchHits = searchResponse.getSearchHits();
        // 處理第一批結果
        for (SearchHit<YourEntityClass> hit : searchHits) {
            YourEntityClass entity = hit.getContent();
            // 處理單個文檔
        }
        // 處理滾動結果
        while (searchHits != null && searchHits.hasSearchHits()) {
            searchResponse = elasticsearchOperations.continueScroll(scrollId, scrollTime, YourEntityClass.class);
            scrollId = searchResponse.getScrollId();
            searchHits = searchResponse.getSearchHits();
            for (SearchHit<YourEntityClass> hit : searchHits) {
                YourEntityClass entity = hit.getContent();
                // 處理單個文檔
            }
        }
        // 清理滾動上下文
        elasticsearchOperations.clearScroll(scrollId);
    }
}

到此這篇關于Java使用ES Client 調用滾動查詢及Elasticsearch滾動查詢Scrolling機制的文章就介紹到這了,更多相關java Elasticsearch滾動查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java 排序算法整合(冒泡,快速,希爾,拓撲,歸并)

    Java 排序算法整合(冒泡,快速,希爾,拓撲,歸并)

    這篇文章主要介紹了Java 排序算法整合(冒泡,快速,希爾,拓撲,歸并),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Mybatis-Plus多種批量插入方案對比小結

    Mybatis-Plus多種批量插入方案對比小結

    在項目中優(yōu)化Mybatis-Plus批量插入性能是關鍵,通過比較不同方案,本文就來介紹一下Mybatis-Plus多種批量插入方案對比小結,感興趣都的可以了解一下
    2024-10-10
  • 高內聚低耦合法則實例解析

    高內聚低耦合法則實例解析

    這篇文章主要介紹了高內聚低耦合法則實例代碼解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring使用注解進行對象注入的示例詳解

    Spring使用注解進行對象注入的示例詳解

    獲取?Bean?對象也叫做對象裝配,就是把對象取出來放到某個類中,有時候也叫對象注入,常見有關對象注入的注解有兩個,一個是@Autowired,另外一個是@Resource,下面就來講講它們的具體使用吧
    2023-07-07
  • Java異常處理操作 Throwable、Exception、Error

    Java異常處理操作 Throwable、Exception、Error

    這篇文章主要介紹了Java異常處理操作 Throwable、Exception、Error,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 一文帶你掌握Java?ReentrantLock加解鎖原理

    一文帶你掌握Java?ReentrantLock加解鎖原理

    這篇文章將為大家詳細介紹一下Java中ReentrantLock?加鎖和釋放鎖的原理,以及和?Synchronized?的對比。文中的示例代碼講解詳細,希望對大家有所幫助
    2022-12-12
  • Spring使用三級緩存解決循環(huán)依賴的問題

    Spring使用三級緩存解決循環(huán)依賴的問題

    本文給大家分享Spring使用三級緩存解決循環(huán)依賴的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-06-06
  • 在@Value注解內使用SPEL自定義函數方式

    在@Value注解內使用SPEL自定義函數方式

    這篇文章主要介紹了在@Value注解內使用SPEL自定義函數方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 關于BufferedReader的read()和readLine()的區(qū)別

    關于BufferedReader的read()和readLine()的區(qū)別

    這篇文章主要介紹了關于BufferedReader的read()和readLine()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java反轉鏈表的多種解決方法舉例詳解

    java反轉鏈表的多種解決方法舉例詳解

    這篇文章主要介紹了java反轉鏈表的多種解決方法,分別是使用棧、雙指針和遞歸,每種方法都有其實現原理和代碼示例,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04

最新評論