2016-04-01 4 views
0

Мне нужно применить фильтр «ИЛИ», который будет эквивалентен категории в («a» или «b» или «c» или «d» или «e») эквивалентный запрос ES приводится нижеElasticsearch java api или filter

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

У меня есть указанный ниже код JAVA ES API, и я поражен добавлением фильтра ИЛИ на Java. Может кто-нибудь помочь, пожалуйста?

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

Спасибо так много Micheal! –