一、Java操作elasticSearch復(fù)雜查詢以及解析數(shù)據(jù)
說明:基于銀行測試庫的操作
es的銀行測試庫,看一個Kibana操作 然后用java檢索解析這個數(shù)據(jù)
聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均薪資
#聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均薪資
GET bank/_search
{
"query":{
"match": {
"address": "mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"balanceAvg":{
"avg":{
"field": "balance"
}
}
},
"size": 0
}
以下是分解思路實現(xiàn)步驟:
1.1 拆解操作數(shù)據(jù)
#聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均年齡
GET bank/_search
{
“query”:{ “match”: { “address”: “mill” }
},
“aggs”: { “ageAgg”: { “terms”: { “field”: “age”, “size”: 10 } },“balanceAvg”:{ “avg”:{ “field”: “balance” } } }, “size”: 0 }
1.2 構(gòu)造一個查詢器 指向索引
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
1.3 封裝查詢條件器
//指定DSL 檢索條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//構(gòu)造檢索條件
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//按照年齡只分布進(jìn)行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);
//計算平均薪資
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("blance");
searchSourceBuilder.aggregation(balanceAvg);
//打印檢索條件 打印結(jié)果與Kibana核對
System.out.println("檢索條件:"+searchSourceBuilder);
檢索條件:{"query":{"match":{"address":{"query":"mill","operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions":true,"lenient":false,"zero_terms_query":"NONE","auto_generate_synonyms_phrase_query":true,"boost":1.0}}},"aggregations":{"ageAgg":{"terms":{"field":"age","size":10,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}]}},"balanceAvg":{"avg":{"field":"blance"}}}}
1.4 封裝的條件器置入查詢器
searchRequest.source(searchSourceBuilder);
1.5 容器中的client調(diào)用查詢:
//執(zhí)行檢索
SearchResponse search = client.search(searchRequest, GuilimallElasticSearchConfig.COMMON_OPTIONS);
1.6 解析查詢結(jié)果
System.out.println(search.toString());
// Map map = JSON.parseObject(search.toString(), Map.class);
//分析結(jié)果 查詢結(jié)構(gòu)
SearchHits hits = search.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit: searchHits){
// hit.getIndex();
// hit.getId();
String sourceAsString = hit.getSourceAsString();
Accout accout = JSON.parseObject(sourceAsString, Accout.class);
System.out.println(accout.toString());
}
//獲取檢索的分析信息
Aggregations aggregations = search.getAggregations();
// for (Aggregation aggregation : aggregations.asList()) {
// System.out.println("當(dāng)前聚合名字:"+aggregation.getName());
// }
//分類聚合
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年齡:" + keyAsString + "人數(shù):"+bucket.getDocCount());
}
//平局值
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪資"+ balanceAvg1.getValue());
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":4,"relation":"eq"},"max_score":5.4032025,"hits":[{"_index":"bank","_type":"account","_id":"970","_score":5.4032025,"_source":{"account_number":970,"balance":19648,"firstname":"Forbes","lastname":"Wallace","age":28,"gender":"M","address":"990 Mill Road","employer":"Pheast","email":"forbeswallace@pheast.com","city":"Lopezo","state":"AK"}},{"_index":"bank","_type":"account","_id":"136","_score":5.4032025,"_source":{"account_number":136,"balance":45801,"firstname":"Winnie","lastname":"Holland","age":38,"gender":"M","address":"198 Mill Lane","employer":"Neteria","email":"winnieholland@neteria.com","city":"Urie","state":"IL"}},{"_index":"bank","_type":"account","_id":"345","_score":5.4032025,"_source":{"account_number":345,"balance":9812,"firstname":"Parker","lastname":"Hines","age":38,"gender":"M","address":"715 Mill Avenue","employer":"Baluba","email":"parkerhines@baluba.com","city":"Blackgum","state":"KY"}},{"_index":"bank","_type":"account","_id":"472","_score":5.4032025,"_source":{"account_number":472,"balance":25571,"firstname":"Lee","lastname":"Long","age":32,"gender":"F","address":"288 Mill Street","employer":"Comverges","email":"leelong@comverges.com","city":"Movico","state":"MT"}}]},"aggregations":{"lterms#ageAgg":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":38,"doc_count":2},{"key":28,"doc_count":1},{"key":32,"doc_count":1}]},"avg#balanceAvg":{"value":null}}}
GulimallSearchApplicationTests.Accout(account_number=970, balance=19648, firstname=Forbes, lastname=Wallace, age=28, gender=M, address=990 Mill Road, employer=Pheast, email=forbeswallace@pheast.com, city=Lopezo, state=AK)
GulimallSearchApplicationTests.Accout(account_number=136, balance=45801, firstname=Winnie, lastname=Holland, age=38, gender=M, address=198 Mill Lane, employer=Neteria, email=winnieholland@neteria.com, city=Urie, state=IL)
GulimallSearchApplicationTests.Accout(account_number=345, balance=9812, firstname=Parker, lastname=Hines, age=38, gender=M, address=715 Mill Avenue, employer=Baluba, email=parkerhines@baluba.com, city=Blackgum, state=KY)
GulimallSearchApplicationTests.Accout(account_number=472, balance=25571, firstname=Lee, lastname=Long, age=32, gender=F, address=288 Mill Street, employer=Comverges, email=leelong@comverges.com, city=Movico, state=MT)
年齡:38人數(shù):2
年齡:28人數(shù):1
年齡:32人數(shù):1
平均薪資25208.0
1.7 打印逐條記錄時,可以把結(jié)構(gòu)封裝成一個model 借助一下:json.cn
1.8 完整操作:
@ToString
@Data
static class Accout {
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;
}
@Test
public void searchData() throws IOException {
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DSL 檢索條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//構(gòu)造檢索條件
/**
#聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均年齡
GET bank/_search
{
"query":{ "match": { "address": "mill" }
},
"aggs": { "ageAgg": { "terms": { "field": "age", "size": 10 } },
"balanceAvg":{ "avg":{ "field": "balance" } } }, "size": 0 }
*/
// searchSourceBuilder.aggregation();
// searchSourceBuilder.from();
// searchSourceBuilder.size();
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//按照年齡只分布進(jìn)行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);
//計算平均薪資
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
searchSourceBuilder.aggregation(balanceAvg);
//打印檢索條件
System.out.println("檢索條件:"+searchSourceBuilder);
searchRequest.source(searchSourceBuilder);
//執(zhí)行檢索
SearchResponse search = client.search(searchRequest, GuilimallElasticSearchConfig.COMMON_OPTIONS);
//分析結(jié)果
// searchRequest.
System.out.println(search.toString());
// Map map = JSON.parseObject(search.toString(), Map.class);
//分析結(jié)果 查詢結(jié)構(gòu)
SearchHits hits = search.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit: searchHits){
// hit.getIndex();
// hit.getId();
String sourceAsString = hit.getSourceAsString();
Accout accout = JSON.parseObject(sourceAsString, Accout.class);
System.out.println(accout.toString());
}
//獲取檢索的分析信息
Aggregations aggregations = search.getAggregations();
// for (Aggregation aggregation : aggregations.asList()) {
// System.out.println("當(dāng)前聚合名字:"+aggregation.getName());
// }
//分類聚合
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年齡:" + keyAsString + "人數(shù):"+bucket.getDocCount());
}
//平局值
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪資"+ balanceAvg1.getValue());
}
二、Java操作elasticSearch索引保存數(shù)據(jù)
2.1 計劃與實現(xiàn)
存儲一個新索引students,然后保存文檔
- 借助Kibana:
> GET /students/_search
結(jié)果:
{
"error" : {
"root_cause" : [
{
"type" : "index_not_found_exception",
"reason" : "no such index [students]",
"resource.type" : "index_or_alias",
"resource.id" : "students",
"index_uuid" : "_na_",
"index" : "students"
}
],
"type" : "index_not_found_exception",
"reason" : "no such index [students]",
"resource.type" : "index_or_alias",
"resource.id" : "students",
"index_uuid" : "_na_",
"index" : "students"
},
"status" : 404
}
索引不存在
2.2單元測試
索引數(shù)據(jù)的請求是個網(wǎng)絡(luò)操作,所以會有異常處理。文章來源:http://www.zghlxwxcb.cn/news/detail-691937.html
//做一個學(xué)生對象
//注解后setter getter
@Data
class Student{
private String name;
private Integer age;
private String gender;
}
@Test
public void indexData() throws IOException {
//索引
IndexRequest indexRequest = new IndexRequest("students");
//數(shù)據(jù)id 不設(shè)置會自動生成
indexRequest.id("1");
Student student = new Student();
student.setAge(18);
student.setGender("男");
student.setName("張鐵蛋");
//對象轉(zhuǎn)換json
String jsonString = JSON.toJSONString(student);
//索引對象加入對象json 聲明保存形式
indexRequest.source(jsonString, XContentType.JSON);
//用容器中導(dǎo)入的client 調(diào)用請求 索引對象 和 配置參數(shù) 這個配置參數(shù)是整合配置時搞定的
IndexResponse index = client.index(indexRequest, GuilimallElasticSearchConfig.COMMON_OPTIONS);
//index為相應(yīng)數(shù)據(jù)
System.out.println(index);
}
2.3 執(zhí)行
2021-11-05 16:01:28.219 INFO 1548 --- [ main] c.a.g.s.GulimallSearchApplicationTests : Started GulimallSearchApplicationTests in 18.417 seconds (JVM running for 19.985)
IndexResponse[index=students,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
2021-11-05 16:01:32.019 INFO 1548 --- [ Thread-9] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
Process finished with exit code 0
2.4 查看一下Kibana操作結(jié)果
GET /students/_search
結(jié)果集:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "students",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"age" : 18,
"gender" : "男",
"name" : "張鐵蛋"
}
}
]
}
}
至此,保存成功文章來源地址http://www.zghlxwxcb.cn/news/detail-691937.html
到了這里,關(guān)于Java操作elasticSearch復(fù)雜查詢以及解析數(shù)據(jù)以及索引保存數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!