最近公司再用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里。