1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.8.13</version>
</dependency>
2、配置文件
spring.elasticsearch.rest.uris = 10.53.10.88:9200
spring.elasticsearch.rest.username = fmapp
spring.elasticsearch.rest.password = 9usdW95nB0CK2mjs
3、代码
package com.freemud.unify.shops.manager;
import com.alibaba.fastjson.JSON;
import com.freemud.unify.shops.entity.ProductOperatorLog;
import com.freemud.unify.shops.entity.ProductOperatorLogQuery;
import com.freemud.unify.shops.entity.ProductOperatorLogResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class ProductOperatorLogManager {
private static final String PRODUCT_OPERATOR_LOG_INDEX = "product-operator-log-";
private static final String DEFAULT_TYPE = "_doc";
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 异步批量新增
* @param List
*/
public void bulkAsync(List<ProductOperatorLog> List){
BulkRequest request = new BulkRequest();
List.forEach(create->{
LocalDateTime localDateTime = LocalDateTime.ofInstant(create.getCreateTime().toInstant()
, ZoneId.systemDefault());
request.add(new IndexRequest().index(PRODUCT_OPERATOR_LOG_INDEX + localDateTime.getYear() + "-" +localDateTime.getMonthValue()).type(DEFAULT_TYPE)
.source(JSON.toJSONString(create), XContentType.JSON));
});
restHighLevelClient.bulkAsync(request, RequestOptions.DEFAULT,new ActionListener<BulkResponse>() {
@Override
public void onResponse(BulkResponse bulkResponse) {
log.info("bulklistener_onResponse count:"+bulkResponse.getItems().length);
}
@Override
public void onFailure(Exception e) {
log.error("bulklistener_onFailure body{} e{}",request.requests(), ExceptionUtils.getFullStackTrace(e));
}
});
}
/**
* 根据id删除数据
*/
public void delete(){
DeleteRequest request = new DeleteRequest();
request.id("-bkcZowBWbbjdR2AHHsG");
request.index("product-operator-log-2023-12");
request.type(DEFAULT_TYPE);
try {
restHighLevelClient.delete(request, RequestOptions.DEFAULT);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 删除索引
*/
public void deleteIndex(){
DeleteIndexRequest request = new DeleteIndexRequest("product-operator-log-2023-12");
try {
restHighLevelClient.indices().delete(request,RequestOptions.DEFAULT);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 根据条件查询
*
* @param queryDto
* @return
*/
public ProductOperatorLogResponse queryByConditions(ProductOperatorLogQuery queryDto) {
ProductOperatorLogResponse operatorLogResponse = new ProductOperatorLogResponse();
List<ProductOperatorLog> result = new ArrayList<>();
SearchResponse response= queryElasticsearch(queryDto);
if(response != null && response.getHits() != null){
Iterator<SearchHit> hitIterator = response.getHits().iterator();
while (hitIterator.hasNext()) {
result.add(JSON.parseObject(hitIterator.next().getSourceAsString(), ProductOperatorLog.class));
}
operatorLogResponse.setScrollId(response.getScrollId());
operatorLogResponse.setResult(result);
operatorLogResponse.setTotalNum(response.getHits().getTotalHits());
}
return operatorLogResponse;
}
private SearchResponse queryElasticsearch(ProductOperatorLogQuery queryDto){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(queryDto.getPartnerId())) {
boolQueryBuilder.must(QueryBuilders.termQuery("partnerId", queryDto.getPartnerId()));
}
if (StringUtils.isNotBlank(queryDto.getProductId())) {
boolQueryBuilder.must(QueryBuilders.termQuery("productId", queryDto.getProductId()));
}
//如果skuId是text类,防止被分词查不出来,可以用skuId.keyword查询
if (StringUtils.isNotBlank(queryDto.getSkuId())) {
boolQueryBuilder.must(QueryBuilders.termQuery("skuId.keyword", queryDto.getSkuId()));
}
if(queryDto.getCreateStartTime() != null || queryDto.getCreateEndTime() != null){
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("createTime");
if (queryDto.getCreateStartTime() != null) {
rangeQueryBuilder.from(queryDto.getCreateStartTime().getTime());
}
if (queryDto.getCreateEndTime() != null) {
rangeQueryBuilder.to(queryDto.getCreateEndTime().getTime());
}
boolQueryBuilder.must(rangeQueryBuilder);
}
//通配符查询,类似于like查询
if (StringUtils.isNotBlank(queryDto.getProductName())) {
boolQueryBuilder.must(QueryBuilders.wildcardQuery("productName", "*"+queryDto.getProductName()+"*"));
}
SearchRequest request = new SearchRequest(PRODUCT_OPERATOR_LOG_INDEX + "*");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if(Objects.equals(queryDto.getType(),Boolean.TRUE)){
request.scroll(TimeValue.timeValueSeconds(120));
}else{
//检索超过10000 ES会报错,这里只返回数量
if (queryDto.getPageNum() * queryDto.getPageSize() > 10000) {
queryDto.setPageNum(1);
queryDto.setPageSize(0);
}
sourceBuilder.from((queryDto.getPageNum() - 1) * queryDto.getPageSize());
}
sourceBuilder.sort("createTime", SortOrder.DESC);
sourceBuilder.size(queryDto.getPageSize());
request.source(sourceBuilder.query(boolQueryBuilder));
SearchResponse response=null;
try {
response = restHighLevelClient.search(request,RequestOptions.DEFAULT);
} catch (Exception e) {
log.error("查询es异常 request{} e{}",queryDto, ExceptionUtils.getFullStackTrace(e));
}
return response;
}
/**
* 滚动查询
* @param scrollId
* @return
*/
public SearchResponse scrollSearch(String scrollId) {
SearchResponse response=null;
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueSeconds(120));
try {
response = restHighLevelClient.scroll(scrollRequest,RequestOptions.DEFAULT);
} catch (Exception e) {
log.error("查询es异常 request{} e{}",scrollId, ExceptionUtils.getFullStackTrace(e));
}
return response;
}
}