I am using elastic RestHighLevelClient to talk to ES. I can query basic queries. However, I am trying to use the search_after api to design a paginated api from my front-end queries. Although query_after is simple to use in the RestLowLevelClient api, I am not able to figure out how to use it in the HighLevel API.
It looks like the Lucene api has SearchAfterSortedDocQuery, but I cannot figure out how to use it with the elastic search api. For example: in the code below I initialize SearchAfterSortedDocQuery query but am not sure how to use it.
RestHighLevelClient client = ESRestClient.getClient();
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1",value1));
searchSourceBuilder.query(QueryBuilders.termQuery("field2",value2));
searchSourceBuilder.from(0);
searchSourceBuilder.size(limit);
SortField[] sortFields = new SortField[2];
sortFields[0]= new SortField("field1", SortField.Type.LONG);
sortFields[1]= new SortField("field2", SortField.Type.LONG);
FieldDoc fieldDoc = new FieldDoc(0,0); //Is this correct? how to initialize field doc?
fieldDoc.fields = new Object[2];
fieldDoc.fields[0] = new Long("-156034");
fieldDoc.fields[1] = new Long("2297416849");
SearchAfterSortedDocQuery query = new SearchAfterSortedDocQuery(new Sort(sortFields), fieldDoc);
searchRequest.source(searchSourceBuilder);
searchRequest.indices("index1");
try {
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(response);
}
catch(IOException e){
System.out.println(e);
}
}
I think instead of you using SearchAfterSortedDocQuery, just set search_after in searchSourceBuilder look like below
after that use SearchRequest and rest client to get the response
final you should keep the last sort value by getSortValues() from hits to go to the next page.
Elasticsearch search_after api
hope this help.