hellzone
hellzone

Reputation: 5236

How to create a search with or clause using Elasticsearch

I want to create a query with Elasticsearch Java API but I don't know how to create an OR clause? What I want to query is;

SELECT * 
FROM USERS 
WHERE (user.name = "admin") AND (user.message LIKE "test*") AND (user.age = "30" OR user.status = "major")

I have created a query like below but I don't know how to create an OR clause like sql query;

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

boolQueryBuilder.must(QueryBuilders.matchQuery("name", "admin"));
boolQueryBuilder.must(QueryBuilders.matchQuery("message", "test*"));

boolQueryBuilder.must(QueryBuilders.matchQuery("age", "30"));
boolQueryBuilder.must(QueryBuilders.matchQuery("status","major"));

Upvotes: 3

Views: 2230

Answers (2)

Val
Val

Reputation: 217254

You simply need to capture the OR condition inside another bool/should query

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

boolQueryBuilder.must(QueryBuilders.matchQuery("name", "admin"));
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("message", "test*"));

BoolQueryBuilder orQuery = QueryBuilders.boolQuery();
orQuery.should(QueryBuilders.matchQuery("age", "30"));
orQuery.should(QueryBuilders.matchQuery("status","major"));
orQuery.minimumNumberShouldMatch(1);
boolQueryBuilder.must(orQuery);

PS: not sure why you have a mustNot for your second constraint.

Upvotes: 9

The "should" keyword in bool queries works like "OR", but in Elasticsearch those queries are not very sharp as everything is scored. Have a look at:

https://www.elastic.co/guide/en/elasticsearch/guide/current/bool-query.html#bool-query

Also there are very good examples in the book Elasticsearch in Action.

Upvotes: 0

Related Questions