sbo
sbo

Reputation: 961

Spring boot elasticsearch "search_after"

How can I add "search_after" (https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search-request-search-after.html) to my elasticsearch queries within spring boot NativeSearchQueryBuilder?

Upvotes: 3

Views: 1843

Answers (1)

Ivan T.
Ivan T.

Reputation: 31

Yes, you can combine NativeSearchQueryBuilder with a custom query to get the needful result.

NativeSearchQueryBuilder doesn't provide a way to add search after.

But you can use a query built with a native builder to make a string query request with the search after parameters.

Here is an example.

import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.EntityMapper;

...

var queryBuilder = new NativeSearchQueryBuilder().withQuery(BoolQueryBuilder.boolQuery());

var jsonQuery = new JSONObject();
jsonQuery.put("size", SEARCH_AFTER_PAGE_SIZE);
jsonQuery.put("query", new JSONObject(queryBuilder.build().getQuery().toString()));
     
var sortList = new JSONObject();
for (Sort.Order order : sort) {
    sortList.put(order.getProperty(), order.getDirection());
}
jsonQuery.put("sort", sortList);

String businessSortMarker = "previous order value 1";
String tiebreakerSortMarker = "previous order value 2";
if (searchAfterParameters != null) {
    jsonQuery.put("search_after", Arrays.asList(businessSortMarker, tiebreakerSortMarker));
}
var query = new Search.Builder(searchAfterQuery.toString()).build();
SearchResult result =  client.execute(query);
var resultPage = new SearchResultsPage<ResultObject>();

EsEntityMapper documentsMapper = new EsEntityMapper();
searchResult.getHits(JsonObject.class).stream()
            .map(hitJson -> hitJson.source)
            .map(source -> documentsMapper.mapToObject(searchResultJson.toString(), SearchResult.class))
            .collect(Collectors.toList());
//map the documents itself (content)
var resultObject = mapHitsSourceToResultObjects(searchResult);
resultPage.setContent(resultObject);

You can check out more details here: https://www.shardik.com/blog/2021/03/09/es-deep-search/

Upvotes: 2

Related Questions