最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用ES?Client?調(diào)用滾動查詢及Elasticsearch滾動查詢Scrolling機制

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

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

前言

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

1. 滾動查詢的一般步驟

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

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

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

命中結(jié)果:

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

示例:

在這里插入圖片描述

1.2 使用滾動ID檢索下一頁結(jié)果

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

示例:

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

1.4 重復(fù)執(zhí)行直到?jīng)]有檢索結(jié)果返回

Elasticsearch將返回下一頁結(jié)果和一個新的滾動ID??梢愿鶕?jù)需要重復(fù)這個步驟,直到?jīng)]有更多結(jié)果為止

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

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

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

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

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

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    //構(gòu)建es HttpHost對象
    HttpHost httpHost1 = new HttpHost("192.168.1.1", 9200, "http");
    // 滾動時間窗口
    long scrollTime = 1L;
    // 每次返回的文檔數(shù)量
    int batchSize = 20000;
    //索引名
    String indexName = "你的索引名稱";
    try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(httpHost1))) {
        //構(gòu)建查詢請求
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.boolQuery());
        searchSourceBuilder.size(batchSize);
        //設(shè)置查詢返回字段
        String[] includes = {};
        searchSourceBuilder.fetchSource(includes, null);
        // 滾動查詢請求
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.source(searchSourceBuilder);
        //設(shè)置請求滾動時間窗口時間
        searchRequest.scroll(TimeValue.timeValueMinutes(scrollTime));
        //執(zhí)行首次檢索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //首次檢索返回scrollId,用于下一次的滾動查詢
        String scrollId = searchResponse.getScrollId();
        //獲取首次檢索命中結(jié)果
        SearchHit[] searchHits = searchResponse.getHits().getHits();
        //計數(shù)
        int count = 0;
        // 處理第一批結(jié)果
        for (SearchHit hit : searchHits) {
            // 處理單個文檔
            JSONObject dataJson = (JSONObject) JSON.parse(hit.getSourceAsString());
            System.out.println("====對首次請求的進行處理,當(dāng)前計數(shù):" + count++);
        }
        // 處理滾動結(jié)果
        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("====滾動查詢,當(dāng)前計數(shù):" + 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;  // 每次返回的文檔數(shù)量
        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();
        // 處理第一批結(jié)果
        for (SearchHit<YourEntityClass> hit : searchHits) {
            YourEntityClass entity = hit.getContent();
            // 處理單個文檔
        }
        // 處理滾動結(jié)果
        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);
    }
}

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

相關(guān)文章

  • springboot項目監(jiān)控開發(fā)小用例(實例分析)

    springboot項目監(jiān)控開發(fā)小用例(實例分析)

    這篇文章主要介紹了springboot項目監(jiān)控開發(fā)小用例,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解

    MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解

    這篇文章主要介紹了MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java非法字符: ‘\ufeff‘問題及說明

    Java非法字符: ‘\ufeff‘問題及說明

    這篇文章主要介紹了Java非法字符: ‘\ufeff‘問題及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • idea 在springboot中使用lombok插件的方法

    idea 在springboot中使用lombok插件的方法

    這篇文章主要介紹了idea 在springboot中使用lombok的相關(guān)資料,通過代碼給大家介紹在pom.xml中引入依賴的方法,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • Java 重寫與重載方法與區(qū)別詳解

    Java 重寫與重載方法與區(qū)別詳解

    本篇文章通過實例詳細介紹了重寫與重載,以及他們的區(qū)別,需要的朋友可以參考下
    2017-04-04
  • kaptcha驗證碼使用方法詳解

    kaptcha驗證碼使用方法詳解

    這篇文章主要為大家詳細介紹了kaptcha驗證碼的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 基于SpringBoot開機啟動與@Order注解

    基于SpringBoot開機啟動與@Order注解

    這篇文章主要介紹了SpringBoot開機啟動與@Order注解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java如何比較兩個任意文件是否相同

    Java如何比較兩個任意文件是否相同

    這篇文章主要為大家詳細介紹了Java如何實現(xiàn)比較兩個任意文件是否相同,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 如何在IDEA中查看依賴關(guān)系的方法步驟

    如何在IDEA中查看依賴關(guān)系的方法步驟

    這篇文章主要介紹了如何在IDEA中查看依賴關(guān)系的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • mybatis-plus批量更新updateBatchById問題

    mybatis-plus批量更新updateBatchById問題

    這篇文章主要介紹了mybatis-plus批量更新updateBatchById問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論

垣曲县| 黑龙江省| 延川县| 双峰县| 双峰县| 错那县| 宁河县| 迁安市| 崇阳县| 辽阳市| 双牌县| 中卫市| 微山县| 株洲市| 兴仁县| 永登县| 萨迦县| 湟中县| 满城县| 庄河市| 泗阳县| 资中县| 鹿邑县| 兴国县| 中阳县| 辛集市| 万山特区| 搜索| 孟连| 聂荣县| 马龙县| 汝州市| 德化县| 互助| 灌南县| 洛南县| 平武县| 邢台县| 莆田市| 凯里市| 石楼县|