How to build a query using NativeSearchQueryBuilder from List of QueryBuilder in Spring boot?

Viewed 26

I have added a list of QueryBuilders if certain properties are matched. Now, I want to search using these list.

    @Override
    public List<com.example.jobcandidatemanagement.documents.Job> searchJobs(String phrase, LocalDate startDate, LocalDate endDate, double offeredSalary, Availability availability) {

        List<QueryBuilder> searchQueries = new ArrayList<>();

        if (phrase != null) {
            QueryBuilder byPhrase = QueryBuilders.multiMatchQuery(phrase, "position", "description");
            searchQueries.add(byPhrase);
        }

        if (startDate != null && endDate != null) {
            QueryBuilder byStartDate = QueryBuilders.rangeQuery("startDate").gt(JsonData.of(startDate));
            QueryBuilder byEndDate = QueryBuilders.rangeQuery("endDate").lt(JsonData.of(endDate));
            searchQueries.add(byStartDate);
            searchQueries.add(byEndDate);
        }

        if (offeredSalary >= 0) {
            QueryBuilder byOfferedSalary = QueryBuilders.rangeQuery("offeredSalary").lte(offeredSalary);
            searchQueries.add(byOfferedSalary);
        }

        if (availability != null) {
            QueryBuilder byAvailability = QueryBuilders.matchQuery("availability", availability);
            searchQueries.add(byAvailability);
        }

    }

I want to create a query using these all above queryBuilder. Something like this :

Query query = new NativeSearchQueryBuilder().withQuery(byPhrase)
                                            .withQuery(byStartDate)
                                            .withQuery(byEndDate)
                                            .withQuery(byOfferedSalary)
                                            .withQuery(byAvailability)
                                            .build();
1 Answers

You can rewrite your method to add every new QueryBuilder not in a List, but in a BoolQueryBuilder by using its must(QueryBuilder queryBuilder) method:

BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

if (phrase != null) {
    QueryBuilder byPhrase = QueryBuilders.multiMatchQuery(phrase, "position", "description");
    boolQueryBuilder.must(byPhrase);
}
// adding other builders

BoolQueryBuilder also implements QueryBuilder interface, so then you can do this:

Query query = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).build();

Note, that must() method means that passed query must appear in the matching documents and will contribute to scoring. If you don't want to affect scoring, try filter(QueryBuilder queryBuilder), which does the same, but passed query will not contribute to scoring.

Related