深分页查询:
// 定义返回
Page<CdrInfoVo> page = new Page<>();
List<String> scrolledIdList = new ArrayList<>();
List<CdrInfoVo> list = new ArrayList<>();
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
if (cdrInfo != null) {
// 主叫号码 ncallernm = 123
if (StringUtils.isNotEmpty(cdrInfo.getNcallernm())) {
queryBuilder.must(QueryBuilders.termQuery("ncallernm", cdrInfo.getNcallernm()));
}
// 被叫号码 vcallernm = 123
if (StringUtils.isNotEmpty(cdrInfo.getVcallernm())) {
queryBuilder.must(QueryBuilders.termQuery("vcallernm", cdrInfo.getVcallernm()));
}
// 拨打开始时间 callstarttime >= 2023-10-01 00:00:00 and callstarttime <= 2023-10-01 23:00:00
if (null != cdrInfo.getStartTime()) {
long startTime = cdrInfo.getStartTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
if (null != cdrInfo.getEndTime()) {
long endTime = cdrInfo.getEndTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
queryBuilder.must(
QueryBuilders.rangeQuery("callstarttime").from(startTime).to(endTime));
} else {
queryBuilder.must(QueryBuilders.rangeQuery("callstarttime").from(startTime));
}
}
// 通话开始时间 talkstarttime >= 2023-10-01 00:00:00 and talkstarttime <= 2023-10-01 23:00:00
if (null != cdrInfo.getStartTalkTime()) {
long startTime = cdrInfo.getStartTalkTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
if (null != cdrInfo.getEndTalkTime()) {
long endTime = cdrInfo.getEndTalkTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
queryBuilder.must(
QueryBuilders.rangeQuery("talkstarttime").from(startTime).to(endTime));
} else {
queryBuilder.must(QueryBuilders.rangeQuery("talkstarttime").from(startTime));
}
}
// 入库时间 insertTime >= 2023-10-01 00:00:00 and insertTime <= 2023-10-01 23:00:00
if (null != cdrInfo.getStartInsertTime()) {
long startTime = cdrInfo.getStartInsertTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
if (null != cdrInfo.getEndInsertTime()) {
long endTime = cdrInfo.getEndInsertTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
queryBuilder.must(
QueryBuilders.rangeQuery("insertTime").from(startTime).to(endTime));
} else {
queryBuilder.must(QueryBuilders.rangeQuery("insertTime").from(startTime));
}
}
// 是否采样 auditResult = 1
if (null != cdrInfo.getAuditResult()) {
queryBuilder.must(QueryBuilders.termQuery("auditResult", cdrInfo.getAuditResult()));
}
// 通话时长 talklength >= 10
if (null != cdrInfo.getTalklength()) {
queryBuilder.must(QueryBuilders.rangeQuery("talklength").from(cdrInfo.getTalklength()));
}
// 通话时长 talklength >= 10 and talklength <= 20
if (null != cdrInfo.getTalkLengths()) {
Integer[] talkLengths = cdrInfo.getTalkLengths();
if(talkLengths.length == 2){
queryBuilder.must(
QueryBuilders.rangeQuery("talklength").from(talkLengths[0]).to(talkLengths[1]));
}
}
// 局点编号 officenumber = 12 or officenumber = 13 or officenumber = 14
if (null != cdrInfo.getOfficenumbers() && cdrInfo.getOfficenumbers().length > 0) {
Integer[] officenumbers = cdrInfo.getOfficenumbers();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (Integer officenumber : officenumbers) {
boolQueryBuilder.should(QueryBuilders.termQuery("officenumber", officenumber));
}
queryBuilder.must(boolQueryBuilder);
}
// 被叫归属地 calledzone in (12,13,14)
if (null != cdrInfo.getCalledzone()) {
List<Integer> childrenById = zoneInfoService.getChildrenById(cdrInfo.getCalledzone());
queryBuilder.must(QueryBuilders.termsQuery("calledzone",childrenById.toArray()));
}
// 拦截标识 interceptstatus = 1
if (null != cdrInfo.getInterceptstatus()) {
queryBuilder.must(QueryBuilders.termQuery("interceptstatus", cdrInfo.getInterceptstatus()));
}
// 拦截分类
if (null != cdrInfo.getBarringType()) {
Integer barringType = cdrInfo.getBarringType();
if(barringType == 98){
// includeUpper 是否包含范围的右边界,默认是true
// includeLower 是否包含范围的左边界,默认是true
// policyId > 0
queryBuilder.must(QueryBuilders.rangeQuery("policyId").from(0).includeLower(false));
} else if(barringType == 99){
// templenumber > 0
queryBuilder.must(QueryBuilders.rangeQuery("templenumber").from(0).includeLower(false));
} else {
// barringType = 1
queryBuilder.must(QueryBuilders.termQuery("barringType", barringType));
}
}
// 拦截分类 listtype = 1
if (null != cdrInfo.getListtype()) {
queryBuilder.must(QueryBuilders.termQuery("listtype", cdrInfo.getListtype()));
}
// 话题分类 topicClassifyId like '1234%'
if (StringUtils.isNotEmpty(cdrInfo.getTopicClassifyId())) {
if(!cdrInfo.getTopicClassifyId().equals("0")){
queryBuilder.must(QueryBuilders.prefixQuery("topicClassifyId", cdrInfo.getTopicClassifyId()));
}
}
// 主叫来源 callingSource = 12
if (null != cdrInfo.getCallingSource()) {
queryBuilder.must(QueryBuilders.termQuery("callingSource", cdrInfo.getCallingSource()));
}
// 查询多个拦截类型 barringType = 12 or barringType = 13 or barringType = 14
if (null != cdrInfo.getBarringTypes() && cdrInfo.getBarringTypes().length > 0) {
Integer[] barringTypes = cdrInfo.getBarringTypes();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (Integer barringType : barringTypes) {
boolQueryBuilder.should(QueryBuilders.termQuery("barringType", barringType));
}
queryBuilder.must(boolQueryBuilder);
}
// 策略ID policyId = 1234
if (null != cdrInfo.getPolicyId()) {
queryBuilder.must(QueryBuilders.termQuery("policyId", cdrInfo.getPolicyId()));
}
// 模板ID templenumber = 1234
if (null != cdrInfo.getTemplenumber()) {
queryBuilder.must(QueryBuilders.termQuery("templenumber", cdrInfo.getTemplenumber()));
}
}
// 返回总条数 因默认返回10000条
nativeSearchQueryBuilder.withTrackTotalHits(true);
// 将查询条件存到里边
nativeSearchQueryBuilder.withQuery(queryBuilder);
// 设置返回最大条数
nativeSearchQueryBuilder.withMaxResults((int) size);
// 设置页数
nativeSearchQueryBuilder.withPageable(Pageable.ofSize((int) size));
log.info("ES 查询条件为:{}", nativeSearchQueryBuilder.build().getQuery());
// 执行 深分页查询
SearchScrollHits<CdrInfoVo> searchHits = elasticsearchRestTemplate.searchScrollStart(SCROLL_TIMEOUT, nativeSearchQueryBuilder.build(), CdrInfoVo.class, IndexCoordinates.of(new String[]{"cdr"}));
int scrollTime=1;
while (searchHits.hasSearchHits() && scrollTime < current){
//取下一页,scrollId在es服务器上可能会发生变化,需要用最新的;发起continueScroll请求会重新刷新快照保留时间
searchHits = elasticsearchRestTemplate.searchScrollContinue(searchHits.getScrollId(), SCROLL_TIMEOUT, CdrInfoVo.class, IndexCoordinates.of(new String[]{"cdr"}));
scrollTime++;
scrolledIdList.add(searchHits.getScrollId());
}
//及时清除es快照,释放资源
elasticsearchRestTemplate.searchScrollClear(scrolledIdList);
// 转换为该框架支持的分页
page.setTotal(searchHits.getTotalHits());
page.setCurrent(current);
page.setSize(size);
page.setCountId(searchHits.getScrollId());
普通分页查询:
// 定义返回
Page<CdrInfoVo> page = new Page<>();
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//注:Pageable类中 pageNum需要减1,如果是第一页 数值为0
Pageable pageable = PageRequest.of(current == 0 ? 0 : (int) current - 1, (int) size, Sort.Direction.DESC, "callstarttime");
nativeSearchQueryBuilder.withPageable(pageable);
/*
1:有模板编码 不在名单 但是没有拦截
templenumber is not null AND listtype is null
AND barringType is null AND interceptstatus = 0
2:是灰名单且有模板号但是没有拦截
listtype = 2 AND templenumber is not null AND interceptstatus = 0
3:黑名单未拦截
listtype = 1 AND interceptstatus = 0
这三个应是OR的关系
*/
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.should(QueryBuilders.boolQuery().must(QueryBuilders.boolQuery()
// templenumber is not null AND listtype is null AND barringType is null AND interceptstatus = 0
// templenumber is not null 因没有不等于所以以大于0来算
.filter(QueryBuilders.rangeQuery("templenumber").from(0))
// TODO 需最终确认默认值
.filter(QueryBuilders.termQuery("listtype", 0))
// TODO 需最终确认默认值
.filter(QueryBuilders.termQuery("barringType", 0))
.filter(QueryBuilders.termQuery("interceptstatus", 0))))
.should(QueryBuilders.boolQuery().must(QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery("listtype", 2))
.filter(QueryBuilders.rangeQuery("templenumber").from(0))
.filter(QueryBuilders.termQuery("interceptstatus", 0))))
.should(QueryBuilders.boolQuery().must(QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery("listtype", 1))
.filter(QueryBuilders.termQuery("interceptstatus", 0))));
if (cdrInfo != null) {
// 主叫号码
if (StringUtils.isNotEmpty(cdrInfo.getNcallernm())) {
queryBuilder.must(QueryBuilders.termQuery("ncallernm", cdrInfo.getNcallernm()));
}
// 被叫号码
if (StringUtils.isNotEmpty(cdrInfo.getVcallernm())) {
queryBuilder.must(QueryBuilders.termQuery("vcallernm", cdrInfo.getVcallernm()));
}
// 通话时长
if (null != cdrInfo.getTalkLengths()) {
Integer[] talkLengths = cdrInfo.getTalkLengths();
if (talkLengths.length == 2) {
queryBuilder.must(
QueryBuilders.rangeQuery("talklength").from(talkLengths[0]).to(talkLengths[1]).includeLower(true).includeUpper(true));
}
}
// 拨打开始时间
if (null != cdrInfo.getStartTime()) {
long startTime = cdrInfo.getStartTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
if (null != cdrInfo.getEndTime()) {
long endTime = cdrInfo.getEndTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
queryBuilder.must(
QueryBuilders.rangeQuery("callstarttime").from(startTime).to(endTime).includeLower(true).includeUpper(true));
} else {
queryBuilder.must(QueryBuilders.rangeQuery("callstarttime").from(startTime).includeLower(true));
}
}
}
nativeSearchQueryBuilder.withTrackTotalHits(true);
nativeSearchQueryBuilder.withQuery(queryBuilder);
nativeSearchQueryBuilder.withMaxResults((int) size);
nativeSearchQueryBuilder.withPageable(Pageable.ofSize((int) size));
log.info("查询的条件为:{}", queryBuilder);
SearchHits<CdrInfoVo> searchHitsResult = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), CdrInfoVo.class);
//获取分页数据
SearchPage<CdrInfoVo> searchPageResult = SearchHitSupport.searchPageFor(searchHitsResult, pageable);
// 转换为该框架支持的分页
page.setTotal(searchPageResult.getSearchHits().getTotalHits());
page.setCurrent(current);
page.setSize(size);
List<CdrInfoVo> list = new ArrayList<>();
List<SearchHit<CdrInfoVo>> content = searchPageResult.getContent();
if (CollectionUtils.isNotEmpty(content)) {
content.forEach(cdrInfoVoSearchHit -> {
System.out.println(cdrInfoVoSearchHit.getContent());
list.add(cdrInfoVoSearchHit.getContent());
});
}
page.setRecords(list);
return page;