日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客网项目——项目开发(八):开发社区搜索功能

發(fā)布時間:2023/12/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网项目——项目开发(八):开发社区搜索功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


文章目錄

  • 1. ElasticsearchService
    • 1.1 注入bean
    • 1.2 保存(修改)和刪除
    • 1.3 搜索 searchDiscussPost
  • 2. DiscussPostController.addDiscussPost
  • 3. CommentController.addComment
  • 4. EventConsumer.handlePublishMessage
  • 5. SearchController
    • 5.1 注入屬性
    • 5.2 搜索帖子
  • 6. index.html
  • 7. search.html

1. ElasticsearchService

1.1 注入bean

@Autowired private DiscussPostRepository discussRepository;@Autowired private ElasticsearchTemplate elasticTemplate;

1.2 保存(修改)和刪除

public void saveDiscussPost(DiscussPost post) {discussRepository.save(post); }public void deleteDiscussPost(int id) {discussRepository.deleteById(id); }

1.3 搜索 searchDiscussPost

  • 返回參數(shù):Page類型數(shù)據(jù),封裝多條數(shù)據(jù)
  • 傳入?yún)?shù):關鍵字keyword,當前頁數(shù)current,每頁顯示數(shù)據(jù)limit
  • 搜索邏輯,參考前置技術(九)
  • 查詢關鍵字
  • 排序
  • 分頁
  • 高亮顯示
  • public Page<DiscussPost> searchDiscussPost(String keyword, int current, int limit) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(keyword, "title", "content")).withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)).withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC)).withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)).withPageable(PageRequest.of(current, limit)).withHighlightFields(new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")).build();return elasticTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {SearchHits hits = response.getHits();if (hits.getTotalHits() <= 0) {return null;}List<DiscussPost> list = new ArrayList<>();for (SearchHit hit : hits) {DiscussPost post = new DiscussPost();String id = hit.getSourceAsMap().get("id").toString();post.setId(Integer.valueOf(id));String userId = hit.getSourceAsMap().get("userId").toString();post.setUserId(Integer.valueOf(userId));String title = hit.getSourceAsMap().get("title").toString();post.setTitle(title);String content = hit.getSourceAsMap().get("content").toString();post.setContent(content);String status = hit.getSourceAsMap().get("status").toString();post.setStatus(Integer.valueOf(status));String createTime = hit.getSourceAsMap().get("createTime").toString();post.setCreateTime(new Date(Long.valueOf(createTime)));String commentCount = hit.getSourceAsMap().get("commentCount").toString();post.setCommentCount(Integer.valueOf(commentCount));// 處理高亮顯示的結果HighlightField titleField = hit.getHighlightFields().get("title");if (titleField != null) {post.setTitle(titleField.getFragments()[0].toString());}HighlightField contentField = hit.getHighlightFields().get("content");if (contentField != null) {post.setContent(contentField.getFragments()[0].toString());}list.add(post);}return new AggregatedPageImpl(list, pageable,hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());}}); }

    2. DiscussPostController.addDiscussPost

    發(fā)帖后把帖子存入es

    @Autowired private EventProducer eventProducer;// 觸發(fā)發(fā)帖事件 Event event = new Event().setTopic(TOPIC_PUBLISH).setUserId(user.getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(post.getId()); eventProducer.fireEvent(event);

    CommunityConstant 中增加常量

    /*** 主題: 發(fā)帖*/ String TOPIC_PUBLISH = "publish";

    3. CommentController.addComment

    觸發(fā)評論帖子事后后觸發(fā)發(fā)帖事件

    if (comment.getEntityType() == ENTITY_TYPE_POST) {// 觸發(fā)發(fā)帖事件event = new Event().setTopic(TOPIC_PUBLISH).setUserId(comment.getUserId()).setEntityType(ENTITY_TYPE_POST).setEntityId(discussPostId);eventProducer.fireEvent(event); }

    4. EventConsumer.handlePublishMessage

    消費發(fā)帖事件

    // 消費發(fā)帖事件 @KafkaListener(topics = {TOPIC_PUBLISH}) public void handlePublishMessage(ConsumerRecord record) {if (record == null || record.value() == null) {logger.error("消息的內容為空!");return;}Event event = JSONObject.parseObject(record.value().toString(), Event.class);if (event == null) {logger.error("消息格式錯誤!");return;}DiscussPost post = discussPostService.findDiscussPostById(event.getEntityId());elasticsearchService.saveDiscussPost(post); }

    5. SearchController

    5.1 注入屬性

    @Autowired private ElasticsearchService elasticsearchService;@Autowired private UserService userService;@Autowired private LikeService likeService;

    5.2 搜索帖子

  • 調用service查詢
  • 把數(shù)據(jù)存入一個map
  • 把數(shù)據(jù)傳給模板
  • 傳遞分頁信息
  • // search?keyword=xxx @RequestMapping(path = "/search", method = RequestMethod.GET) public String search(String keyword, Page page, Model model) {// 搜索帖子org.springframework.data.domain.Page<DiscussPost> searchResult =elasticsearchService.searchDiscussPost(keyword, page.getCurrent() - 1, page.getLimit());// 聚合數(shù)據(jù)List<Map<String, Object>> discussPosts = new ArrayList<>();if (searchResult != null) {for (DiscussPost post : searchResult) {Map<String, Object> map = new HashMap<>();// 帖子map.put("post", post);// 作者map.put("user", userService.findUserById(post.getUserId()));// 點贊數(shù)量map.put("likeCount", likeService.findEntityLikeCount(ENTITY_TYPE_POST, post.getId()));discussPosts.add(map);}}model.addAttribute("discussPosts", discussPosts);model.addAttribute("keyword", keyword);// 分頁信息page.setPath("/search?keyword=" + keyword);page.setRows(searchResult == null ? 0 : (int) searchResult.getTotalElements());return "/site/search"; }

    6. index.html

    <!-- 搜索 --> <form class="form-inline my-2 my-lg-0" method="get" th:action="@{/search}"><input class="form-control mr-sm-2" type="search" aria-label="Search" name="keyword" th:value="${keyword}"/><button class="btn btn-outline-light my-2 my-sm-0" type="submit">搜索</button> </form>

    7. search.html

  • 模板
  • 路徑
  • 頭部復用
  • js路徑
  • 遍歷
  • <li class="media pb-3 pt-3 mb-3 border-bottom" th:each="map:${discussPosts}">
  • 頭像
  • <img th:src="${map.user.headerUrl}" class="mr-4 rounded-circle" alt="用戶頭像" style="width:50px;height:50px;">
  • 標題
  • <h6 class="mt-0 mb-3"><a th:href="@{|/discuss/detail/${map.post.id}|}" th:utext="${map.post.title}">備戰(zhàn)<em>春招</em>,面試刷題跟他復習,一個月全搞定!</a> </h6>
  • 帖子作者
  • <u class="mr-3" th:utext="${map.user.username}">寒江雪</u>
  • 發(fā)布時間,贊,回復信息
  • 發(fā)布于 <b th:text="${#dates.format(map.post.createTime,'yyyy-MM-dd HH:mm:ss')}">2019-04-15 15:32:18</b> <ul class="d-inline float-right"><li class="d-inline ml-2"><i th:text="${map.likeCount}">11</i></li><li class="d-inline ml-2">|</li><li class="d-inline ml-2">回復 <i th:text="${map.post.commentCount}">7</i></li> </ul>
  • 分頁復用
  • <!-- 分頁 --> <nav class="mt-5" th:replace="index::pagination"><ul class="pagination justify-content-center"><li class="page-item"><a class="page-link" href="#">首頁</a></li><li class="page-item disabled"><a class="page-link" href="#">上一頁</a></li><li class="page-item active"><a class="page-link" href="#">1</a></li><li class="page-item"><a class="page-link" href="#">2</a></li><li class="page-item"><a class="page-link" href="#">3</a></li><li class="page-item"><a class="page-link" href="#">4</a></li><li class="page-item"><a class="page-link" href="#">5</a></li><li class="page-item"><a class="page-link" href="#">下一頁</a></li><li class="page-item"><a class="page-link" href="#">末頁</a></li></ul> </nav>

    總結

    以上是生活随笔為你收集整理的牛客网项目——项目开发(八):开发社区搜索功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 浮力影院国产第一页 | 日本黄色大片网站 | 一区二区三区欧美 | www.在线看 | 欧美色视频一区二区三区 | 在线一本| 国产精品第13页 | 国产亚洲精品一区二区三区 | 三八激情网 | 亚洲女同女同女同女同女同69 | 国产永久免费无遮挡 | 久草午夜 | 中文字幕亚洲一区二区三区五十路 | 交视频在线播放 | 无码人妻精品一区二区蜜桃视频 | 免费黄色大片 | 中文字幕av一区二区三区谷原希美 | 韩日成人| 爱爱中文字幕 | 国产精品主播一区二区 | 中文字幕日韩精品在线 | 久久一区精品 | 欧美一区二区激情视频 | 成年人在线免费 | 337p色噜噜 | 欧美精品久久天天躁 | 免费的黄色一级片 | 国产精品蜜臀 | 久久网页| 久久无码国产视频 | v天堂中文在线 | 久久久久久久久久久丰满 | 台湾男男gay做爽爽的视频 | 蜜臀视频在线观看 | 国产精品99久久久久久一二区 | 国产精品久久久久999 | 豆花免费跳转入口官网 | 日韩不卡视频在线观看 | 大尺度舌吻呻吟声 | 国产精品-色哟哟 | 欧美日韩视频网站 | 三年中文在线观看中文版 | 国产毛片在线视频 | 欧美一区中文字幕 | 青娱乐免费在线视频 | 天天视频黄 | 久久7777| 女同av在线 | 亚洲黄在线| 国产日韩欧美一区二区东京热 | 少妇视频一区二区三区 | 一级片免费观看 | 这里只有精品视频在线观看 | 欧美日韩视频一区二区三区 | 国产一区二区三区免费播放 | 亚洲国产视频一区 | 男人的av | 国产日韩欧美成人 | 人与拘一级a毛片 | 国产高清在线一区 | 国模在线观看 | 天天舔天天射 | 黄色一级视屏 | 婷婷色图 | 91嫩草精品| 中国字幕一色哟哟 | 日韩在线国产精品 | 涩涩视频免费 | 国产精品一区二区av日韩在线 | 无码人妻一区二区三区免费n鬼沢 | 91精品国自产在线偷拍蜜桃 | 这里只有精品视频在线 | 一出一进一爽一粗一大视频 | 欧美高清久久 | 成年人在线免费观看网站 | h片大全| 国产午夜一级一片免费播放 | 国产老熟女伦老熟妇露脸 | 欧美日韩视频 | 亚洲性事 | 国产精品免费久久 | 91精品国产综合久久久久久 | 欧美日韩国产综合网 | 亚洲欧美日韩一区在线观看 | 琪琪电影午夜理论片八戒八戒 | 日日草视频| 秋霞福利 | 成人福利视频网站 | 日韩三级精品 | 夜色快播 | 黄色日批视频 | 天堂av中文字幕 | 久热精品免费视频 | 久久国产亚洲精品无码 | 在线1区| 久久久久久在线观看 | 日韩av中字| 日韩欧美视频免费在线观看 | 乱亲女h秽乱长久久久 |