接第25節(jié)
3、使用
在上一小節(jié)中實現(xiàn)了創(chuàng)建索引,這一小節(jié)來試一下數(shù)據(jù)的檢索功能。
在代碼中實現(xiàn) 搜索address中包含mill的所有人的年齡分布以及平均薪資
這個功能,如果是在 kibana 中,使用的是下面的DSL語句:
GET /bank/_search
{
"query": { //查詢
"match": {
"address": "mill"
}
},
"aggs": { //聚合
"ageAgg": { //年齡分布
"terms": {
"field": "age",
"size": 10 //只取10中聚合的結(jié)果
}
},
"balanceAvg":{//平均薪資
"avg": {
"field": "balance"
}
}
}
}
結(jié)果如下圖所示:
在這里插入圖片描述
要在 SpringBoot 集成環(huán)境中該如何實現(xiàn)呢?下面來使用代碼實現(xiàn)上面的功能。
1)、測試類 PafcmallSearchApplicationTests.java
中添加測試方法searchData()
:
/**
* 檢索數(shù)據(jù)
*
* @throws IOException
*/
@Test
void searchData() throws IOException {
// 1、創(chuàng)建檢索請求
SearchRequest searchRequest = new SearchRequest();
// 指定索引
searchRequest.indices("bank");
// 指定DSL,檢索條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 1.1)、構(gòu)造檢索條件
// sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));
// sourceBuilder.from(0);
// sourceBuilder.size(5);
// sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
// 聚合數(shù)據(jù)
// 1.2)、根據(jù)年齡分布聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);
// 1.3)、計算平薪資
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
searchSourceBuilder.aggregation(balanceAvg);
System.out.println("檢索條件:"+searchSourceBuilder.toString());
searchRequest.source(searchSourceBuilder);
// 2、執(zhí)行檢索
SearchResponse searchResponse = client.search(searchRequest, PafcmallElasticsearchConfig.COMMON_OPTIONS);
// 3、分析結(jié)果 searchResponse
System.out.println(searchResponse.toString());
//3.1)、獲取所有查到的數(shù)據(jù)
SearchHits hits = searchResponse.getHits(); // 獲取到最外圍的 hits
SearchHit[] searchHits = hits.getHits(); // 內(nèi)圍的 hits 數(shù)組
for (SearchHit hit : searchHits) {
/**
* "_index":"bank",
* "_type":"account",
* "_id":"970",
* "_score":5.4032025,
* "_source":{
*/
// hit.getIndex();hit.getType()''
String str = hit.getSourceAsString();
Account account = JSON.parseObject(str, Account.class);
System.out.println(account.toString());
}
//3.1)、獲取這次檢索到的分析數(shù)據(jù)
Aggregations aggregations = searchResponse.getAggregations();
// 可以遍歷獲取聚合數(shù)據(jù)
// for (Aggregation aggregation : aggregations.asList()) {
// System.out.println("當前聚合:"+aggregation.getName());
// aggregation.getXxx
// }
// 也可使使用下面的方式
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年齡:"+keyAsString+" ==> 有 "+bucket.getDocCount()+" 個");
}
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪資:"+balanceAvg);
}
2)、添加收集結(jié)果的測試類:
/**
* 測試用賬號類
*/
@ToString
@Data
static class Account {
private int account_number;
private int balance;
private String firstname;
private String lastname;
private int age;
private String gender;
private String address;
private String employer;
private String email;
private String city;
private String state;
}
3)、執(zhí)行測試方法,結(jié)果如下:
在這里插入圖片描述
在這里插入圖片描述
可以看到結(jié)果第一行中有一個
boost
參數(shù),這個是系統(tǒng)自動為我們添加的,之前在 kibana 中使用 DSL 語言檢索數(shù)據(jù)的時候是沒有的。那么這個 boost
到底是什么呢?參考官方文檔,可以得出結(jié)論。
在這里插入圖片描述
在這里插入圖片描述
再來看查詢結(jié)果,使用 json 工具格式化可以看到返回符合條件的數(shù)據(jù)有 4 條,和之前 kibana 中查出的一致:
在這里插入圖片描述
以上,便是 SpringBoot 整合 ES 的全部內(nèi)容,更多高級用法可以參考 ES 的官方文檔進行嘗試。
更多檢索信息請參考 java-rest-high-search
總結(jié)
當然 ES 的在實際的生產(chǎn)中應(yīng)用廣泛:
比如使用 ELK
組件用來進行日志的收集
或者進行全文的檢索
:
在這里插入圖片描述
或者用來收集異常信息
,做成可視化的界面來提供分析等:
在這里插入圖片描述
更多應(yīng)用場景,還需要和實際的生產(chǎn)結(jié)合起來,也需要我們自己去嘗試和探索。
參考: