2016-04-01 138 views
0

我需要应用一个“OR”过滤器,它将等同于('a'或'b'或'c'或'd'或'e')类别的等效ES查询提供如下Elasticsearch java api或过滤器

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

我有下面提到的JAVA ES API代码,我很感兴趣的是在Java中添加OR过滤器。有人可以帮忙吗?

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); 

回答

1

根据你的例子,我假设你使用的是ES 1.x,并假定RangeQuery应该是一个查询。如果我理解你的问题正确,你想要做这样的事情:

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")) 
) 

但是,您也可以使用terms filter

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

非常感谢你迈克尔! –