org.elasticsearch.client maven 版本 6.8.4
es server版本7.9.2
- add增加
MsgPO po = new MsgPO();
po.setTime("2020-11-03T10:50:00+08:00");//这是加了时区的写法,没有写默认是UTC时区,显示的时候会不一致。
//省略赋值过程
// 记录全量日志,同时去除异常数据,入es库
IndexQuery indexQuery = null;
try {
indexQuery = new IndexQueryBuilder().withIndexName().withId(po.getId())
.withObject(po).build();
template.index(indexQuery);
log.info("uuid: {} 插入es数据库成功", po.getMsgId());
} catch (Exception e) {
log.error("uuid: {}新增数据入es库异常", po.getMsgId());
log.error(e.getMessage(), e);
}
- update修改
try {
UpdateRequest updateRequest =new UpdateRequest();
updateRequest.retryOnConflict(1);//冲突重试
Map<String,Object> m=new HashMap<>();
m.put("content","110");
updateRequest.doc(m);
updateRequest.routing(routingID);//默认是_id来路由的,用来路由到不同的shard,会对这个值做hash,然后映射到shard。所以分片
UpdateQuery uq = new UpdateQueryBuilder().withId(id)
.withDoUpsert(true)//不加默认false。true表示更新时不存在就插入
.withClass(MsgPO.class).withUpdateRequest(updateRequest).build();
UpdateResponse updateResponse = elasticsearchTemplate.update(uq);
log.info("uuid: {} 插入es数据库成功 {}",id,updateResponse.getResult());
} catch (Exception e) {
log.error("uuid: {}新增数据入es库异常", id);
log.error(e.getMessage(), e);
}
- query查询
这里对classify做了个聚合查询,类似于msyql的 group by
BoolQueryBuilder queryFilter = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("time").gte("2020-11-03T10:50:00+08:00").lte("2020-11-03T12:50:00+08:00");
queryFilter.must(QueryBuilders.termQuery("name", "test"));
queryFilter.must(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("type", 1)).should(QueryBuilders.termQuery("type", 2)));//type=1 ||type==2
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("customer").field("classify");//根据classify做聚合
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(aggregationBuilder);
sourceBuilder.size(0);
SearchRequest searchRequest = new SearchRequest("indexName");
searchRequest.source(sourceBuilder);
sourceBuilder.query(queryFilter);
SearchResponse response = null;
Map<Integer, Long> esResultMap = new HashMap<>();
try {
response = elasticsearchTemplate.getClient().search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = response.getAggregations();
Terms terms = aggregations.get("customer");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
//结果汇聚
for (Terms.Bucket bucket : buckets) {
esResultMap.put(bucket.getKeyAsNumber().intValue(), bucket.getDocCount());
}
return esResultMap;
} catch (IOException e) {
log.error(e.getMessage(), e);
}
多字段聚合,用了Script,性能未知
BoolQueryBuilder queryFilter = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("time").gte("2020-11-03T10:50:00+08:00");
Script script = new Script("doc['type'] +'#'+doc['classify']+'#'+doc['address']");
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("customer").script(script)
.size(200);//聚合结果大小,不要搞太多,不然要分页
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(aggregationBuilder);
sourceBuilder.size(0);//具体结果大小
SearchRequest searchRequest = new SearchRequest("IndexName");
searchRequest.source(sourceBuilder);
sourceBuilder.query(queryFilter);
SearchResponse response = null;
try {
response = elasticsearchTemplate.getClient().search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregation = response.getAggregations();
Terms terms = aggregation.get("customer");
List<? extends Bucket> buckets = terms.getBuckets();
for (Bucket bucket : buckets) {
log.info("bucket:{} {}", bucket.getKey(), bucket.getDocCount());
}
} catch (IOException e) {
log.error(e.getMessage(), e);
}
- delete 删除
DeleteQuery deleteQuery=new DeleteQuery();
deleteQuery.setIndex("indexName");
deleteQuery.setType("typeName");//建index没配置就是类名全小写
deleteQuery.setQuery(new BoolQueryBuilder().must(QueryBuilders.rangeQuery("time").lte("2020-11-03T10:50:00+08:00")));
elasticsearchTemplate.delete(deleteQuery);
pom包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>