package com.applesnt.onlinemall.search;
import com.alibaba.fastjson.JSON;
import com.applesnt.onlinemall.search.config.ElasticSearchConfig;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.metrics.Avg;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class OnlinemallSearchApplicationTests {
/*注入es操作对象*/
@Autowired
private RestHighLevelClient client;
/*创建一个实体类,封装返回的数据*/
@Data
@ToString
static public class BankVo{
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");
/*构造检索条件*/
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
/*
构造的条件:
GET /bank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"ageagg": {
"terms": {
"field": "age",
"size": 10
}
},
"balanceavg":{
"avg": {
"field": "balance"
}
}
}
}
* */
//match查询
sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//聚合查询 查询年龄的分布
sourceBuilder.aggregation(AggregationBuilders.terms("ageagg").field("age").size(10));
//聚合查询 查询平均薪资
sourceBuilder.aggregation(AggregationBuilders.avg("balanceavg").field("balance"));
System.out.println("查询条件:"+sourceBuilder.toString());
searchRequest.source(sourceBuilder);
/*执行查询*/
SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println("响应数据"+searchResponse.toString());
/*查询命中的数据 获取外层最大的hits*/
SearchHits hits = searchResponse.getHits();
//得到总记录数
TotalHits totalHits = hits.getTotalHits();
System.out.println("总记录数为:"+totalHits.value);
//获取文档数据
SearchHit[] docHits = hits.getHits();
for (SearchHit docHit : docHits) {
String id = docHit.getId();
System.out.println("id = "+id);
String sourceAsString = docHit.getSourceAsString();
BankVo bankVo = JSON.parseObject(sourceAsString, BankVo.class);
System.out.println("文档数据:"+bankVo.toString());
}
//获取聚合数据
Aggregations aggregations = searchResponse.getAggregations();
Terms ageagg1 = aggregations.get("ageagg");
List<? extends Terms.Bucket> buckets = ageagg1.getBuckets();
for (Terms.Bucket bucket : buckets) {
System.out.println("年龄:"+bucket.getKeyAsString());
System.out.println("数量:"+bucket.getDocCount());
}
Avg balanceavg = aggregations.get("balanceavg");
System.out.println("平均薪资为:"+balanceavg.getValueAsString());
}
}