Commit f4a353db by 陈健智

舆情分析走势图调整

parent a03528a4
......@@ -910,9 +910,6 @@ public class MarkDataServiceImpl implements MarkDataService {
}
private BaseMap getFirstArticle(Long startTime, Long endTime, String aggTitle, String projectId, String contendId, String planId, boolean include) throws IOException{
if (StringUtils.isBlank(aggTitle)){
return null;
}
// 索引
String[] indexes = esClientDao.getIndexes();
// postFilter
......@@ -2522,21 +2519,35 @@ public class MarkDataServiceImpl implements MarkDataService {
// 负面趋势图
Pair<String, List<LineVO>> negativeSpreadTendency = getSpreadTendency(startTime, endTime, planId, EmotionEnum.NEGATIVE.getName());
Map<String, BaseMap> baseMaps = new HashMap<>(2);
BaseMap totalBaseMaps = null;
BaseMap negativeBaseMaps = null;
if (Objects.nonNull(negativeSpreadTendency.getLeft()) && Objects.nonNull(spreadTendency.getLeft())) {
CompletableFuture.allOf(Stream.of(spreadTendency.getLeft(), negativeSpreadTendency.getLeft()).map(aggTitle -> CompletableFuture.runAsync(() -> {
try {
baseMaps.put(aggTitle, getFirstArticle(startTime, endTime, aggTitle, projectId, Constant.PRIMARY_CONTEND_ID, planId, true));
} catch (IOException ignored) {
}
}, executor)).toArray(CompletableFuture[]::new)).join();
}
// 趋势图标题为空,此时说明最高点的时间段发文平台全为微博,此时取最高点时间段内时间最早的微博发文
if (Objects.isNull(spreadTendency.getLeft()) || Objects.isNull(negativeSpreadTendency.getLeft())){
totalBaseMaps = getWeiboFirstArticle(endTime, spreadTendency.getRight(), planId, projectId, null);
negativeBaseMaps = getWeiboFirstArticle(endTime, spreadTendency.getRight(), planId, projectId, EmotionEnum.NEGATIVE.getName());
}
// 最高点
BaseMap baseMap = baseMaps.get(spreadTendency.getLeft());
BaseMap baseMap = Objects.isNull(baseMaps.get(spreadTendency.getLeft())) ? totalBaseMaps : baseMaps.get(spreadTendency.getLeft());
JSONObject highestJson = new JSONObject();
highestJson.put("title", Objects.isNull(baseMap) ? null : baseMap.getTitle());
highestJson.put("url", Objects.isNull(baseMap) ? null : baseMap.getUrl());
BaseMap negativeBaseMap = baseMaps.get(negativeSpreadTendency.getLeft());
if (Objects.nonNull(baseMap)) {
highestJson.put("title", baseMap.getTitle());
highestJson.put("url", baseMap.getUrl());
}
// 负面最高点
BaseMap negativeBaseMap = Objects.isNull(baseMaps.get(negativeSpreadTendency.getLeft())) ? negativeBaseMaps : baseMaps.get(negativeSpreadTendency.getLeft());
JSONObject negativeHighestJson = new JSONObject();
negativeHighestJson.put("title", Objects.isNull(negativeBaseMap) ? null : negativeBaseMap.getTitle());
negativeHighestJson.put("url", Objects.isNull(negativeBaseMap) ? null : negativeBaseMap.getUrl());
if (Objects.nonNull(negativeBaseMap)) {
negativeHighestJson.put("title", negativeBaseMap.getTitle());
negativeHighestJson.put("url", negativeBaseMap.getUrl());
}
res.putAll(platformSpreadTendency);
res.put("总量", spreadTendency.getRight());
res.put("负面", negativeSpreadTendency.getRight());
......@@ -2548,6 +2559,54 @@ public class MarkDataServiceImpl implements MarkDataService {
return res;
}
/**
* 获取时间段内的微博最早文章
*
* @param lines
* @param planId
* @param projectId
* @param emotion
* @return
* @throws IOException
*/
private BaseMap getWeiboFirstArticle(Long endTime, List<LineVO> lines, String planId, String projectId, String emotion) throws IOException {
if (CollectionUtils.isEmpty(lines)){
return null;
}
// 最高点的时间为开始时间
LineVO startLine = lines.stream().max(Comparator.comparingLong(LineVO::getCount)).get();
Long startTime = startLine.getDate();
int startIndex = lines.indexOf(startLine);
// 最高点后一个点的时间为结束时间
endTime = startIndex == lines.size() - 1 ? endTime : lines.get(startIndex + 1).getDate();
// 索引
String[] indexes = esClientDao.getIndexes();
// postFilter
BoolQueryBuilder postFilter;
if (Objects.isNull(planId)) {
postFilter = projectContendIdQuery(projectId, Constant.PRIMARY_CONTEND_ID);
}else {
postFilter = EsQueryTools.assembleCacheMapsPlanQuery(projectId, planId);
}
// emotion
if (StringUtils.isNotEmpty(emotion) && !EmotionEnum.ALL.getName().equals(emotion)) {
postFilter.must(QueryBuilders.termQuery("brandkbs_mark_cache_maps.name.keyword", emotion));
}
// weibo平台
postFilter.must(QueryBuilders.termQuery("platform_id", "5d02236e6395002a7c380b79"));
postFilter.must(QueryBuilders.rangeQuery("time").gte(startTime).lt(endTime));
//sort
FieldSortBuilder sort = new FieldSortBuilder("time").order(SortOrder.ASC);
//hits
SearchHits hits = esClientDao.searchHits(indexes, postFilter, null, null, sort, 0, 1, null);
if (0 == hits.getTotalHits().value) {
return new BaseMap();
}
BaseMap baseMap = Tools.getBaseFromEsMap(hits.getAt(0).getSourceAsMap());
baseMap.setTitle(baseMap.getContent());
return baseMap;
}
@Override
public List<JSONObject> getActiveChannels(Long startTime, Long endTime, String planId) {
List<JSONObject> list = new ArrayList<>();
......@@ -2789,14 +2848,14 @@ public class MarkDataServiceImpl implements MarkDataService {
res.add(new LineVO(count, time));
});
// 走势图最高点的聚合标题
String maxAggTitle = "";
String maxAggTitle = null;
Optional<? extends Histogram.Bucket> maxBucket = buckets.stream().max(Comparator.comparingLong(MultiBucketsAggregation.Bucket::getDocCount));
if (maxBucket.isPresent()){
Map<String, Aggregation> map = maxBucket.get().getAggregations().asMap();
ParsedStringTerms countTeam = (ParsedStringTerms) map.get("titleAgg");
List<? extends Terms.Bucket> titleBuckets = countTeam.getBuckets();
// 没有拿到聚合标题,说明此时发文的平台为微博
maxAggTitle = CollectionUtils.isEmpty(titleBuckets) ? "" : titleBuckets.get(0).getKeyAsString();
// 没有拿到聚合标题,说明此时发文的平台为微博
maxAggTitle = CollectionUtils.isEmpty(titleBuckets) ? null : titleBuckets.get(0).getKeyAsString();
}
return Pair.of(maxAggTitle, res);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment