//跨索引查詢
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()拼接起來