Reputation: 6826
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
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
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