当前位置: 首页 > news >正文

第6章 Elasticsearch,分布式搜索引擎【仿牛客网社区论坛项目】

第6章 Elasticsearch,分布式搜索引擎【仿牛客网社区论坛项目】

  • 前言
  • 推荐
  • 项目总结
  • 第6章 Elasticsearch,分布式搜索引擎
    • 1.Elasticsearch入门
    • 2.Spring整合Elasticsearch
      • DiscussPostRepository
      • DiscussPostController
      • EventConsumer
    • 3.开发社区搜索功能
  • 最后

前言

2023-4-30 20:42:51

以下内容源自【Java面试项目】
仅供学习交流使用

推荐

仿牛客网项目【面试】

项目总结

第6章 Elasticsearch,分布式搜索引擎

1.Elasticsearch入门

2.Spring整合Elasticsearch

导入依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>

DiscussPostRepository

package com.jsss.community.dao.elasticsearch;import com.jsss.community.entity.DiscussPost;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;/*
ElasticsearchRepository<DiscussPost, Integer>
DiscussPost:接口要处理的实体类
Integer:实体类中的主键是什么类型
ElasticsearchRepository:父接口,其中已经事先定义好了对es服务器访问的增删改查各种方法。Spring会给它自动做一个实现,我们直接去调就可以了。*/
@Repository
public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {}

DiscussPostController

发帖|删帖的时候,放到kakfa中了

    @RequestMapping(path = "/add",method = RequestMethod.POST)@ResponseBodypublic String addDiscussPost(String title,String content){User user=hostHolder.getUser();if (user==null){return CommunityUtil.getJSONString(403,"你还没有登录");}DiscussPost post=new DiscussPost();post.setUserId(user.getId());post.setTitle(title);post.setContent(content);post.setCreateTime(new Date());discussPostService.addDiscussPost(post);//触发发帖实践Event event =new Event().setTopic(TOPIC_PUBLISH).setUserId(user.getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(post.getId());eventProducer.fireEvent(event);String redisKey= RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey,post.getId());//报错的情况,将来统一处理return CommunityUtil.getJSONString(0,"发布成功!");}// 删除@RequestMapping(path = "/delete", method = RequestMethod.POST)@ResponseBodypublic String setDelete(int id) {discussPostService.updateStatus(id, 2);// 触发删帖事件Event event = new Event().setTopic(TOPIC_DELETE).setUserId(hostHolder.getUser().getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(id);eventProducer.fireEvent(event);return CommunityUtil.getJSONString(0);}

EventConsumer

    // 消费发帖事件@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);}// 消费删帖事件@KafkaListener(topics = {TOPIC_DELETE})public void handleDeleteMessage(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;}elasticsearchService.deleteDiscussPost(event.getEntityId());}

3.开发社区搜索功能

ElasticsearchService

    public List<DiscussPost> searchDiscussPost(String keyword, int current, int limit) throws IOException {SearchRequest searchRequest = new SearchRequest("discusspost");//discusspost是索引名,就是表名NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();//高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("title");highlightBuilder.field("content");highlightBuilder.requireFieldMatch(false);highlightBuilder.preTags("<em>");highlightBuilder.postTags("</em>");//构建搜索条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.multiMatchQuery(keyword, "title", "content")).sort(SortBuilders.fieldSort("type").order(SortOrder.DESC)).sort(SortBuilders.fieldSort("score").order(SortOrder.DESC)).sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)).from(current)// 指定从哪条开始查询.size(limit)// 需要查出的总记录条数.highlighter(highlightBuilder);//高亮searchRequest.source(searchSourceBuilder);//这有个异常SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);List<DiscussPost> list = new LinkedList<>();for (SearchHit hit : searchResponse.getHits().getHits()) {DiscussPost discussPost = JSONObject.parseObject(hit.getSourceAsString(), DiscussPost.class);// 处理高亮显示的结果HighlightField titleField = hit.getHighlightFields().get("title");if (titleField != null) {discussPost.setTitle(titleField.getFragments()[0].toString());}HighlightField contentField = hit.getHighlightFields().get("content");if (contentField != null) {discussPost.setContent(contentField.getFragments()[0].toString());}
//            System.out.println(discussPost);list.add(discussPost);}return list;}

最后

2023-7-31 20:34:10

这篇博客能写好的原因是:站在巨人的肩膀上

这篇博客要写好的目的是:做别人的肩膀

开源:为爱发电

学习:为我而行

相关文章:

第6章 Elasticsearch,分布式搜索引擎【仿牛客网社区论坛项目】

第6章 Elasticsearch&#xff0c;分布式搜索引擎【仿牛客网社区论坛项目】 前言推荐项目总结第6章 Elasticsearch&#xff0c;分布式搜索引擎1.Elasticsearch入门2.Spring整合ElasticsearchDiscussPostRepositoryDiscussPostControllerEventConsumer 3.开发社区搜索功能 最后 前…...

odoo 全局调整list_controller中默认方法(form_controller和kanban_controller等亦可以同样操作)

需求说明 工作中遇到需要调整odoo原生的tree hearder button显示逻辑&#xff0c;又不可以直接跳转odoo源码&#xff0c;故新加个js全局替换对应的方法&#xff0c;以实现对应功能的同时不影响后期odoo版本升级。 odoo 全局调整list_controller方法示例 创建一个js放到stati…...

大模型日报2024-05-13

大模型日报 2024-05-13 大模型资讯 谷歌推出Gemini生成式AI平台 摘要: 生成式人工智能正在改变我们与技术的互动方式。谷歌最近推出了名为Gemini的新平台&#xff0c;该平台代表了其在生成式AI领域的最新进展。Gemini平台集成了一系列先进的工具和功能&#xff0c;旨在为用户提…...

【使用Condition来模拟生产消费】

使用Condition来模拟生产消费 1. 关于ReentrantLock 和condition的认知?2.使用condition实现生产者-消费者1. 关于ReentrantLock 和condition的认知? /*Q: ReentrantLock是如何实现管理锁和线程的?A: ReentrantLock是并发包中 一个类,它实现了Lock接口,提供了比内置synch…...

5.14学习总结

java聊天室项目 分片上传 将大文件切分为多个小的数据块&#xff08;通常大小为1MB~10MB&#xff09;&#xff0c;然后将这些小数据块分别上传至服务器&#xff0c;最后由服务器将这些小块组合成完整的文件。这种方式可以避免由于网络中断或超时而导致上传失败&#xff0c;并…...

最新极空间部署iCloudpd教程,实现自动同步iCloud照片到NAS硬盘

【iPhone福利】最新极空间部署iCloudpd教程&#xff0c;实现自动同步iCloud照片到NAS硬盘 哈喽小伙伴们好&#xff0c;我是Stark-C~ 我记得我前年的时候发过一篇群晖使用Docker部署iCloudpd容器来实现自动同步iCloud照片的教程&#xff0c;当时热度还很高&#xff0c;可见大家…...

Sketch总结

sketch禁用了lineGap https://www.sketch.com/docs/designing/text/ http://www.sketchcn.com/sketch-chinese-user-manual.html https://github.com/sketch-hq/sketch-document https://developer.sketch.com/file-format/ https://animaapp.github.io/sketch-web-viewer/ htt…...

【iOS】工厂模式

文章目录 前言设计模式的三大原则简单工厂模式工厂方法模式抽象工厂模式关于三兄弟的升级与降级注意 前言 上文讲完了iOS的架构模式&#xff0c;接下来聊一聊设计模式&#xff0c;设计模式有许多&#xff0c;主要介绍一下工厂模式 设计模式的三大原则 S 单一职责原则 告诉我…...

目标检测算法YOLOv6简介

YOLOv6由Chuyi Li等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2209.02976 &#xff0c;项目网页&#xff1a;https://github.c…...

如何修复显示器或笔记本电脑屏幕的黄色色调?这里提供几种方法

序言 如果你的笔记本电脑屏幕呈淡黄色,则可以启用夜灯功能。该问题也可能源于连接松散的显示电缆、损坏的显卡驱动程序或错误配置的显示器设置。以下是一些故障排除步骤,你可以尝试解决此问题。 禁用夜间模式 夜间模式功能旨在减少显示器的蓝色色调,使屏幕看起来更温暖,…...

5.14 力扣每日一题 贪心

2244. 完成所有任务需要的最少轮数 class Solution { public:int minimumRounds(vector<int>& tasks) {int ntasks.size(),sum0;sort(tasks.begin(),tasks.end()); //排序就不用哈希表int a;for(int i0;i<n;){int ct0;atasks[i];while(i<n&&tasks[i]a…...

wordpress 访问文章内容页 notfound

解决&#xff1a; 程序对应的伪静态规则文件.htaccess是空的 网站根目录下要有 .htaccess 文件&#xff0c;然后将下面的代码复制进去。 <ifmodule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^index\.php$ - [L]RewriteCond %{REQUEST_FILENAME} !-fRew…...

【Python探索之旅】列表

目录 特点 入门 访问元素 新增元素 修改元素 插入元素 删除元素 完结撒花 前言 在Python中&#xff0c;列表(List)是最常用的数据结构之一&#xff0c;类似于其他语言&#xff0c;如Java&#xff0c;与其不同啊Python中不需要声明数据类型。它提供了一种灵活且高效的方式…...

搜维尔科技:深入探讨Varjo XR头显在汽车行业的可能性

搜维尔科技&#xff1a;深入探讨Varjo XR头显在汽车行业的可能性 搜维尔科技&#xff1a;深入探讨Varjo XR头显在汽车行业的可能性...

YOLOv8预测流程-原理解析[目标检测理论篇]

接下来是我最想要分享的内容&#xff0c;梳理了YOLOv8预测的整个流程&#xff0c;以及训练的整个流程。 关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了&#xff0c;为了更好地介绍本章内容&#xff0c;还是把YOLOv8网络结构图放在这里&#xff0c;方便查看。 1.前言…...

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…...

Oracle 的 RMAN(Recovery Manager) 和 DM(达梦数据库)的 DMRman异同

Oracle 的 RMAN&#xff08;Recovery Manager&#xff09; 和 DM&#xff08;达梦数据库&#xff09;的 DMRman异同 Oracle 的 RMAN&#xff08;Recovery Manager&#xff09; 和 DM&#xff08;达梦数据库&#xff09;的 DMRman 是两个分别用于不同数据库系统的备份和恢复工具…...

HVV面试题2024护网蓝队面试题

一. 目前有防火墙&#xff0c;全流量检测&#xff0c;态势感知&#xff0c;IDS&#xff0c;waf&#xff0c;web服务器等设备&#xff0c;如何搭建一个安全的内网环境&#xff0c;请给出大概拓扑结构 &#xff08;适用于中高级&#xff09; 搭建安全内网环境拓扑结构&#xff1…...

算法题--华为od机试考试(组成最大数、第k个排列、最小传输时延)

目录 组成最大数 题目描述 输入描述 输出描述 示例1 输入 输出 示例2 输入 输出 解析 答案 第k个排列 题目描述 输入描述 输出描述 示例1 输入 输出 示例2 输入 输出 解析 答案 最小传输时延 题目描述 输入描述 输出描述 示例1 输入 输出 解析…...

2024 年最新本地、云服务器安装部署 miniconda 环境详细教程(更新中)

Anaconda 概述 Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包&#xff0c;涵盖了数据科学领域常见的 Python 库&#xff0c;并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能&#xff0c;可以很方便…...

18V/4A同步降压转换器:MPQ8632GLE-4的COT控制与快速瞬态响应解析

MPQ8632GLE-4&#xff1a;4A/18V 同步降压转换器的紧凑型电源解决方案在通信设备、分布式电源系统以及服务器主板等应用中&#xff0c;电源管理单元需要在小面积内实现高效率的电压转换&#xff0c;同时保持良好的瞬态响应。传统的 PWM 控制器往往需要复杂的环路补偿设计&#…...

PB 级自动驾驶数据秒级检索:Apache Doris 统一多模态数据平台实践

导读&#xff1a;多模态数据正成为企业核心资产&#xff0c;但规模化管理仍具挑战。自动驾驶在 PB 级图像、点云、视频等数据治理中积累了可复用经验。本文介绍某公司以 Apache Doris 统一标签、元数据、全文和向量检索&#xff0c;将查询从分钟级提升至秒级。 多模态数据正在成…...

YOLOv11城市道路摩托车与自行车目标检测数据集-1569张-motorcycle-1_2

YOLOv11城市道路摩托车与自行车目标检测数据集 &#x1f4ca; 数据集基本信息 目标类别&#xff1a; [‘bike’, ‘motorcycle’]中文类别&#xff1a;[‘自行车’, ‘摩托车’]训练集&#xff1a;1374 张验证集&#xff1a;130 张测试集&#xff1a;65 张总计&#xff1a;1569…...

不止于测试:用GStreamer打造你的树莓派低成本视频监控/图传系统

树莓派视频监控实战&#xff1a;用GStreamer构建低成本图传系统 树莓派搭配普通USB摄像头能做什么&#xff1f;大多数人可能只想到简单的视频采集测试。但如果你掌握GStreamer这个多媒体框架的进阶用法&#xff0c;就能将它变成一套功能完整的视频监控或无线图传系统。本文将彻…...

MIUI手机管家自动任务还能这么玩?手把手教你用备用机+智能插座实现远程打卡(附详细避坑指南)

MIUI自动任务高阶玩法&#xff1a;备用机智能插座打造远程打卡系统全攻略 1. 为什么需要远程打卡解决方案&#xff1f; 早晨8:55分的地铁车厢里&#xff0c;小李盯着手机上的导航地图&#xff0c;红色拥堵路段让他的心跳加速——距离公司打卡截止时间只剩5分钟&#xff0c;而至…...

告别丑表格!用xlsx-style给Vue+Element UI导出的Excel加个美颜(附完整代码)

专业级Excel导出美化实战&#xff1a;VueElement UI与xlsx-style深度整合指南 在企业级后台管理系统开发中&#xff0c;数据报表的导出功能几乎是标配需求。但开发者常遇到这样的尴尬&#xff1a;精心设计的页面表格导出为Excel后&#xff0c;所有样式荡然无存&#xff0c;变成…...

国产电池包传感监测芯片:从AFE设计到BMS系统实战解析

1. 项目概述&#xff1a;从“芯”守护&#xff0c;让每一度电都安全在电动汽车的心脏——动力电池包里&#xff0c;温度、电压、电流这些关键参数哪怕出现一丝一毫的异常&#xff0c;都可能从量变引发质变&#xff0c;最终导致热失控等严重安全事故。因此&#xff0c;对电池包内…...

auditd:Linux 系统审计日志,记录谁动了你的服务器

auditd&#xff1a;Linux 系统审计日志&#xff0c;记录谁动了你的服务器 服务器被入侵后&#xff0c;管理员面临的第一个问题往往不是"怎么修复"&#xff0c;而是"到底发生了什么"——攻击者登录了哪个账号&#xff1f;修改了哪些文件&#xff1f;执行了什…...

手把手教你用网络分析仪调试CGH40010F:从S参数异常反推管子损坏原因与状态

深度解析CGH40010F氮化镓功率管故障诊断&#xff1a;从S参数异常到失效机理 在射频功率放大器设计中&#xff0c;CGH40010F作为一款经典的氮化镓(GaN)功率晶体管&#xff0c;因其高功率密度和高效率特性被广泛应用于基站、雷达等场景。然而在实际工程调试中&#xff0c;工程师们…...

docker启动线程创建异常 pthread_create EPERM | RuntimeError: can‘t start new thread

直接说答案&#xff0c;着急就复制过去使用 docker配置 增加对应权限配置参数即可 --privileged 如果上述不行&#xff0c;docker配置 使用组合方式 --privileged \ --ulimit nproc65535:65535 \ --ulimit nofile65535:65535 \详细解释 下面逐项解释这些 Docker 参数的作用、…...