.maximumSize(1000)
.refreshAfterWrite(60, TimeUnit.SECONDS)
.build(
new CacheLoader<Integer, List<Long>>() {
public List<Long> load(Integer key) {
return getTopAdvertFromEs(key);
}
public ListenableFutureTask<List<Long>> reload(final Integer key, List<Long> prevGraph) {
ListenableFutureTask<List<Long>> task = ListenableFutureTask.create(() -> getTopAdvertFromEs(key));
Executors.newSingleThreadExecutor().execute(task);
return task;
}
});
private List<Long> getTopAdvertFromEs(Integer key) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withSearchType(SearchType.DEFAULT)
.withIndices(couponLogEsConfig.getIndexPrefix() + "-" + getYesterdayDate()).withTypes(couponLogEsConfig.getTypeName())
.addAggregation(terms("AppId").field("appId").size(0))
.build();
Aggregations aggregations = esTemplate.query(searchQuery, response -> response.getAggregations());
Terms byApp = aggregations.get("AppId");
Map<Long, Long> newMap = new TreeMap(Collections.reverseOrder());
for (Terms.Bucket entry : byApp.getBuckets()) {
newMap.put(entry.getDocCount(), Long.parseLong(entry.getKey().toString()));
}
return newMap.values().stream().limit(key).collect(Collectors.toList());
}
private List<Long> buildTopAdvIds(ReqAdvertFlowEstimate reqAdvertFlowEstimate) {
List<Long> topAdvertList = topAdvertListCache.getUnchecked(TOPADV_COUNT);
logger.info("TOPADVETIDS:"+JSON.toJSONString(topAdvertList)+"BINDAPP:"+JSON.toJSONString(reqAdvertFlowEstimate.getBindApp()));
if (reqAdvertFlowEstimate.getBindApp() != null&&reqAdvertFlowEstimate.getBindApp().size()>0) {//过滤定向APP的广告列表
topAdvertList = topAdvertList.stream().filter(x -> reqAdvertFlowEstimate.getBindApp().contains(Integer.parseInt(x.toString()))).collect(Collectors.toList());
}
return topAdvertList;
}