Adithya Kumar
Adithya Kumar

Reputation: 159

Elasticsearch java api or filter

I need to apply an "OR" filter, which would be equivalent to category in ('a' or 'b' or 'c' or 'd' or 'e') an equivalent ES query is provided below

"query_string": {
                      "query": "category: (\"a\", \"b\", \"c\", \"d\", \"e\")"
                   }

I have this below mentioned JAVA ES API code and I am struck in adding OR filter in Java. Can somebody help please?

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
     searchSourceBuilder.query(QueryBuilders.boolQuery()
                .must(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
                        FilterBuilders.termFilter("category","a")))
                .must(QueryBuilders.rangeQuery("@timestamp").from(fromHr).to(toHr)))
                .fields(fieldList);

Upvotes: 0

Views: 834

Answers (1)

Michael Stockerl
Michael Stockerl

Reputation: 749

Based on your example, I assume you are using ES 1.x and assume the RangeQuery should be a query. If I understand your question correctly you want do something like this:

QueryBuilders.filteredQuery(
 QueryBuilders.rangeQuery("@timestamp").from(fromHr).to(toHr),
 FilterBuilders.boolFilter()
  .should(FilterBuilders.termFilter("category","a"))
  .should(FilterBuilders.termFilter("category","b")) 
  .should(FilterBuilders.termFilter("category","c")) 
  .should(FilterBuilders.termFilter("category","d"))   
  .should(FilterBuilders.termFilter("category","e"))
)

However, you can also use the terms filter:

QueryBuilders.filteredQuery(
  QueryBuilders.rangeQuery("@timestamp").from(fromHr).to(toHr),
  FilterBuilders.termsFilter("category", "a", "b", "c", "d", "e", "f" ))

Upvotes: 1

Related Questions