ES 中的and 和 or 查询
//跨索引查询
SearchRequest request = new SearchRequest(index1,index2);
在es中想实现类似于下面的查询,废话不多说,es的should查询代替的是or,但是必须搭配must来使用
select * from table where (a != 1 and b != 1) or (startTime> “2022-05-20” and (a == 1 or b == 1))
直接上代码
1 @Autowired 2 private RestHighLevelClient client; 3 public List<Map<String,Object>> searchList(String index1,String index2,Map<String,Object> paramMap 4 ,String time,int page,int size) { 5 List<Map<String,Object>> hitList = new ArrayList(); 6 try { 7 //搜索请求 8 SearchRequest request = new SearchRequest(index1,index2); 9 //请求条件构建器,这里和mybatis中的自定义查询有点类型 10 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 11 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); 12 13 //等于条件(其他的一些条件) 14 if (paramMap != null && !paramMap.isEmpty()) { 15 paramMap.forEach((k, v) -> { 16 boolQueryBuilder.must(QueryBuilders.termsQuery(k + KEYWORD, v)); 17 }); 18 } 19 20 21 BoolQueryBuilder query1 = QueryBuilders.boolQuery(); 22 query1.mustNot(QueryBuilders.termsQuery("a" + ".keyword", "1")); 23 query1.mustNot(QueryBuilders.termsQuery("b" + ".keyword", "1")); 24 25 BoolQueryBuilder query2 = QueryBuilders.boolQuery(); 26 //时间范围查询 27 if (StringUtils.isNotBlank(time)) { 28 query2.must(QueryBuilders.rangeQuery("startTime"+KEYWORD).from(time)); 29 } 30 31 BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); 32 shouldQuery.should(QueryBuilders.wildcardQuery("a" , "1")); 33 shouldQuery.should(QueryBuilders.wildcardQuery("b" , "1")); 34 query2.must(shouldQuery); 35 36 BoolQueryBuilder query3 = QueryBuilders.boolQuery(); 37 query3.should(query1); 38 query3.should(query2); 39 boolQueryBuilder.must(query3); 40 41 42 //把查询添加放入请求中 43 sourceBuilder.query(boolQueryBuilder); 44 request.source(sourceBuilder); 45 //起始位置 46 sourceBuilder.from((page - 1) * size); 47 //查询数量 48 sourceBuilder.size(size); 49 sourceBuilder.trackTotalHits(true); 50 //建立SearchResponse 51 SearchResponse response; 52 53 response = client.search(request, RequestOptions.DEFAULT); 54 //封装查询的信息 55 for (SearchHit hit : response.getHits().getHits()) { 56 hitList.add(hit.getSourceAsMap()); 57 log.debug("查询结果:{}", hit.getSourceAsString()); 58 } 59 } catch (IOException e) { 60 e.printStackTrace(); 61 } 62 return hitList; 63 }
将每一块拆成一个BoolQueryBuilder ,最后or用should()拼接起来
分类:
Java高级编程
, 搜索引擎ES/SLOR
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战