2016-04-13 3 views
1

htmlフォームの検索条件を使用してelasticsearchにクエリを作成したいと考えています。私はhtmlページにいくつかの入力フィールドを持っています。ユーザーは三つのフィールドを埋めた場合、私が持っている可能性がどのようなダイナミッククエリelasticsearchを構築するには

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

をしかし...:ユーザーがこれらのフィールドのうちの2つを満たしている場合たとえば、私は書くことができ

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

グレート!!!ありがとうございました!! –

関連する問題