'Java ElasticSearch API search multiple possible values

I'm searching in multiple fields, and I want to get results if the record matches a specific value (entry.getValue()) or the String "ALL"

Here is my code, but it's not working.

SearchRequest searchRequest = new SearchRequest(MY_INDEX);
final BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
searchRequest.source().query(booleanQuery);
final BoolQueryBuilder booleanQuery= QueryBuilders.boolQuery();
for (Map.Entry<String, String> entry : params.entrySet()) {
              booleanQuery.should(QueryBuilders.termsQuery(entry.getKey(), entry.getValue(), "ALL");
        }

I'm using JDK 11 and ES 7.1



Solution 1:[1]

Here is a sample code written for country index which is searching for data provided in map. Customize it according to your needs.

//using map for country
    Map<String, String> map = new HashMap<>();
    map.put("country" , "FRANCE");
    map.put("countryCode", "FR");
    //List of should queries this will go in should clause of bool query
    List<Query> shouldQueryList = new ArrayList<>();
    for (Map.Entry<String, String> entry :map.entrySet()) {
        //list of terms to match i.e value from map and all.
        List<FieldValue> list = Arrays.asList(FieldValue.of(entry.getValue()), FieldValue.of("ALL"));
        //Terms query
        Query query = new Query.Builder().terms(termsQueryBuilder -> termsQueryBuilder
                .field(entry.getKey())
                .terms(termQueryField -> termQueryField
                        .value(list))).build();
        shouldQueryList.add(query);
    }

    try {
        //running search from elastic search java client 7.16.3
        SearchResponse<Country> response = elasticsearchClient.search(searchRequest -> searchRequest
                        .query(qBuilder -> qBuilder
                                .bool(boolQueryBuilder -> boolQueryBuilder
                                        //using should query list here
                                        .should(shouldQueryList)))
                , Country.class);
        response.hits().hits().forEach(a -> {
            //Print matching country name in console
            System.out.println(a.source().getCountry());
        });
    } catch (IOException e) {
        log.info(e.getMessage());
    }

Above code will generate query like this :

{"query":{"bool":{"should":[{"terms":{"country":["FRANCE","ALL"]}},{"terms":{"countryCode":["FR","ALL"]}}]}}}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Abhishek Singh