ElastaticSearch -- es深度分頁 searchAfter


searchAfter深度分頁

es一次只能查1萬條數據,如果超過1萬,會報錯如下:

        "reason": {
          "type": "query_phase_execution_exception",
          "reason": "Result window is too large, from + size must be less than or equal to: [10000] but was [10001]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."
        }

可以調整es配置的index.max_result_window這個參數,來查詢更多的數據,但這並不是很好的辦法,最好使用 searchAfter.

searchAfter作用類似於以下sql語句:

-- 查詢第10001--10005條數據
SELECT * FROM  t_user  order by name,birthDay  LIMIT 10000,5;

dsl

  • 第一次查詢,查詢1--10000條數據,找出第10000條數據的排序字段結果
GET /user_info/_search
{
	"size": 10000,
	"sort": [{
		"name": {
			"order": "asc"
		}
	 },
	 {
		"birthDay": {
			"order": "desc"
		}
	}]
}
  • 第二次查詢,根據上面最后一條數據的排序字段,查詢出第 10001--20000條數據;
    多了一個search_after的查詢條件,對應的排序字段為第一步查出來的最后一條數據(也就是第10000條數據)的排序字段
GET /user_info/_search
{
	"size": 10000,
	"sort": [{
		"name": {
			"order": "asc"
		}
	 },
	 {
		"birthDay": {
			"order": "desc"
		}
	}],
	"search_after": ["wang", "1993-12-01"]
}

java代碼

    public SearchSourceBuilder searchAfterTest() {
        SearchSourceBuilder searc = new SearchSourceBuilder().size(10000);

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//        boolQuery.filter(QueryBuilders.termQuery("province", "深圳市"));

        searc.sort("name", SortOrder.ASC).sort("birthDay", SortOrder.DESC);

        String[] searchAfter = new String[]{"wang", "1993-12-01"};
        searc.searchAfter(searchAfter);

        return searc.query(boolQuery);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM