最近公司再用ElasticSearch做關鍵字全文檢索,看了一些網上的使用教程,大多是單個條件的查詢,現實業務用的不多,這次結合網上的使用教程和公司的實際業務需求記錄一條多條件的查詢寫法.
查詢 name字段是張三且code字段為1或2或3(或code以1/2/3開頭),這個查詢比較有代表性,可以根據這一種情況的寫法擴展出其他多條件范圍內的查詢寫法:
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
1)第一種
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
QueryBuilder boolQueryBuilder_1= QueryBuilders.termQuery("name", "張三");
boolQueryBuilder.must(boolQueryBuilder_1);
BoolQueryBuilder boolQueryBuilder_2 = QueryBuilders.boolQuery();
list.forEach(temp ->{
boolQueryBuilder_2.should(QueryBuilders.termQuery("code", temp));
});
boolQueryBuilder.must(boolQueryBuilder_2);
第一種循環遍歷list的方法可以把boolQueryBuilder_2.should里面換成前綴查詢QueryBuilders.PrefixQuery("code", temp),達到前綴在一個范圍內的效果
2)第二種
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
QueryBuilder boolQueryBuilder_1= QueryBuilders.termQuery("name", "張三");
QueryBuilder boolQueryBuilder_2= QueryBuilders.termsQuery("code", list); //注意此為termsQuery
boolQueryBuilder.must(boolQueryBuilder_1).must(boolQueryBuilder_2);
and和or同時出現時es的寫法:寫兩個booleanQuery,第一個:boolQuery.must,把所有要and的條件加進去,第二個boolQuery_2.should,把所有要or的條件加進去,再boolQuery.must(boolQuery_2)把boolean2加到boolean1里。