riorio
riorio

Reputation: 6826

How to do AND + OR query in ElasticSerch & Java

I'm trying to perform the Elastic equivalent to the following in SQL:

select * from Pets 
where type is 'cat'
and age > 10
and name in ("Barry", "Oscar", .....)  

I have the following Java code:

SearchRequest searchRequest = new SearchRequest(elasticIndexName);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("type", "cat"));
queryBuilder.must(QueryBuilders.rangeQuery("age").from("10"));
queryBuilder.must(QueryBuilders.termQuery("name", "Oscar"));
queryBuilder.must(QueryBuilders.termQuery("name", "Barry"));

But, if I understand correctly, the last two "must" statements are contradicting each other. I tried to use the "should" term but it seems to bring all the cat names.

Upvotes: 1

Views: 272

Answers (2)

Devratna
Devratna

Reputation: 1008

instead of the term query, I think you should try this, it'll help you to get the best results.

BoolQueryBuilder boolQueryBuilder = boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("type", cat));
boolQueryBuilder.must(QueryBuilders.rangeQuery("age").gt(10));
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(String.join(" ", Arrays.asList("Barry", "Oscar"), name).type(Type.BEST_FIELDS));

Upvotes: 0

Val
Val

Reputation: 217324

You're almost there, you need to do it like this (i.e. use a terms query):

SearchRequest searchRequest = new SearchRequest(elasticIndexName);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("type", "cat"));
queryBuilder.must(QueryBuilders.rangeQuery("age").from("10"));
queryBuilder.must(QueryBuilders.termsQuery("name", "Oscar", "Barry"));

Upvotes: 2

Related Questions