2016-04-13 2 views
1

Я хотел бы построить запрос к elasticsearch с использованием критериев поиска из html-формы. У меня есть несколько полей ввода на странице html. Например, если пользователь заполнить два из этих полей я мог бы написать:Как построить динамический запрос elasticsearch

BoolQueryBuilder query = QueryBuilders.boolQuery() 
           .must(QueryBuilders.termQuery("archivo", "archivo1")) 
           .must(QueryBuilders.termQuery("nombre", "documento1")); 

... Но что, если пользователь заполнить три поля я мог бы иметь:

BoolQueryBuilder query = QueryBuilders.boolQuery() 
         .must(QueryBuilders.termQuery("archivo", "archivo1")) 
         .must(QueryBuilders.termQuery("nombre", "documento1")) 
         .must(QueryBuilders.termQuery("third", "test")); 

Есть ли способ dinamicall строить такие запросы?

ответ

5

BoolQueryBuilder.must() добавляет предикат, он не заменяет предыдущий.

Поэтому предположим, что значение поля archivo в переменной inputArchivo и так далее, вы можете проверить, если поле заполняется затем добавить предикат:

BoolQueryBuilder query = QueryBuilders.boolQuery(); 
if(inputArchivo != null && !inputArchivo.isEmpty()) { 
    query.must(QueryBuilders.termQuery("archivo", inputArchivo)); 
} 

if(inputNombre != null && !inputNombre.isEmpty()) { 
    query.must(QueryBuilders.termQuery("nombre", inputNombre)); 
} 

if(inputThird != null && !inputThird.isEmpty()) { 
    query.must(QueryBuilders.termQuery("third", inputThird)); 
} 

и все же, если вы этого не сделаете знаете, какие условия придут, вы можете перебирать HashMap со значениями:

for (Map.Entry<String, Object> entry : map.entrySet()) { 
    query.must(QueryBuilders.termQuery(entry.getKey, entry.getValue)) 
} 
+0

Отличный !!! Спасибо!! –

Смежные вопросы