elasticsearch整合springboot实现多条件查询
1.添加依赖
首先添加一个elastisearch整合springboot的依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.2</version>
</dependency>
也可以去官方网站上去看看,官网对于这些功能的介绍也很清楚【官网地址】
多条件查询
首先给大家看看我是怎么写的,再给大家讲一下我自己的理解,同时也欢迎各位大佬的指正。
//从elaticsearch中根据条件查询
public R findconditionbyes(ProductconditionReq req) throws IOException {
SearchRequest request1 = new SearchRequest("titems");
//构建搜索条件
SearchSourceBuilder builder = new SearchSourceBuilder();
//按照颜色查询方法,其中keyword表示不分词匹配,把该词当成一个整体
//QueryBuilders.matchQuery()表示模糊查询
//QueryBuilders.termQuery()表示精确查询
//多条件查询
// BoolQueryBuilder must = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("item_color.keyword", req.getItem_color()))
// .must(QueryBuilders.matchQuery("item_brand.keyword", req.getItem_brand()));
//条件判断,如果传入的属性为空的话则不执行该查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if(null != req.getItem_brand()){
boolQueryBuilder.must(QueryBuilders.matchQuery("item_brand.keyword", req.getItem_brand()));
}
if(null != req.getItem_color()){
boolQueryBuilder.must(QueryBuilders.matchQuery("item_color.keyword", req.getItem_color()));
}
//QueryBuilders.boolQuery().should(QueryBuilders.matchQuery()).should()
//单条件查询
// MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("item_color.keyword", req.getItem_color());
builder.query(boolQueryBuilder);
builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
request1.source(builder);
SearchResponse search = restHighLevelClient.search(request1, RequestOptions.DEFAULT);
List<Map<String, Object>> list = new ArrayList<>();
for(SearchHit documentFields : search.getHits().getHits()){
list.add(documentFields.getSourceAsMap());
}
return R.ok(list);
以上就是我自己编写的多条件方法查询,主要过程就是
1.先创建一个SearchRequest搜索请求
2.然后还需要创建一个SearchSourceBuilder搜索条件用于接收所有的查询条件
3.我这里还添加一个判断,如果出入的参数为空的则不添加该查询条件到SearchSourceBuilder中
4.多条件查询的我还需要创建一个BoolQueryBuilder对象
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
5.现在我们就可以将条件依次添加到boolQueryBuilder中了
if(null != req.getItem_brand()){
boolQueryBuilder.must(QueryBuilders.matchQuery("item_brand.keyword", req.getItem_brand()));
}
if(null != req.getItem_color()){
boolQueryBuilder.must(QueryBuilders.matchQuery("item_color.keyword", req.getItem_color()));
}
这里的must就是相当于我们mysql中的and关键字,如果你想用的是mysql中共的or关键字的话可以将must换成shoud。
6.我们再将这个boolQueryBuilder对象装入SearchSourceBuilder对象中,然后再将SearchSourceBuilder放入SearchRequest请求中执行。
builder.query(boolQueryBuilder);
builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
request1.source(builder);
SearchResponse search = restHighLevelClient.search(request1, RequestOptions.DEFAULT);
List<Map<String, Object>> list = new ArrayList<>();
for(SearchHit documentFields : search.getHits().getHits()){
list.add(documentFields.getSourceAsMap());
}
return R.ok(list);
以上就是我理解的多条件查询的全部过程了。有什么不对的地方欢迎各位的指正。谢谢。