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.youkuaiyun.com/qq_40337206/article/details/94601978