仿牛客网项目---Elasticsearch分布式搜索引擎

1.什么是ElasticSearch分布式搜索引擎?

Elasticsearch是一个开源的分布式搜索引擎,提供实时的、高可用性的搜索和分析解决方案。它支持快速索引和搜索大规模数据,具有分布式架构、RESTful API、基于JSON的查询语言等功能,适用于各种应用场景,如全文搜索。

比如说现在,我拥有一个电子商务网站,然后我需要一个搜索引擎来让用户能够快速地搜索和找到他们感兴趣的商品。这时候,我就可以使用Elasticsearch作为你的分布式搜索引擎。

假设现在我的电子商务网站有几百万个商品,并且我希望用户可以根据商品的名称、描述、价格、品牌等信息进行搜索。

首先,我会使用Elasticsearch的API将商品数据索引到Elasticsearch集群中。每个商品将被表示为一个文档,包含属性如商品名称、描述、价格等。

当用户在我的网站上进行搜索时,我就可以使用Elasticsearch的搜索API发送一个搜索请求。比如,用户搜索关键词"手机"。

Elasticsearch将会在索引中查找包含关键词"手机"的所有文档,并返回匹配的结果。

2.项目中的搜索功能实现

在Dao层中新建Elasticsearch文件,添加Elasticsearch接口,用于连接数据库(只需要继承接口即可)。

@Repository
public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {}

上面的代码其实是用Elasticsearch创建一个帖子的仓库接口,以便在应用程序中访问和操作Elasticsearch中的帖子数据。这个相对而言比较简单。

service层写一个ElasticsearchService文件。

@Service
public class ElasticsearchService {@Autowiredprivate DiscussPostRepository discussRepository;@Autowiredprivate ElasticsearchTemplate elasticTemplate;public void saveDiscussPost(DiscussPost post) {discussRepository.save(post);}public void deleteDiscussPost(int id) {discussRepository.deleteById(id);}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());}});}}

上述代码展示了一个名为 ElasticsearchService 的服务类,它提供了以下功能:

  1. saveDiscussPost 方法用于将帖子数据保存到 Elasticsearch 中。它接收一个 DiscussPost 对象作为参数,并调用 discussRepository 的 save 方法将数据保存到 Elasticsearch 中。

  2. deleteDiscussPost 方法用于从 Elasticsearch 中删除指定 ID 的数据。它接收一个整数类型的 ID 参数,并调用 discussRepository 的 deleteById 方法来删除数据。

  3. searchDiscussPost 方法用于在 Elasticsearch 中搜索帖子数据。它接收关键字、当前页码和每页显示数量作为参数,并执行一个复杂的搜索查询。将查询结果封装成一个 Page<DiscussPost> 对象返回。

上面说了很多,其实你只要知道这段代码作用就是这样的,ElasticsearchService 提供了对 Elasticsearch 中讨论帖子数据的保存、删除和搜索功能。它充分利用了 Spring Data Elasticsearch 和 ElasticsearchTemplate 提供的功能和方法,简化了与 Elasticsearch 的交互和操作。该服务类可以被其他组件或业务逻辑调用,以实现对 Elasticsearch 数据的管理和检索。

在Controller层写一个SearchController文件。

@Controller
public class SearchController implements CommunityConstant {@Autowiredprivate ElasticsearchService elasticsearchService;@Autowiredprivate UserService userService;@Autowiredprivate LikeService likeService;// 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());// 聚合数据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()));// 点赞数量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";}}

这段代码的作用是展示了一个名为 SearchController 的控制器类,用于处理搜索功能的请求。

  1. 接收用户输入的关键字 keyword、分页信息 page 和模型对象 model

  2. 调用 elasticsearchService 的 searchDiscussPost 方法,传递关键字、当前页码和每页显示数量,以执行搜索操作。

  3. 将搜索结果 searchResult 中的每个帖子,以及帖子的作者和点赞数量等信息,存储在 discussPosts 列表中的 Map 对象中。

  4. 将 discussPosts、关键字 keyword 和分页信息 page 添加到模型对象 model 中,以便在视图中进行展示。

看了这么多,反正你要知道的就是SearchController 控制器类负责接收用户的搜索请求,调用 ElasticsearchService 执行搜索操作,获取搜索结果,并将结果和相关信息传递给视图进行展示。通过这个控制器类,用户可以在前端页面输入关键字进行搜索,然后获取搜索结果并在页面上显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/730704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下搭建虚拟机

Windows下搭建虚拟机 安装Linux虚拟机 下载&安装VirtualBox&#xff1a;https://www.virtualbox.org/&#xff0c;点击 download virtualbox 6.x&#xff0c;选择对应平台的版本&#xff1a;Windows hosts → https://download.virtualbox.org/virtualbox/6.1.38/Virtual…

蓝桥杯集训·每日一题2024 (二分,双指针)

前言&#xff1a; 开学了&#xff0c;平时学习的压力也逐渐大起来了&#xff0c;不过还算可以接受&#xff0c;等到后面阶段考的时候就不一样了&#xff0c;我目前为了转专业退选了很多课&#xff0c;这些课我都需要花时间来刷绩点&#xff0c;不然保研就没有竞争力了。我自己会…

【 深度学习相关的线性代数知识点】

深度学习相关的线性代数知识点 在机器学习和深度学习中&#xff0c;线性代数的知识点主要包括标量、向量、矩阵和张量。 线性代数在机器学习和深度学习中扮演着基础且关键的角色。它不仅涉及到算法的设计和优化&#xff0c;而且对于数据的表示、处理和分析都至关重要。例如&a…

洛谷: P1531 I Hate It(线段树)

记录一道线段树单点修改题目。 创建线段树的时间复杂度为O(n),每次查找和修改的时间复杂度均为O(logn) 代码: #include <bits/stdc.h> using namespace std; const int maxn 1e6 10; int arr[maxn], tree[maxn], n, m; void build(int node, int start, int end) {/…

OpenCASCADE+Qt创建建模平台

1、建模平台效果 2、三维控件OCCWidget 将V3d_View视图与控件句柄绑定即可实现3d视图嵌入Qt中&#xff0c;为了方便也可以基于QOpenGLWidget控件进行封装&#xff0c;方便嵌入各种窗体使用并自由缩放。 #ifndef OCCTWIDGET_H #define OCCTWIDGET_H#include <QWidget> #i…

javaWebssh药品进销存信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh药品进销存信息管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOM…

【Python】使用 onnxruntime-gpu 进行推理,解决运行时间久了显存被拉爆了

1. 问题 使用 onnxruntime-gpu 进行推理&#xff0c;解决运行时间久了显存被拉爆了 2. C/Python 配置 运行时&#xff0c;配置 provder , gpu_mem_limit 参数来进行限制&#xff0c;比如2G显存 21474836482 * 1024 * 1024 * 1024 Python providers [("TensorrtExecu…

【机器学习300问】29、训练数据少该怎么办?数据增强

一、什么时候会遇到训练数据少的情况&#xff1f; 在机器学习和深度学习中&#xff0c;遇到训练样本不足的情况通常发生在出现了新的任务、高昂的采集数据成本&#xff0c;稀有事件或小众领域等。接下来我展开说三种情形并分别举个例子。 &#xff08;1&#xff09;出现新的任…

392.判断子序列(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位…

Filter过滤器+JWT令牌实现登陆验证

一、背景 我们需要在客户端访问服务器的时候给定用户一定的操作权限&#xff0c;比如没有登陆时就不能进行其他操作。如果他需要进行其他操作&#xff0c;而在这之前他没有登陆过&#xff0c;服务端则需要将该请求拦截下来&#xff0c;这就需要用到过滤器&#xff0c;过滤器可以…

原创+顶级SCI优化!23年新算法PSA优化CNN-LSTM-Attention一键实现多变量回归预测!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 效果展示 数据介绍 创新点 模型流程 部…

【 React 】对React中类组件和函数组件的理解?有什么区别?

相关文章&#xff1a; 1 React 中的类组件 2 React中的函数组件 1. 类组件 类组件&#xff0c;也就是通过使用ES6类的编写形式去编写组件&#xff0c;该类必须继承React.Component 如果想要访问父组件传递过来的参数&#xff0c;可以通过this.props方式去访问 在组件中必须实现…

RabbitMQ的web控制端介绍

2.1 web管理界面介绍 connections&#xff1a;无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#xff0c;在这里可以查看连接情况channels&#xff1a;通道&#xff0c;建立连接后&#xff0c;会形成通道&#xff0c;消息的投递、获取…

Vue-Router使用

1.安装 npm install vue-router4 2. 添加路由 新建router文件夹&#xff0c;新建文件 index.ts import { createRouter, createWebHashHistory,createWebHistory} from "vue-router";const routes [{path: /login,component: () > import("../views/Logi…

[leetcode 169][多数元素]

[leetcode 169][多数元素] 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] …

[XS2123] 集成功率 MOSFET V1.0, IEEE 802.3af 兼容的 PD 和 DC/DC 控制器

[XS2123] 集成功率 MOSFET V1.0&#xff0c; IEEE 802.3af 兼容的 PD 和 DC/DC 控制器 概述 XS2123 是一款基于 IEEE 802.3af 标准 PD 和DC/DC 集成的控制器。 该芯片的 PD 控制器部分为用电设备&#xff08;PD&#xff09;提供符合以太网供电&#xff08;PoE&a…

牛客网——美团2024届秋招笔试第三场编程真题

牛客网——美团2024届秋招笔试第三场编程真题 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. 平均数为k的最长连续子数组2. 小球投盒3. 小红结账4. 小美的游戏5. 小美种果树6…

小米汽车上市进入倒计时,已开启内部试驾

在十四届全国人大二次会议上&#xff0c;全国人大代表、小米集团创始人、董事长CEO雷军回应了小米汽车的最新消息&#xff0c;小米汽车预计很快就要正式上市。 小米汽车推出了两款车型&#xff1a;SU7和SU7 Max。这两款车型均为纯电轿车&#xff0c;带来了不同的配置和性能特点…

python自学6

第一节第十章 开发图表 第一个可视化图表&#xff0c;折线图的开发 json数据格式 pyecharts模块 图标源码网站 Document gallery.pyecharts.org pyecharts模块的快速入门 pyecharts配置有两个选项 全局配置是对整个可视化界面进行配置&#xff0c;比如名字&#xff0c;工具…

代码复现错误

1. 问题&#xff1a; torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 39.59 GiB total capacity; 37.72 GiB already allocated; 38.19 MiB free; 37.83 GiB reserved in total by PyTorch) If reserved memory is >> allocat…