Commit e38879ab authored by 张辰's avatar 张辰

添加埋点支持

parent e888ddc0
......@@ -40,6 +40,9 @@ public class RedisKeyConstant {
// 转发主题本身
public static final String CACHE_FORMER_THEME_ID = "CACHE_FORMER_THEME_ID_";
// 关注的人,上次浏览的最新主题last id
public static final String CACHE_IDOL_THEME_LAST_ID = "CACHE_IDOL_THEME_LAST_ID_";
public static final String THEME_VIEW_COUNT_="THEME_VIEW_COUNT_";
public static final String THEME_LIKE_COUNT_="THEME_LIKE_COUNT_";
public static final String THEME_BOOK_COUNT_="THEME_BOOK_COUNT_";
......
package com.tanpu.community.api.enums;
public enum VisitTypeEnum {
TOPIC_PAGE_VIEW("1","进入话题页"),
TOPIC_PAGE_VIEW("1","进入话题页");
// THEME_PAGE_VIEW(2,"进入主题正文"),
FOLLOW_THEME_VIEW("3","查看关注主题");
// FOLLOW_THEME_VIEW("3","查看关注主题");
private String code;
private String type;
......
......@@ -20,7 +20,6 @@ import java.util.List;
*/
public interface ThemeMapper extends BaseMapper<ThemeEntity> {
@Select("select former_theme_id as id, count(1) as times from theme ${ew.customSqlSegment}")
@Select("select former_theme_id as id, count(1) as times from theme ${ew.customSqlSegment}")
List<TimesCountEntity> selectCountByThemeIds(@Param(Constants.WRAPPER) LambdaQueryWrapper wrapper);
}
......@@ -260,14 +260,17 @@ public class ThemeManager {
} else if (ThemeListTypeEnum.FOLLOW.getCode().equals(req.getType())) {
// TODO 临时埋点,接入新埋点后删除
if (CollectionUtils.isEmpty(excludeIds)) {
visitLogService.addPageView(userId, userId, VisitTypeEnum.FOLLOW_THEME_VIEW);
}
// 根据关注列表查询,按时间倒序
List<String> fansList = followRelService.queryIdolsByFollowerId(userId);
themes = themeService.queryByUserIdsCreateDesc(fansList, pageStart, pageSize);
if (CollectionUtils.isEmpty(excludeIds) && !themes.isEmpty()) {
// 说明是从头开始刷,则直接把最新的lastId放到redis中,保留一个月
Long lastId = themes.stream().map(ThemeEntity::getId).max(Long::compareTo).get();
redisCache.put(CACHE_IDOL_THEME_LAST_ID + userId, lastId, 60 * 60 * 24 * 7 * 4);
// visitLogService.addPageView(userId, userId, VisitTypeEnum.FOLLOW_THEME_VIEW);
}
} else if (ThemeListTypeEnum.TOPIC_HOT.getCode().equals(req.getType())) {
// 根据话题查询热门
if (StringUtils.isEmpty(req.getTopicId())) {
......@@ -451,9 +454,10 @@ public class ThemeManager {
//关注用户是否有更新
public Integer getFollowUpdateCount(String userId) {
LocalDateTime lastViewTime = visitLogService.queryLatestViewFollow(userId);
String lastIdStr = redisCache.get(CACHE_IDOL_THEME_LAST_ID + userId);
Long lastId = StringUtils.isBlank(lastIdStr) ? 0L : Long.parseLong(lastIdStr);
List<String> fansList = followRelService.queryIdolsByFollowerId(userId);
return themeService.queryCountFromLastTime(fansList, lastViewTime);
return themeService.queryCountFromLastId(fansList, lastId);
}
// 屏蔽(用户)
......
......@@ -28,16 +28,12 @@ public class VisitSummaryManager {
private VisitLogService visitLogService;
List<String> PAGEID_NEED_SAVE = Arrays.asList(PageEnum.COMM_VISIT_HOME_PAGE.getId(), PageEnum.COMM_VISIT_THEME.getId());
@KafkaListener(topics = kafakTopic)
public void updateVisitSummary(String message) {
// {"durMillsInc":10000,"ident":"AD7B8CE8-2DA4-4FB4-907F-C551B926BA5C","localDate":"2021-08-02","pageId":"p13503","refId":"88737580570230824","visitorId":"275321532031467520"}
log.info("receive kafka msg: {}", message);
KafkaDurationUptMsg msg = JSON.parseObject(message, KafkaDurationUptMsg.class);
// 做一个筛选
if (!PAGEID_NEED_SAVE.contains(msg.pageId)) {
return;
}
// ident在每次进入新页面 & 回退 的时候都会随机生成一个,所以用ident做唯一key即可。
VisitLogEntity vs = ConvertUtil.convertFromKafka(msg);
visitLogService.insertOrUpdateDur(vs);
......
......@@ -283,16 +283,14 @@ public class ThemeService {
* @param lastViewTime 更新时间节点
* @return
*/
public Integer queryCountFromLastTime(List<String> userIds, LocalDateTime lastViewTime) {
public Integer queryCountFromLastId(List<String> userIds, Long lastId) {
if (CollectionUtils.isEmpty(userIds)) {
return 0;
}
LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
.in(ThemeEntity::getAuthorId, userIds)
.gt(ThemeEntity::getId, lastId)
.eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
if (lastViewTime != null) {
queryWrapper.gt(ThemeEntity::getCreateTime, lastViewTime);
}
return themeMapper.selectCount(queryWrapper);
}
......
......@@ -100,17 +100,17 @@ public class VisitLogService {
.eq(VisitLogEntity::getRefType, PageEnum.COMM_VISIT_THEME.getId()));
}
public LocalDateTime queryLatestViewFollow(String userId) {
List<VisitLogEntity> visitSummaryEntities = visitLogMapper.selectList(new LambdaQueryWrapper<VisitLogEntity>()
.eq(VisitLogEntity::getVisitorId, userId)
.eq(VisitLogEntity::getRefType, VisitTypeEnum.FOLLOW_THEME_VIEW.getCode())
.orderByDesc(VisitLogEntity::getCreateTime));
if (CollectionUtils.isEmpty(visitSummaryEntities)) {
return null;
} else {
return visitSummaryEntities.get(0).getCreateTime();
}
}
// public LocalDateTime queryLatestViewFollow(String userId) {
// List<VisitLogEntity> visitSummaryEntities = visitLogMapper.selectList(new LambdaQueryWrapper<VisitLogEntity>()
// .eq(VisitLogEntity::getVisitorId, userId)
// .eq(VisitLogEntity::getRefType, VisitTypeEnum.FOLLOW_THEME_VIEW.getCode())
// .orderByDesc(VisitLogEntity::getCreateTime));
// if (CollectionUtils.isEmpty(visitSummaryEntities)) {
// return null;
// } else {
// return visitSummaryEntities.get(0).getCreateTime();
// }
// }
//统计行为集合的浏览量
public Map<String, Integer> getCountMapByTargetIds(List<String> refIds, String refType) {
......
......@@ -16,6 +16,7 @@ import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
......@@ -132,33 +133,43 @@ public class ESHelper {
helper.client = highClient;
System.out.println("insert");
Map<String, Object> map = new HashMap<>();
map.put("name", "太阳44444444444444");
map.put("context", "这里有一个小太阳444444444");
// helper.insert("test_index", "", "2", map);
SearchSourceBuilder search = new SearchSourceBuilder();
BoolQueryBuilder boolQb = QueryBuilders.boolQuery();
MatchQueryBuilder matchQb = QueryBuilders.matchQuery("textContent", "小星星");
boolQb.must(matchQb);
String[] ks = new String[]{"左侧", "五粮液"};
for (String k : ks) {
MatchPhraseQueryBuilder contentQb = QueryBuilders.matchPhraseQuery("textContent", k);
MatchPhraseQueryBuilder titleQb = QueryBuilders.matchPhraseQuery("title", k);
boolQb.should(contentQb);
boolQb.should(titleQb);
}
// String[] includes = new String[]{"id"};
// String[] excludes = new String[]{};
search.query(boolQb).from(0).size(50);
SearchHit[] hits = helper.selectLike(search);
System.out.println(hits.length);
for (SearchHit hit : hits) {
System.out.println(hit.toString());
System.out.println(hit.getFields());
}
System.out.println("done");
try {
SearchRequest req = new SearchRequest("new-community");
req.source(search);
SearchResponse resp = helper.client.search(req, RequestOptions.DEFAULT);
SearchHit[] hits = resp.getHits().getHits();
System.out.println(hits.length);
for (SearchHit hit : hits) {
System.out.println(hit.toString());
System.out.println(hit.getFields());
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("done");
}
......
......@@ -116,7 +116,7 @@ public class ConvertUtil {
public static List<CommentQo> commentEntity2Qos(List<CommentEntity> entities) {
return entities.stream().map(ConvertUtil::commentEntity2Qo).collect(Collectors.toList());
}
/**
* VISIT_SUMMARY
*/
......
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