1. 程式人生 > 其它 >Elasticsearch7.6.2 RestHighLevelClient查詢用法 must should(and or 關係)

Elasticsearch7.6.2 RestHighLevelClient查詢用法 must should(and or 關係)

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查詢的寫法為利用 mustshould 配合:

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);

...