springBoot2.x整合es7.x實現常見操作(增、刪、該、查、分組)
阿新 • • 發佈:2020-12-13
整合es
引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置
在properties中增加下面配置
spring.elasticsearch.rest.uris=http://localhost:9200 spring.elasticsearch.rest.username= spring.elasticsearch.rest.password=
@Configuration @ConfigurationProperties(prefix = "elasticsearch") public class EsConfig { private String host; private Integer port; @Bean(destroyMethod = "close") public RestHighLevelClient client() { return new RestHighLevelClient(RestClient.builder( new HttpHost(host, port, "http") )); } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } }
這樣就可以了
基本操作前提
需要的類
public class ObjectToMapUtils { /** * 將物件轉換成Map * @param bean * @param <T> * @return */ public static <T> Map<String, Object> beanToMap(T bean) { Map<String, Object> map = new HashMap<>(); if (bean != null) { BeanMap beanMap = BeanMap.create(bean); for (Object key : beanMap.keySet()) { if(beanMap.get(key) != null) map.put(key + "", beanMap.get(key)); } } return map; } }
@Data
public class DocBean {
private String id;
private String firstCode;
private String secordCode;
private String content;
private Integer type;
private Date createdAt;
private Long startAt;
public DocBean(String id, String firstCode, String secordCode, String content, Integer type) {
this.id = id;
this.firstCode = firstCode;
this.secordCode = secordCode;
this.content = content;
this.type = type;
this.createdAt = new Date();
this.startAt = System.currentTimeMillis();
}
public DocBean() {
}
}
新增
public interface IElasticService {
void save(DocBean docBean) throws IOException;
}
@Service
public class IElasticServiceImpl implements IElasticService {
@Resource
private RestHighLevelClient client;
private static final String NBA_INDEX = "record_traffic-2020-12-10";
/**
* 新增操作
* @param docBean
* @throws IOException
*/
@Override
public void save(DocBean docBean) throws IOException {
IndexRequest request = new IndexRequest(NBA_INDEX).id(String.valueOf(docBean.getId())).source(ObjectToMapUtils.beanToMap(docBean));
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println(JSONObject.toJSON(response));
}
}
修改
/**
* 更新資料
* @param docBean
* @throws IOException
*/
@Override
public void update(DocBean docBean) throws IOException {
UpdateRequest request = new UpdateRequest(NBA_INDEX, docBean.getId()).doc(ObjectToMapUtils.beanToMap(docBean));
client.update(request, RequestOptions.DEFAULT);
}
刪除
根據單個id刪除
@Override
public void deleteById(String id) throws IOException {
DeleteRequest deleteRequest = new DeleteRequest(NBA_INDEX, id);
client.delete(deleteRequest, RequestOptions.DEFAULT);
}
根據id批量刪除
/***
* 刪除操作。批量刪除通過ids
* @param ids
* @throws IOException
*/
@Override
public void deleteByIds(String[] ids) throws IOException {
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NBA_INDEX);
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(QueryBuilders.idsQuery().addIds(ids));
deleteByQueryRequest.setQuery(boolQueryBuilder);
client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
}
查詢
根據id進行查詢
@Override
public Map<String,Object> getEs(String id) throws IOException {
GetRequest getRequest = new GetRequest(NBA_INDEX,id);
GetResponse response = client.get(getRequest,RequestOptions.DEFAULT);
return response.getSource();
}
... 後面會繼續擴充套件
分組和統計數量
@Override
public Map<String, Long> getTypeGroupBy() throws IOException {
Map<String, Long> map = new LinkedHashMap<>();
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("record_traffic*");
//指定分組欄位,terms指定別名,field指定欄位名
TermsAggregationBuilder aggregation = AggregationBuilders.terms("content")
//聚合欄位名
.field("content.keyword")
.size(100)
// 降序
.order(BucketOrder.count(false));
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.aggregation(aggregation);
//執行查詢
searchRequest.source(searchSourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
Terms byAgeAggregation = response.getAggregations().get("content");
List<? extends Terms.Bucket> buckets = byAgeAggregation.getBuckets();
for (Terms.Bucket buck: buckets) {
map.put(buck.getKeyAsString(), buck.getDocCount());
}
return map;
}