Elasticsearch7.6.2 RestHighLevelClient查詢用法 must should(and or 關係)
阿新 • • 發佈:2022-03-24
1. 引入jar
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.2</version>
</dependency>
2. 初始化RestHighLevelClient
@Configuration public class ElasticSearchClientConfig { @Value("${es.hostname}") private String hostname; @Value("${es.port}") private Integer port; @Value("${es.scheme}") private String scheme; @Bean("esClient") public RestHighLevelClient esClient(){ RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(hostname, port, scheme))); return client; } }
4. 查詢
@Slf4j @Component public class MzChangeLogDao { @Value("${mk.mz.changLog.index}") private String indexName; @Autowired @Qualifier("esClient") private RestHighLevelClient restHighLevelClient; public List<Object> queryChangeLog(String table, String dbName, String elementsId, String idField) { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(QueryBuilders.matchQuery("fieldA", table)); boolQueryBuilder.must(QueryBuilders.matchQuery("filedB", dbName)); if (StringUtils.isNotBlank(elementsId)) { BoolQueryBuilder shouldQueryBuilder = QueryBuilders.boolQuery(); String[] idFiledArr = idField.split(","); for (String id : idFiledArr) { shouldQueryBuilder.should(QueryBuilders.matchQuery(id, elementsId)); } boolQueryBuilder.must(shouldQueryBuilder); } searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.from(0); searchSourceBuilder.size(100); searchSourceBuilder.sort(new FieldSortBuilder("log_time").order(SortOrder.DESC)); SearchRequest searchRequest = new SearchRequest(indexName); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = null; try { searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); } catch (Exception e) { // 這裡有可能會拋ElasticsearchException,比如沒索引 沒欄位啥的 log.error("請求ES出錯: ", e); throw new BizException("請求ES出錯: ", e); } List<Object> retList = new ArrayList<>(); // 根據狀態和資料條數驗證是否返回了資料 if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) { SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { // 將 JSON 轉換成物件 //UserInfo userInfo = JSON.parseObject(hit.getSourceAsString(), UserInfo.class); Object json = JSONObject.parse(hit.getSourceAsString()); retList.add(json); } } return retList; } }
5. must should 解釋
用 mysql語法 舉例比如 要查詢
where fieldA = 'aaaa' and filedB = 'bbbbb' and (filedC = 'c1' or filedC = 'c2');
對於上述查詢,針對ES: RestHighLevelClient查詢的寫法為利用 must
和 should
配合:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(QueryBuilders.matchQuery("fieldA", "aaaa")); boolQueryBuilder.must(QueryBuilders.matchQuery("filedB", "bbbb")); BoolQueryBuilder shouldQueryBuilder = QueryBuilders.boolQuery(); shouldQueryBuilder.should("filedC", "c1"); shouldQueryBuilder.should("filedC", "c2"); boolQueryBuilder.must(shouldQueryBuilder); ...