I am facing a problem in building an elasticsearch query in Java.
I want to search all the documents where either a field X is not present OR if it is present, return all those documents where the value inside field X is “tag1”
Currently, I have written this query in Java:
BoolQueryBuilder boolQueryBuilder = boolQuery();` boolQueryBuilder.mustNot(QueryBuilders.existsQuery("X"));` boolQueryBuilder.filter(termsQuery("X", "tag1"));`
The SQL query for this would be something like:
select * from table_name where X is null or x = 'tag1';
But doing this gives me empty search results. However, if I search each of these queries individually, it works fine.
Advertisement
Answer
You need to use should
BoolQueryBuilder subBoolQuery = boolQuery(); subBoolQuery.mustNot(QueryBuilders.existsQuery("X")); BoolQueryBuilder boolQueryBuilder = boolQuery(); BoolQueryBuilder.minimumShouldMatch(1); boolQueryBuilder.should(subBoolQuery); boolQueryBuilder.should(termsQuery("X", "tag1"));
Elasticsearch query :
{ "query": { "bool": { "should": [ { "term": { "X": { "value": "tag1" } } }, { "bool": { "must_not": [ { "exists": { "field": "X" } } ] } } ], "minimum_should_match": 1 } } }