ElasticSearch search_after 分頁

search_after 分頁的方式和 from - size 分頁 相似;search_after 能夠實時性更好,能根據文檔更新獲取最新的數據

在from-size 的基礎上 添加 “sort” 將from 去掉

{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        {"_id": "desc"}
    ]
}

然後再第二次查詢的時候 添加 search_after  值爲上一次查詢出來最後一條數據的doc_id

{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [ "654323"],
    "sort": [
        {"_id": "desc"}
    ]
}

轉換爲Java 代碼(第一次查詢)

SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource();
        BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
        BoolQueryBuilder keyQueryBuilder = new BoolQueryBuilder();
        keyQueryBuilder.should(QueryBuilders.termQuery("name", "123"));
        searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.size(10);
        searchSourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.ASC));
     
        SearchRequest request = new SearchRequest();
        request.indices("index").types("type").source(searchSourceBuilder);
        SearchResponse sr = client.search(request);
        SearchHits hits = sr.getHits();

後面查詢,searchSourceBuilder.searchAfter(sortValues) 這個裏面的值是上一次查詢出來的數據最後面一條的getSortValues()值

SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource();
        BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
        BoolQueryBuilder keyQueryBuilder= new BoolQueryBuilder();
        keyQueryBuilder.should(QueryBuilders.termQuery("name", "123"));
        searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.size(10);
        searchSourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.ASC));
        if(hits != null && hits.getHits().length == 10){
             Object[] sortValues= hits.getHits()[hits.getHits().length-1].getSortValues();
             searchSourceBuilder.searchAfter(sortValues);   
        }     

        SearchRequest request = new SearchRequest();
        request.indices("index").types("type").source(searchSourceBuilder);
        SearchResponse sr = client.search(request);
        SearchHits hits = sr.getHits();

發現一篇寫的好的文章https://blog.csdn.net/qq_40337206/article/details/94601978

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章