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

Java實(shí)現(xiàn)Elasticsearch查詢當(dāng)前索引全部數(shù)據(jù)的完整代碼

 更新時間:2025年02月06日 11:27:14   作者:csdn565973850  
這篇文章主要介紹了如何在Java中實(shí)現(xiàn)查詢Elasticsearch索引中指定條件下的全部數(shù)據(jù),通過設(shè)置滾動查詢參數(shù)(scroll),可以一次性獲取滿足條件的數(shù)據(jù),而不需要限制每頁的查詢條數(shù)大小,這樣可以避免因數(shù)據(jù)量過大而引發(fā)的性能問題,需要的朋友可以參考下

需求背景

通常情況下,Elasticsearch 為了提高查詢效率,對于不指定分頁查詢條數(shù)的查詢語句,默認(rèn)會返回10條數(shù)據(jù)。那么這就會有一種情況,當(dāng)你需要一次性返回 Elasticsearch 索引中的全部數(shù)據(jù)時,就無法實(shí)現(xiàn)了。這個時候你可能會考慮,比如我將每頁取值的size 設(shè)置的很大,這樣或許可以解決問題,但是數(shù)據(jù)量的上升你是無法控制的,最終會有一天數(shù)據(jù)量會超過你此時設(shè)置的最大 size,那么這就是一個雷點(diǎn)。并且如果一次查詢很大量數(shù)據(jù)的話,即便是 Elasticsearch 查詢效率高的索引結(jié)構(gòu)可能也會導(dǎo)致查詢時長較長,甚至響應(yīng)超時。那么是否有一種查詢效率高,且相對靈活的方式可以查詢 Elasticsearch 的索引中全部數(shù)據(jù)呢?答案是:有的。

通常情況

下面來看一下在不設(shè)置 size 大小的情況下,執(zhí)行 Elasticsearch 查詢語句默認(rèn)返回幾條數(shù)據(jù),結(jié)果是默認(rèn)返回 10條。執(zhí)行如下查詢命令

GET crm_meiqia_conversation/_search

返回結(jié)果如圖,這時我們看到返回了 10 條數(shù)據(jù)

此時如果你需要查詢更多數(shù)據(jù)的話,你就可以通過指定 size 大小來查詢更多數(shù)據(jù),比如執(zhí)行如下命令

GET crm_meiqia_conversation/_search
{
  "size":20
}

執(zhí)行查詢語句后返回的結(jié)果如圖所示,索引查詢會返回你指定 size 大小的數(shù)據(jù)

很明顯,在一些特殊的場景下,想要一次性查詢指定條件下的所有數(shù)據(jù)改如何操作呢,下面就來基于 Java 實(shí)現(xiàn)查詢指定條件下的所有數(shù)據(jù)操作。

Java 實(shí)現(xiàn)查詢 Elasticsearch 全部數(shù)據(jù)

在具體講解如何通過 Java 實(shí)現(xiàn)查詢 Elasticsearch 全部數(shù)據(jù)之前,我們可以先來看一下我已經(jīng)實(shí)現(xiàn)之后的查詢效果。這里你可以看到滾動州已經(jīng)變得很小,這就是因?yàn)槲也樵兂隽酥付l件下的全部數(shù)據(jù)導(dǎo)致的,而不是默認(rèn)的 10 條數(shù)據(jù)

而如果沒有實(shí)現(xiàn)查詢指定索引指定條件下的全部數(shù)據(jù)時,看到的效果應(yīng)該是這樣的,默認(rèn)只能一次性查詢 10 條數(shù)據(jù)返回

下面再來講一下如何通過 Java 實(shí)現(xiàn) 查詢 es 全部數(shù)據(jù),我們由淺入深來講解,首先來看一下默認(rèn)查詢 es 10條數(shù)據(jù)的代碼,Java 通過如下 SearchRequestBuilder searchRequest = client.prepareSearch(indexProperties.getMeiqiaConversationIndex()).setTypes(indexProperties.getMeiqiaConversationType()).setQuery(query); 構(gòu)造查詢 es 索引代碼,這種情況沒有設(shè)置 size 大小,默認(rèn)的話就是查詢指定索引下 10條數(shù)據(jù),完整代碼如下:

public AjaxResult getMeiqiaUidList(MeiqiaConversation meiqiaConversation) {
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //會話id
        Long convId = meiqiaConversation.getConvId();
        if (convId != null) {
            boolQuery.filter(QueryBuilders.termQuery("convId",convId));
        }
        //會話日期
        String convStartDate = (String) meiqiaConversation.getParams().get("convStartDate");
        String convEndDate = (String) meiqiaConversation.getParams().get("convEndDate");
        if (StringUtils.isNotEmpty(convStartDate)) {
            Date date = DateUtils.stringToDate(convStartDate, DateUtils.SDF_YMDHMS);
            boolQuery.filter(QueryBuilders.rangeQuery("convStartDate").gte(date.getTime()));
        }
        if (StringUtil.isNotEmptyString(convEndDate)) {
            Date date = DateUtils.stringToDate(convEndDate, DateUtils.SDF_YMDHMS);
            boolQuery.filter(QueryBuilders.rangeQuery("convEndDate").lte(date.getTime()));
        }
        //會話日期
        Date convStartDate2 = meiqiaConversation.getConvStartDate();
        Date convEndDate2 = meiqiaConversation.getConvEndDate();
        if (Objects.nonNull(convStartDate2)) {
            boolQuery.filter(QueryBuilders.rangeQuery("convStartDate").gte(convStartDate2.getTime()));
        }
        if (Objects.nonNull(convEndDate2)) {
            boolQuery.filter(QueryBuilders.rangeQuery("convEndDate").lte(convEndDate2.getTime()));
        }
        //學(xué)號
        String uid = (String) meiqiaConversation.getParams().get("uid");
        if (StringUtils.isNotEmpty(uid)) {
            if (uid.contains("#")) {
                String replace = uid.replace("#", "");
                boolQuery.filter(QueryBuilders.termQuery("clientInfo.name",replace));
            }else {
                boolQuery.filter(QueryBuilders.termQuery("clientInfo.uid",uid));
            }
        }
        //客服工號
        String agentId = (String) meiqiaConversation.getParams().get("agentId");
        if (StringUtils.isNotEmpty(agentId)) {
            boolQuery.filter(QueryBuilders.termQuery("agentId",agentId));
        }
        // 會話內(nèi)容
        String content = (String) meiqiaConversation.getParams().get("content");
        if (StringUtils.isNotEmpty(content)) {
            boolQuery.filter(QueryBuilders.matchPhrasePrefixQuery("convContent.content",content));
        }

        query.must(boolQuery);

        // 初始化搜索請求構(gòu)建器,用于構(gòu)造搜索請求
        SearchRequestBuilder searchRequest = client.prepareSearch(indexProperties.getMeiqiaConversationIndex())
                // 設(shè)置搜索的類型
                .setTypes(indexProperties.getMeiqiaConversationType())
                // 設(shè)置查詢條件
                .setQuery(query);


        // 使用SearchRequest獲取搜索響應(yīng)
        SearchResponse searchResponse = searchRequest.get();
        // 初始化存儲所有搜索結(jié)果的列表
        List<EsMeiqiaConversation> rows = new ArrayList<>();
        // 格式化搜索響應(yīng)中的數(shù)據(jù),并添加到rows列表中
        List<EsMeiqiaConversation> list1 = formatMeiqiaDto(searchResponse);
        rows.addAll(list1);


        //記錄返回的uid name
        List<MeiqiaConversation> list = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(rows)) {
            //獲取 uid name
            Map<String, List<EsMeiqiaConversation>> collect = rows.stream().collect(Collectors.groupingBy(EsMeiqiaConversation::getClientUid, Collectors.toList()));
            Set<String> uids = collect.keySet();
            for (String u : uids) {
                MeiqiaConversation conv = new MeiqiaConversation();
                conv.setUid(u);
                //同一個uid 對應(yīng)同一個 name
                List<EsMeiqiaConversation> esconv = collect.get(u);
                String name = esconv.get(0).getClientName();
                conv.setName(name);
                list.add(conv);
            }
        }
        return AjaxResult.success(list);
    }

那么如何實(shí)現(xiàn) 一次查詢滿足條件的全部 es 數(shù)據(jù)呢,這就需要通過 scroll 實(shí)現(xiàn),在初始化索引查詢構(gòu)造器時通過 SearchRequestBuilder searchRequest = client.prepareSearch(indexProperties.getMeiqiaConversationIndex()).setTypes(indexProperties.getMeiqiaConversationType()).setQuery(query).setSize(100).setScroll(TimeValue.timeValueMinutes(1)); 設(shè)置 scroll 參數(shù)來實(shí)現(xiàn),同時需要再后續(xù)增加再次查詢索引邏輯,將 scorllId 循環(huán)傳遞 獲取全部數(shù)據(jù),最終改造后的獲取全部數(shù)據(jù)的代碼如下

    public AjaxResult getMeiqiaUidList(MeiqiaConversation meiqiaConversation) {
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //會話id
        Long convId = meiqiaConversation.getConvId();
        if (convId != null) {
            boolQuery.filter(QueryBuilders.termQuery("convId",convId));
        }
        //會話日期
        String convStartDate = (String) meiqiaConversation.getParams().get("convStartDate");
        String convEndDate = (String) meiqiaConversation.getParams().get("convEndDate");
        if (StringUtils.isNotEmpty(convStartDate)) {
            Date date = DateUtils.stringToDate(convStartDate, DateUtils.SDF_YMDHMS);
            boolQuery.filter(QueryBuilders.rangeQuery("convStartDate").gte(date.getTime()));
        }
        if (StringUtil.isNotEmptyString(convEndDate)) {
            Date date = DateUtils.stringToDate(convEndDate, DateUtils.SDF_YMDHMS);
            boolQuery.filter(QueryBuilders.rangeQuery("convEndDate").lte(date.getTime()));
        }
        //會話日期
        Date convStartDate2 = meiqiaConversation.getConvStartDate();
        Date convEndDate2 = meiqiaConversation.getConvEndDate();
        if (Objects.nonNull(convStartDate2)) {
            boolQuery.filter(QueryBuilders.rangeQuery("convStartDate").gte(convStartDate2.getTime()));
        }
        if (Objects.nonNull(convEndDate2)) {
            boolQuery.filter(QueryBuilders.rangeQuery("convEndDate").lte(convEndDate2.getTime()));
        }
        //學(xué)號
        String uid = (String) meiqiaConversation.getParams().get("uid");
        if (StringUtils.isNotEmpty(uid)) {
            if (uid.contains("#")) {
                String replace = uid.replace("#", "");
                boolQuery.filter(QueryBuilders.termQuery("clientInfo.name",replace));
            }else {
                boolQuery.filter(QueryBuilders.termQuery("clientInfo.uid",uid));
            }
        }
        //客服工號
        String agentId = (String) meiqiaConversation.getParams().get("agentId");
        if (StringUtils.isNotEmpty(agentId)) {
            boolQuery.filter(QueryBuilders.termQuery("agentId",agentId));
        }
        // 會話內(nèi)容
        String content = (String) meiqiaConversation.getParams().get("content");
        if (StringUtils.isNotEmpty(content)) {
            boolQuery.filter(QueryBuilders.matchPhrasePrefixQuery("convContent.content",content));
        }

        query.must(boolQuery);

        // 初始化搜索請求構(gòu)建器,用于構(gòu)造搜索請求
        SearchRequestBuilder searchRequest = client.prepareSearch(indexProperties.getMeiqiaConversationIndex())
                // 設(shè)置搜索的類型
                .setTypes(indexProperties.getMeiqiaConversationType())
                // 設(shè)置查詢條件
                .setQuery(query)
                // 設(shè)置返回結(jié)果的數(shù)量為100
                .setSize(100)
                // 設(shè)置滾動查詢的時間間隔為1分鐘
                .setScroll(TimeValue.timeValueMinutes(1));

        // 使用SearchRequest獲取搜索響應(yīng)
        SearchResponse searchResponse = searchRequest.get();
        // 初始化存儲所有搜索結(jié)果的列表
        List<EsMeiqiaConversation> rows = new ArrayList<>();
        // 格式化搜索響應(yīng)中的數(shù)據(jù),并添加到rows列表中
        List<EsMeiqiaConversation> list1 = formatMeiqiaDto(searchResponse);
        rows.addAll(list1);
        // 使用Scroll方式遍歷所有搜索結(jié)果
        do {
            // 準(zhǔn)備下一次Scroll搜索,設(shè)置滾動時間為1分鐘
            // 將scorllId循環(huán)傳遞 獲取全部數(shù)據(jù)
            searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()).setScroll(TimeValue.timeValueMinutes(1)).execute().actionGet();
            // 格式化新一批搜索結(jié)果,并添加到rows列表中
            List<EsMeiqiaConversation> list = formatMeiqiaDto(searchResponse);
            if (CollectionUtils.isNotEmpty(list)) {
                rows.addAll(list);
            }
            // 當(dāng)搜索結(jié)果為空時,結(jié)束循環(huán)
            // 當(dāng)searchHits的數(shù)組為空的時候結(jié)束循環(huán),至此數(shù)據(jù)全部讀取完畢
        } while (searchResponse.getHits().getHits().length != 0);

        // 創(chuàng)建一個ClearScrollRequest實(shí)例,用于清除滾動查詢的會話。
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();

        // 將上一次查詢返回的滾動ID添加到請求中,以便清除這個特定的會話。
        // 這是必要的,因?yàn)镃learScrollRequest需要至少一個滾動ID才能執(zhí)行清除操作。
        clearScrollRequest.addScrollId(searchResponse.getScrollId());

        // 發(fā)送ClearScroll請求并獲取操作的結(jié)果。
        // 這一步是必需的,因?yàn)樗鼘?shí)際執(zhí)行了清除滾動會話的操作,并允許我們處理結(jié)果或任何異常。
        client.clearScroll(clearScrollRequest).actionGet();

        //記錄返回的uid name
        List<MeiqiaConversation> list = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(rows)) {
            //獲取 uid name
            Map<String, List<EsMeiqiaConversation>> collect = rows.stream().collect(Collectors.groupingBy(EsMeiqiaConversation::getClientUid, Collectors.toList()));
            Set<String> uids = collect.keySet();
            for (String u : uids) {
                MeiqiaConversation conv = new MeiqiaConversation();
                conv.setUid(u);
                //同一個uid 對應(yīng)同一個 name
                List<EsMeiqiaConversation> esconv = collect.get(u);
                String name = esconv.get(0).getClientName();
                conv.setName(name);
                list.add(conv);
            }
        }
        return AjaxResult.success(list);
    }

那么這段的核心代碼是增加了滾動查詢數(shù)據(jù)的操作,如圖所示

同時再執(zhí)行循環(huán)查詢時將 scrollId 循環(huán)傳遞,并將查詢結(jié)果 addAll 到當(dāng)前l(fā)ist 的集合中

查詢結(jié)束之后,最后是清除滾動會話的操作

到這里關(guān)于 Java 實(shí)現(xiàn) es 查詢指定條件下的全部數(shù)據(jù)操作就結(jié)束了,整個操作過程比較容易理解,增加了 es 滾動查詢 scroll 操作來實(shí)現(xiàn)查詢 es 全部數(shù)據(jù)。

寫在最后

最后想要說的是,對于 es 查詢,通常情況下是不需要一次性查詢出當(dāng)前索引所有條件下的數(shù)據(jù)的,畢竟數(shù)據(jù)量比較大,但是也有特殊的場景,這個時候不得不一次性查詢出所有的數(shù)據(jù),這就需要上文中用到的辦法了,希望對大家有幫助。

到此這篇關(guān)于Java實(shí)現(xiàn)Elasticsearch查詢當(dāng)前索引全部數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Java Elasticsearch查詢當(dāng)前索引全部數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程

    使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程

    在現(xiàn)代 Java 開發(fā)中,我們經(jīng)常需要在不同的項(xiàng)目中使用不同版本的 JDK,手動切換 JAVA_HOME 環(huán)境變量既繁瑣又容易出錯,Jenv 是一個優(yōu)秀的 JDK 版本管理工具,可以讓我們輕松地在不同 JDK 版本間切換,所以本文給大家介紹了使用Jenv管理多版本JDK環(huán)境的詳細(xì)教程
    2025-08-08
  • 從零開始讓你的Spring?Boot項(xiàng)目跑在Linux服務(wù)器

    從零開始讓你的Spring?Boot項(xiàng)目跑在Linux服務(wù)器

    這篇文章主要給大家介紹了如何從零開始讓你的Spring?Boot項(xiàng)目跑在Linux服務(wù)器的相關(guān)資料,由于springboot是內(nèi)嵌了tomcat,所以可以直接將項(xiàng)目打包上傳至服務(wù)器上,需要的朋友可以參考下
    2021-11-11
  • 詳解Java8?StreamAPI中的map()方法

    詳解Java8?StreamAPI中的map()方法

    Stream?API?是Java8中新加入的功能,這篇文章主要帶大家了解一下?Stream?API?中的?map()?方法的使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • JavaWeb中Servlet的深入理解

    JavaWeb中Servlet的深入理解

    Java Servlet 是運(yùn)行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務(wù)器上的數(shù)據(jù)庫或應(yīng)用程序之間的中間層
    2021-10-10
  • java ConcurrentHashMap分段加鎖提高并發(fā)效率

    java ConcurrentHashMap分段加鎖提高并發(fā)效率

    這篇文章主要為大家介紹了java ConcurrentHashMap分段加鎖提高并發(fā)效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java的stream流多個字段排序的實(shí)現(xiàn)

    Java的stream流多個字段排序的實(shí)現(xiàn)

    本文主要介紹了Java的stream流多個字段排序的實(shí)現(xiàn),主要是兩種方法,第一種是固定多個字段排序和第二種動態(tài)字段進(jìn)行排序,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Springboot+JPA打印SQL日志過程

    Springboot+JPA打印SQL日志過程

    文章說明在Spring?Boot項(xiàng)目中配置Lombok插件、application.yml和logback.xml,以實(shí)現(xiàn)從前端接收活動名稱參數(shù),并輸出SQL語句及查詢參數(shù)用于調(diào)試
    2025-08-08
  • Java?熱更新?Groovy?實(shí)踐及踩坑指南(推薦)

    Java?熱更新?Groovy?實(shí)踐及踩坑指南(推薦)

    Apache的Groovy是Java平臺上設(shè)計的面向?qū)ο缶幊陶Z言,這門動態(tài)語言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺的腳本語言使用,這篇文章主要介紹了Java?熱更新?Groovy?實(shí)踐及踩坑指南,需要的朋友可以參考下
    2022-09-09
  • IntelliJ IDEA 關(guān)閉多余項(xiàng)目的操作方法

    IntelliJ IDEA 關(guān)閉多余項(xiàng)目的操作方法

    這篇文章主要介紹了IntelliJ IDEA 關(guān)閉多余項(xiàng)目的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 基于Mybatis實(shí)現(xiàn)CRUD操作過程解析(xml方式)

    基于Mybatis實(shí)現(xiàn)CRUD操作過程解析(xml方式)

    這篇文章主要介紹了基于Mybatis實(shí)現(xiàn)CRUD操作過程解析(xml方式),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論

大化| 揭阳市| 桓台县| 嵊泗县| 新营市| 丽江市| 共和县| 大庆市| 盐津县| 金乡县| 乐平市| 双辽市| 丹棱县| 连南| 郎溪县| 望都县| 化州市| 满城县| 确山县| 庄浪县| 长沙县| 阜平县| 福州市| 柘城县| 增城市| 靖州| 中西区| 乐都县| 乐都县| 安塞县| 南木林县| 昌黎县| 修文县| 筠连县| 贵港市| 三明市| 皋兰县| 新田县| 乌拉特中旗| 大丰市| 嘉义市|