import cn.hutool.core.util.StrUtil;
import com.middol.colburn.oss.model.client.es.DocumentLibraryRepository;
import com.middol.colburn.oss.model.client.es.DocumentLibrary;
import com.middol.colburn.oss.model.client.pojo.query.DocumentLibraryQuery;
import com.middol.colburn.oss.model.client.service.DocumentLibraryService;
import com.middol.starter.common.pojo.vo.PageVO;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.stream.Collectors;
@Service("documentLibraryServiceImpl")
@ConditionalOnClass({ElasticsearchRestTemplate.class})
public class DocumentLibraryServiceImpl implements DocumentLibraryService {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
final
ElasticsearchRestTemplate elasticsearchRestTemplate;
final
DocumentLibraryRepository documentLibraryRepository;
public DocumentLibraryServiceImpl(ElasticsearchRestTemplate elasticsearchRestTemplate, DocumentLibraryRepository documentLibraryRepository) {
this.elasticsearchRestTemplate = elasticsearchRestTemplate;
this.documentLibraryRepository = documentLibraryRepository;
}
@PostConstruct
public void init() {
IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(DocumentLibrary.class);
if (!indexOperations.exists()) {
boolean result = indexOperations.create();
logger.info("创建 elasticsearch 索引 DocumentLibrary, 创建结果={}", result);
if (!result) {
throw new RuntimeException("创建 elasticsearch 索引失败");
} else {
indexOperations.createMapping();
}
}
}
@Override
public void save(DocumentLibrary entity) {
elasticsearchRestTemplate.save(entity);
}
@Override
public PageVO<DocumentLibrary> search(DocumentLibraryQuery query) {
PageVO<DocumentLibrary> pageVO = new PageVO<>();
if (query.getPageNum() == null || query.getPageNum().equals(0)) {
query.setPageNum(1);
}
if (query.getPageSize() == null || query.getPageSize().equals(0)) {
query.setPageNum(10);
}
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
BoolQueryBuilder filter = QueryBuilders.boolQuery();
if (StrUtil.isNotBlank(query.getCategories())) {
filter.must(QueryBuilders.termQuery("categories", query.getCategories()));
}
if (StrUtil.isNotBlank(query.getFileType())) {
filter.must(QueryBuilders.termQuery("fileType", query.getFileType()));
}
if (StrUtil.isNotBlank(query.getOriginalFileName())) {
filter.must(QueryBuilders.matchQuery("originalFileName", query.getOriginalFileName()));
}
if (StrUtil.isNotBlank(query.getRversion())) {
filter.must(QueryBuilders.termQuery("rversion", query.getRversion()));
}
if (StrUtil.isNotBlank(query.getCreateBeginTime())) {
filter.must(QueryBuilders.rangeQuery("createTime").gte(query.getCreateBeginTime() + " 00:00:00"));
}
if (StrUtil.isNotBlank(query.getCreateEndTime())) {
filter.must(QueryBuilders.rangeQuery("createTime").lte(query.getCreateBeginTime() + " 23:59:59"));
}
if (StrUtil.isNotBlank(query.getKeywordFilterTxt())) {
queryBuilder.withQuery(QueryBuilders.queryStringQuery(query.getKeywordFilterTxt()));
}
queryBuilder.withFilter(filter);
queryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));
queryBuilder.withPageable(PageRequest.of(query.getPageNum() - 1, query.getPageSize()));
NativeSearchQuery nativeSearchQuery = queryBuilder.build();
nativeSearchQuery.addFields("id", "ossUploadRecord", "categories","originalFileName",
"resultPath","summary","rversion","createUser","createTime","fileType",
"Keyword1","Keyword2","Keyword3","Keyword4","Keyword5","Keyword6","Keyword7","Keyword8");
SearchHits<DocumentLibrary> searchHits = elasticsearchRestTemplate.search(nativeSearchQuery, DocumentLibrary.class);
if (searchHits.getTotalHits() > 0) {
List<DocumentLibrary> searchProductList = searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
pageVO.setPageNum(query.getPageNum());
pageVO.setPageSize(query.getPageSize());
pageVO.setRows(searchProductList);
pageVO.setTotal(searchHits.getTotalHits());
pageVO.setPages((int) Math.ceil((double) pageVO.getTotal() / query.getPageSize()));
}
return pageVO;
}
}