Springboot使用ES的基操
一、使用NativeSearchQuery查詢:
以下代碼羅列了幾種使用方式,可以通過組合實現其他復雜查詢。
package com.chx.util; import com.alibaba.fastjson.JSONObject; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import java.util.ArrayList; import java.util.List; public class EsTest { @Autowired private ElasticsearchOperations elasticsearchOperations; public void test() { //設置查詢的表名 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withIndices("tableName"); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //filter相當於and,和must的主要區別在於不進行打分(_score) boolQuery.filter(QueryBuilders.boolQuery().filter(QueryBuilders.termQuery("columns", "QL"))); boolQuery.filter(QueryBuilders.termQuery("column", "00")); //查詢時間區間的方式 boolQuery.filter(QueryBuilders.rangeQuery("time") .from("2020-11-10") .to("2020-12-20")); BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery(); //有時候會有需求,前端傳過來list進行查詢,所以要注意層級關系。用新的BoolQueryBuilder封裝條件,最后放到最外層里,這樣就組合成了where (xxx) and (xxx) or (xxx)這種形式 String[] flags = new String[]{"1", "2", "3", "4"}; for (String twoLabel : flags) { boolQuery2.should(QueryBuilders.termsQuery("twoLabel", twoLabel)); } //要查詢出的列名,如果不設置則默認全部。 String[] columns = new String[]{"column1", "column2", "column3"}; //設置查詢層級關系。組合查詢條件 boolQuery.filter(boolQuery2); queryBuilder.withQuery(boolQuery); queryBuilder.withFields(columns); //設置排序條件 queryBuilder.withSort(SortBuilders.fieldSort("column_sort").order(SortOrder.ASC)); NativeSearchQuery build = queryBuilder.build(); //獲取查詢結果 SearchHits resultEs = elasticsearchOperations.query(build, response -> { return response.getHits(); }); SearchHit[] hits = resultEs.getHits(); List mktCustomStructList = new ArrayList<>(); for (SearchHit hit : hits) { //查詢結果轉換 String sourceAsString = JSONObject.parseObject(hit.getSourceAsString(), String.class); //如果要從hit里取,可以用hit.getSourceAsMap0.get("columns").toString()方法 } } }
二、ES條件查詢的條數。
public void testCount(){ //設置查詢的表名 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withIndices("tableName"); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //filter相當於and boolQuery.filter(QueryBuilders.boolQuery().filter(QueryBuilders.termQuery("columns", "QL"))); boolQuery.filter(QueryBuilders.termQuery("column", "00")); //要查詢出的列名,如果不設置則默認全部。 String[] columns = new String[]{"column1", "column2", "column3"}; //設置查詢層級關系。組合查詢條件 queryBuilder.withQuery(boolQuery); queryBuilder.withFields(columns); //設置排序條件 queryBuilder.withSort(SortBuilders.fieldSort("column_sort").order(SortOrder.ASC)); NativeSearchQuery build = queryBuilder.build(); long count = elasticsearchOperations.count(build); System.out.println(count); }
三、注意點:
1.我maven引入的es版本如下,三個包。如果不用count函數,elasticsearch-rest-high-level-client和elasticsearch不用引用。
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.8.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.0</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
2.一定要注意引入的版本對安裝的ES客戶端否支持,盡量引入的包要高於安裝的ES版本。否則甚至會啟動報錯或執行錯誤(執行過程中報錯或執行結果不正確)。
3.如果發生了exception is java.lang.NoSuchFieldError:IGNORE_DEPECATIONS的小伙伴,引入上述中的elasticsearch包即可解決。