package elasticsearch;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.BucketOrder;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.avg.AvgAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
public class ElasticsearchHighApi {
public TransportClient getClient() throws UnknownHostException {
Settings settings = Settings.builder().put("cluster.name", "myes").build();
TransportAddress transportAddress1 = new TransportAddress(InetAddress.getByName("192.168.154.100"), 9300);
TransportAddress transportAddress2 = new TransportAddress(InetAddress.getByName("192.168.154.110"), 9300);
TransportAddress transportAddress3 = new TransportAddress(InetAddress.getByName("192.168.154.120"), 9300);
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(transportAddress1)
.addTransportAddress(transportAddress2)
.addTransportAddress(transportAddress3);
System.out.println(client.toString());
return client;
}
/**
* 批量添加数据
* @throws IOException
* @throws
* @throws InterruptedException
*/
@Test
public void addIndexDatas() throws IOException, ExecutionException, InterruptedException {
//获取client客户端
TransportClient client =getClient();
/**
* 创建索引
* */
client.admin().indices().prepareCreate("player").get();
//构建json的数据格式,创建映射
XContentBuilder mappingBuilder = jsonBuilder()
.startObject()
.startObject("player")
.startObject("properties")
.startObject("name").field("type", "text").field("index", "true").field("fielddata", "true").endObject()
.startObject("age").field("type", "integer").endObject()
.startObject("salary").field("type", "integer").endObject()
.startObject("team").field("type", "text").field("index", "true").field("fielddata", "true").endObject()
.startObject("position").field("type", "text").field("index", "true").field("fielddata", "true").endObject()
.endObject()
.endObject()
.endObject();
PutMappingRequest request = Requests.putMappingRequest("player")
.type("player")
.source(mappingBuilder);
client.admin().indices().putMapping(request).get();
//批量添加数据开始
BulkRequestBuilder bulkRequest = client.prepareBulk();
// either use client#prepare, or use Requests# to directly build index/delete requests
bulkRequest.add(client.prepareIndex("player", "player", "1")
.setSource(jsonBuilder()
.startObject()
.field("name", "郭德纲")
.field("age", 33)
.field("salary", 3000)
.field("team", "cav")
.field("position", "sf")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("player", "player", "2")
.setSource(jsonBuilder()
.startObject()
.field("name", "于谦")
.field("age", 25)
.field("salary", 2000)
.field("team", "cav")
.field("position", "pg")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("player", "player", "3")
.setSource(jsonBuilder()
.startObject()
.field("name", "岳云鹏")
.field("age", 29)
.field("salary",1000)
.field("team" , "war")
.field("position" , "pg")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("player", "player", "4")
.setSource(jsonBuilder()
.startObject()
.field("name", "爱因斯坦")
.field("age", 21)
.field("salary",300)
.field("team" , "tim")
.field("position" , "sg")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("player", "player", "5")
.setSource(jsonBuilder()
.startObject()
.field("name", "张云雷")
.field("age", 26)
.field("salary",2000)
.field("team" , "war")
.field("position" , "pf")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("player", "player", "6")
.setSource(jsonBuilder()
.startObject()
.field("name", "爱迪生")
.field("age", 40)
.field("salary",1000)
.field("team" , "tim")
.field("position" , "pf")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("player", "player", "7")
.setSource(jsonBuilder()
.startObject()
.field("name", "牛顿")
.field("age", 21)
.field("salary",500)
.field("team" , "tim")
.field("position" , "c")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("player", "player", "8")
.setSource(jsonBuilder()
.startObject()
.field("name", "特斯拉")
.field("age", 20)
.field("salary",500)
.field("team" , "tim")
.field("position" , "sf")
.endObject()
)
);
BulkResponse bulkResponse = bulkRequest.get();
closeClient(client);
}
/**
*
* 统计每个球队当中球员的数量
* sql语句实现
* select team, count(*) as player_count from player group by team;
**/
@Test
public void groupAndCount() throws IOException {
TransportClient client = getClient();
// 构建 查询提交
SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");
// 指定聚合条件
TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");
// 将聚合条件放入查询条件中
builder.addAggregation(team);
// 执行action 返回 SearchResponse
SearchResponse searchResponse = builder.get();
Aggregations aggregations = searchResponse.getAggregations();
for (Aggregation aggregation : aggregations) {
StringTerms stringTerms= (StringTerms)aggregation;
List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
System.out.println(" 球队名称: "+bucket.getKey()+ "球队人数: "+ bucket.getDocCount());
}
}
closeClient(client);
}
/**
*
* 统计每个球队当中每个位置球员数量
* sql语句实现
select team, position, count(*) as pos_count from player group by team, position;
**/
@Test
public void teamAndPosition() throws IOException {
TransportClient client = getClient();
// 构建 查询提交
SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");
// 指定聚合条件
TermsAggregationBuilder team = AggregationBuilders.terms("player_count").field("team");
TermsAggregationBuilder position = AggregationBuilders.terms("posititon_count").field("position");
// 关联连个聚合条件
team.subAggregation(position);
// 执行action 返回 SearchResponse
SearchResponse searchResponse = builder.addAggregation(team).get();
Aggregations aggregations = searchResponse.getAggregations();
for (Aggregation aggregation : aggregations) {
StringTerms stringTerms= (StringTerms)aggregation;
System.out.println("stringTerms1: "+ stringTerms.toString());
List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
System.out.println(" 球队名称: "+bucket.getKey()+ "球队人数: "+ bucket.getDocCount());
Aggregation posititonCount = bucket.getAggregations().get("posititon_count");
if(posititonCount != null){
System.out.println("posititonCount: "+ posititonCount.toString());
StringTerms posititonCount1= (StringTerms)posititonCount;
List<StringTerms.Bucket> buckets1 = posititonCount1.getBuckets();
for (StringTerms.Bucket bucket1 : buckets1) {
Object key1 = bucket1.getKey();
long docCount = bucket1.getDocCount();
System.out.println("队伍位置: "+ key1+ "该位置下有 : "+ docCount +"人");
}
}
}
}
closeClient(client);
}
/**
*
* 计算每个球队年龄最大值,最小值 平均值,
* sql语句实现
select team, max(age) as max_age from player group by team;
**/
@Test
public void groupAndMax() throws IOException {
TransportClient client = getClient();
// 构建 查询提交
SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");
// 指定聚合条件
TermsAggregationBuilder team = AggregationBuilders.terms("team_group").field("team");
// MaxAggregationBuilder age = AggregationBuilders.max("max_age").field("age");
// MinAggregationBuilder age = AggregationBuilders.min("min_age").field("age");
AvgAggregationBuilder age = AggregationBuilders.avg("avg_age").field("age");
// 关联连个聚合条件
team.subAggregation(age);
// 执行action 返回 SearchResponse
SearchResponse searchResponse = builder.addAggregation(team).get();
Aggregations aggregations = searchResponse.getAggregations();
for (Aggregation aggregation : aggregations) {
StringTerms stringTerms= (StringTerms)aggregation;
System.out.println("stringTerms1: "+ stringTerms.toString());
List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
for (StringTerms.Bucket bucket : buckets) {
// Aggregation maxAge = bucket.getAggregations().get("max_age");
// Aggregation minAge = bucket.getAggregations().get("min_age");
Aggregation avgAge = bucket.getAggregations().get("avg_age");
// System.out.println("最大值为: "+maxAge.toString() );
// System.out.println("最小值为: "+minAge.toString() );
System.out.println("平均值为: "+avgAge.toString() );
}
}
closeClient(client);
}
/**
*
* 计算每个球队球员的平均年龄,同时又要计算总年薪
* sql语句实现
select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team; **/
@Test
public void avgAndSum() throws IOException {
TransportClient client = getClient();
// 构建 查询提交
SearchRequestBuilder builder = client.prepareSearch("player").setTypes("player");
// 指定聚合条件
TermsAggregationBuilder team = AggregationBuilders.terms("team_group").field("team")
.order(BucketOrder.count(true)); // 根据绑定关系进行倒排
// MaxAggregationBuilder age = AggregationBuilders.max("max_age").field("age");
// MinAggregationBuilder age = AggregationBuilders.min("min_age").field("age");
AvgAggregationBuilder age = AggregationBuilders.avg("avg_age").field("age");
SumAggregationBuilder sumMoney = AggregationBuilders.sum("sum_money").field("salary");
// 关联连个聚合条件
team.subAggregation(age).subAggregation(sumMoney);
// 执行action 返回 SearchResponse
SearchResponse searchResponse = builder.addAggregation(team).get();
Aggregations aggregations = searchResponse.getAggregations();
for (Aggregation aggregation : aggregations) {
StringTerms stringTerms= (StringTerms)aggregation;
System.out.println("stringTerms1: "+ stringTerms.toString());
//
}
closeClient(client);
}
public void closeClient(TransportClient client ){
client.close();
}
}