【1】获取TransportClient
public static TransportClient getTransportClient() throws Exception{
Settings settings = Settings.builder().put("cluster.name", "my-es").build();
//创建client
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses(
new InetSocketTransportAddress(InetAddress.getByName("192.168.242.140"), 9300),
new InetSocketTransportAddress(InetAddress.getByName("192.168.242.141"), 9300),
new InetSocketTransportAddress(InetAddress.getByName("192.168.242.142"), 9300));
return client;
}
【2】创建索引
public static void addQuestionXuekebao(TransportClient client,QuestionXuekubaoVo xuekubao) throws IOException {
Date date = new Date();
IndexResponse response = client.prepareIndex("xuekubao", "t_question_xuekebao", xuekubao.getId().toString())
.setSource(
jsonBuilder()
.startObject()
.field("idOld", xuekubao.getIdOld())
.field("content", xuekubao.getContent())
.field("answer", xuekubao.getAnswer())
.field("solution", xuekubao.getSolution())
.field("course", xuekubao.getCourse())
.field("grade", xuekubao.getGrade())
.field("picExistFlag", xuekubao.getPicExistflag())
.field("contentExistFlag", xuekubao.getContentExistFlag())
.field("answerExistFlag", xuekubao.getAnswerExistFlag())
.field("parseExistFlag", xuekubao.getParseExistFlag())
.field("createTime", xuekubao.getCreateTime())
.endObject()
).get();
}
【3】往type中增加数据
public static void addQuestionXuekebao(TransportClient client,QuestionXuekubaoVo xuekubao) throws IOException {
Date date = new Date();
IndexResponse response = client.prepareIndex("xuekubao", "t_question_xuekebao", xuekubao.getId().toString())
.setSource(
jsonBuilder()
.startObject()
.field("idOld", xuekubao.getIdOld())
.field("content", xuekubao.getContent())
.field("answer", xuekubao.getAnswer())
.field("solution", xuekubao.getSolution())
.field("course", xuekubao.getCourse())
.field("grade", xuekubao.getGrade())
.field("picExistFlag", xuekubao.getPicExistflag())
.field("contentExistFlag", xuekubao.getContentExistFlag())
.field("answerExistFlag", xuekubao.getAnswerExistFlag())
.field("parseExistFlag", xuekubao.getParseExistFlag())
.field("createTime", xuekubao.getCreateTime())
.endObject()
).get();
}
【4】查询type下的所有数据
@Test
public void getAllXuekubaoByquestion(){
SearchRequestBuilder srb=client.prepareSearch("xuekubao").setTypes("t_question_xuekebao");
SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); // 查询所有
SearchHits hits=sr.getHits();
long totalHits = hits.getTotalHits();
System.out.println("总记录数为:"+totalHits);
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
【5】条件查询type下的数据
@Test
public void testMultiGetXuekubao() throws IOException {
long start,end;
start=System.currentTimeMillis();
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("xuekubao", "t_question_xuekebao","33247")
.get();
end=System.currentTimeMillis();
System.out.println("查询一条数据需要时间:"+(end-start)+"ms");
Iterator<MultiGetItemResponse> iterator = multiGetItemResponses.iterator();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
GetResponse response = itemResponse.getResponse();
if (response.isExists()) {
String json = response.getSourceAsString();
System.out.println(json);
}
}
}
@Test
public void getDataXuekubaoByGrade(){
MatchQueryBuilder builder = QueryBuilders.matchQuery("grade", "高三");
SearchResponse response =
client.prepareSearch("xuekubao").setQuery(builder).get();
SearchHits hits = response.getHits();
long totalHits = hits.getTotalHits();
System.out.println("总记录数为:"+totalHits);
for(SearchHit hit:hits) {
System.out.println(hit.getSourceAsString());
//将获取的值转换成map的形式
Map<String, Object> map = hit.getSourceAsMap();
for(String key:map.keySet()) {
System.out.println(key +" key对应的值为:" +map.get(key));
}
}
}
【6】分页查询
@Test
public void searchPagingXuekubao() {
SearchRequestBuilder srb=client.prepareSearch("xuekubao").setTypes("t_question_xuekebao");
SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(100).execute().actionGet();
SearchHits hits=sr.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
【7】聚合查询
/**
* https://elasticsearch.cn/article/102
*
* select team, count(*) as player_count from player group by team;
*/
@Test
public void testAgg1() {
//指定索引和type
SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
//按team分组然后聚合,但是并没有指定聚合函数
TermsAggregationBuilder teamAgg = AggregationBuilders.terms("player_count").field("team");
//添加聚合器
builder.addAggregation(teamAgg);
//触发
SearchResponse response = builder.execute().actionGet();
//System.out.println(response);
//将返回的结果放入到一个map中
Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
// Set<String> keys = aggMap.keySet();
//
// for (String key: keys) {
// System.out.println(key);
// }
// //取出聚合属性
StringTerms terms = (StringTerms) aggMap.get("player_count");
//
//依次迭代出分组聚合数据
// for (Terms.Bucket bucket : terms.getBuckets()) {
// //分组的名字
// String team = (String) bucket.getKey();
// //count,分组后一个组有多少数据
// long count = bucket.getDocCount();
// System.out.println(team + " " + count);
// }
Iterator<Terms.Bucket> teamBucketIt = terms.getBuckets().iterator();
while (teamBucketIt .hasNext()) {
Terms.Bucket bucket = teamBucketIt.next();
String team = (String) bucket.getKey();
long count = bucket.getDocCount();
System.out.println(team + " " + count);
}
}
/**
* select team, position, count(*) as pos_count from player group by team, position;
*/
@Test
public void testAgg2() {
SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
//指定别名和分组的字段
TermsAggregationBuilder teamAgg = AggregationBuilders.terms("team_name").field("team");
TermsAggregationBuilder posAgg= AggregationBuilders.terms("pos_count").field("position");
//添加两个聚合构建器
builder.addAggregation(teamAgg.subAggregation(posAgg));
//执行查询
SearchResponse response = builder.execute().actionGet();
//将查询结果放入map中
Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
//根据属性名到map中查找
StringTerms teams = (StringTerms) aggMap.get("team_name");
//循环查找结果
for (Terms.Bucket teamBucket : teams.getBuckets()) {
//先按球队进行分组
String team = (String) teamBucket.getKey();
Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
StringTerms positions = (StringTerms) subAggMap.get("pos_count");
//因为一个球队有很多位置,那么还要依次拿出位置信息
for (Terms.Bucket posBucket : positions.getBuckets()) {
//拿到位置的名字
String pos = (String) posBucket.getKey();
//拿出该位置的数量
long docCount = posBucket.getDocCount();
//打印球队,位置,人数
System.out.println(team + " " + pos + " " + docCount);
}
}
}
/**
* select team, max(age) as max_age from player group by team;
*/
@Test
public void testAgg3() {
SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
//指定安球队进行分组
TermsAggregationBuilder teamAgg = AggregationBuilders.terms("team_name").field("team");
//指定分组求最大值
MaxAggregationBuilder maxAgg = AggregationBuilders.max("max_age").field("age");
//分组后求最大值
builder.addAggregation(teamAgg.subAggregation(maxAgg));
//查询
SearchResponse response = builder.execute().actionGet();
Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
//根据team属性,获取map中的内容
StringTerms teams = (StringTerms) aggMap.get("team_name");
for (Terms.Bucket teamBucket : teams.getBuckets()) {
//分组的属性名
String team = (String) teamBucket.getKey();
//在将聚合后取最大值的内容取出来放到map中
Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
//取分组后的最大值
InternalMax ages = (InternalMax)subAggMap.get("max_age");
double max = ages.getValue();
System.out.println(team + " " + max);
}
}
/**
* select team, avg(age) as avg_age, sum(salary) as total_salary from player group by team;
*/
@Test
public void testAgg4() {
SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
//指定分组字段
TermsAggregationBuilder termsAgg = AggregationBuilders.terms("team_name").field("team");
//指定聚合函数是求平均数据
AvgAggregationBuilder avgAgg = AggregationBuilders.avg("avg_age").field("age");
//指定另外一个聚合函数是求和
SumAggregationBuilder sumAgg = AggregationBuilders.sum("total_salary").field("salary");
//分组的聚合器关联了两个聚合函数
builder.addAggregation(termsAgg.subAggregation(avgAgg).subAggregation(sumAgg));
SearchResponse response = builder.execute().actionGet();
Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
//按分组的名字取出数据
StringTerms teams = (StringTerms) aggMap.get("team_name");
for (Terms.Bucket teamBucket : teams.getBuckets()) {
//获取球队名字
String team = (String) teamBucket.getKey();
Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
//根据别名取出平均年龄
InternalAvg avgAge = (InternalAvg)subAggMap.get("avg_age");
//根据别名取出薪水总和
InternalSum totalSalary = (InternalSum)subAggMap.get("total_salary");
double avgAgeValue = avgAge.getValue();
double totalSalaryValue = totalSalary.getValue();
System.out.println(team + " " + avgAgeValue + " " + totalSalaryValue);
}
}
/**
* select team, sum(salary) as total_salary from player group by team order by total_salary desc;
*/
@Test
public void testAgg5() {
SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
//按team进行分组,然后指定排序规则
TermsAggregationBuilder termsAgg = AggregationBuilders.terms("team_name").field("team").order(Terms.Order.aggregation("total_salary ", true));
SumAggregationBuilder sumAgg = AggregationBuilders.sum("total_salary").field("salary");
builder.addAggregation(termsAgg.subAggregation(sumAgg));
SearchResponse response = builder.execute().actionGet();
Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
StringTerms teams = (StringTerms) aggMap.get("team_name");
for (Terms.Bucket teamBucket : teams.getBuckets()) {
String team = (String) teamBucket.getKey();
Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
InternalSum totalSalary = (InternalSum)subAggMap.get("total_salary");
double totalSalaryValue = totalSalary.getValue();
System.out.println(team + " " + totalSalaryValue);
}
}
【8】删除
@Test
public void testDeleteXuekubao() {
DeleteResponse response = client.prepareDelete("xuekubao", "t_question_xuekebao", "1").get();
System.out.println(response);
}
以下为curl删除某个type下的语句
curl -XPOST 'http://192.168.242.140:9200/xuekubao/t_question_xuekebao/_delete_by_query?conflicts=proceed&pretty' -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
';
其他的操作后续再加吧