结合了MySQL数据库、Elasticsearch和Redis,构建一个产品搜索和推荐系统
1. 数据库设置(MySQL)
首先,我们需要创建两个表来存储产品信息和产品类别信息。
CREATE DATABASE product_system;USE product_system;CREATE TABLE `categories` (`id` INT AUTO_INCREMENT PRIMARY KEY,`name` VARCHAR(255) NOT NULL,`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE `products` (`id` INT AUTO_INCREMENT PRIMARY KEY,`name` VARCHAR(255) NOT NULL,`description` TEXT,`price` DECIMAL(10, 2),`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE `product_categories` (`product_id` INT,`category_id` INT,PRIMARY KEY (`product_id`, `category_id`),FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE CASCADE,FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE CASCADE
);
2. 安装依赖库
使用Composer安装Elasticsearch、Redis和数据库的依赖库。
composer require elasticsearch/elasticsearch predis/predis
composer require vlucas/phpdotenv # 用于环境变量管理
3. 配置环境变量
在项目根目录下创建一个.env
文件,存储数据库和Elasticsearch的配置信息。
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=product_system
DB_USERNAME=root
DB_PASSWORD=yourpasswordELASTICSEARCH_HOST=127.0.0.1:9200
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
4. 创建数据库连接和Elasticsearch客户端
require 'vendor/autoload.php';use Elasticsearch\ClientBuilder;
use Predis\Client as RedisClient;
use PDO;// 加载环境变量
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();// 数据库连接
function getDatabaseConnection() {$dsn = "mysql:host=" . getenv('DB_HOST') . ";dbname=" . getenv('DB_DATABASE');return new PDO($dsn, getenv('DB_USERNAME'), getenv('DB_PASSWORD'));
}// Elasticsearch客户端
$elasticsearch = ClientBuilder::create()->setHosts([getenv('ELASTICSEARCH_HOST')])->build();// Redis客户端
$redis = new RedisClient(['scheme' => 'tcp','host' => getenv('REDIS_HOST'),'port' => getenv('REDIS_PORT'),
]);
5. Elasticsearch索引配置和数据同步
// 创建Elasticsearch索引
function createElasticsearchIndex($elasticsearch) {$params = ['index' => 'products','body' => ['mappings' => ['properties' => ['name' => ['type' => 'text'],'description' => ['type' => 'text'],'price' => ['type' => 'float'],]]]];$elasticsearch->indices()->create($params);
}// 同步数据库中的产品到Elasticsearch
function syncProductToElasticsearch($product, $elasticsearch) {$params = ['index' => 'products','id' => $product['id'],'body' => ['name' => $product['name'],'description' => $product['description'],'price' => $product['price'],]];$elasticsearch->index($params);
}// 从数据库获取产品数据
function getProductFromDatabase($productId, $db) {$stmt = $db->prepare("SELECT * FROM products WHERE id = :id");$stmt->execute(['id' => $productId]);return $stmt->fetch(PDO::FETCH_ASSOC);
}
6. 产品搜索与Redis缓存
function searchProducts($query, $elasticsearch, $redis) {$cacheKey = 'search_' . md5($query);// 从Redis中获取缓存数据if ($redis->exists($cacheKey)) {return json_decode($redis->get($cacheKey), true);}// 如果缓存未命中,则从Elasticsearch中搜索$params = ['index' => 'products','body' => ['query' => ['multi_match' => ['query' => $query,'fields' => ['name', 'description']]]]];$response = $elasticsearch->search($params);$results = array_map(function ($hit) {return $hit['_source'];}, $response['hits']['hits']);// 将搜索结果缓存到Redis$redis->setex($cacheKey, 3600, json_encode($results));return $results;
}
7. 添加和查询产品
// 添加新产品并同步到Elasticsearch
function addProduct($name, $description, $price, $db, $elasticsearch) {$stmt = $db->prepare("INSERT INTO products (name, description, price) VALUES (:name, :description, :price)");$stmt->execute(['name' => $name,'description' => $description,'price' => $price]);$productId = $db->lastInsertId();// 同步到Elasticsearch$product = getProductFromDatabase($productId, $db);syncProductToElasticsearch($product, $elasticsearch);
}// 通过关键词搜索产品
function searchAndDisplayProducts($query, $elasticsearch, $redis) {$products = searchProducts($query, $elasticsearch, $redis);foreach ($products as $product) {echo "Name: " . $product['name'] . "\n";echo "Description: " . $product['description'] . "\n";echo "Price: $" . $product['price'] . "\n";echo "-----------------------\n";}
}// 示例操作
$db = getDatabaseConnection();
addProduct('iPhone 14', 'Latest model of iPhone', 999.99, $db, $elasticsearch);
searchAndDisplayProducts('iPhone', $elasticsearch, $redis);
8. 完整项目结构
project-root/
│
├── .env
├── composer.json
├── vendor/
└── index.php
9. 运行项目
通过以下命令运行项目:
php -S localhost:8000
在浏览器中访问 http://localhost:8000
,即可看到产品搜索结果。
这个项目展示了如何使用PHP结合MySQL、Elasticsearch和Redis,构建一个功能齐全的产品搜索和推荐系统。你可以根据自己的需要进一步扩展这个项目。
相关文章:
结合了MySQL数据库、Elasticsearch和Redis,构建一个产品搜索和推荐系统
1. 数据库设置(MySQL) 首先,我们需要创建两个表来存储产品信息和产品类别信息。 CREATE DATABASE product_system;USE product_system;CREATE TABLE categories (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,created_at…...
白酒与素食:健康与美味的双重享受
在美食的世界里,白酒与素食的搭配仿佛是一场跨界的盛宴。豪迈白酒(HOMANLISM)的醇香与精致素食的清新,在不经意间交织出了一幅美妙的画卷,让人在品味中感受到健康与美味的双重享受。 素食,以其清淡、自然的…...
工厂现场多功能帮手,三防平板改善管理体验
随着制造业的智能化变革,信息化、自动化和智能化逐渐成为工厂管理的新常态。在这一波技术浪潮中,三防平板作为一种多功能的工作工具,正在逐步改善工厂现场的管理体验。 一、三防平板的定义与特点 三防平板,顾名思义,是…...
【git】问题解决---Failed to connect to github.com
场景 最近运行命令git push,git pull或者git clone的时候总会报如下错误 fatal: unable to access https://github.com/xxxxx/xxxxxx.git/: **Failed to connect to github.com** port 443 after 21052 ms: Couldnt connect to server原因 一般是网络配置原因造成的, 如果能…...
Java 中 String 类型的特点
在 Java 中,String 是一种常用且重要的数据类型,用于表示和处理字符序列。它有一些独特的特性和用法,使得它在开发中非常灵活和高效。以下是关于 String 类型的一些特点、特殊性、使用技巧以及注意事项。 1. String 的特点 1.1 不可变性 定…...
AddressUtils 、RegionUtils IP地址工具类
一、类展示 AddressUtils : /*** 获取地址类**/ Slf4j NoArgsConstructor(access AccessLevel.PRIVATE) public class AddressUtils {// 未知地址public static final String UNKNOWN "XX XX";public static String getRealAddressByIP(String ip) {i…...
牛客网SQL进阶134: 满足条件的用户的试卷总完成次数和题目总练习次数
满足条件的用户的试卷完成数和题目练习数_牛客题霸_牛客网 0 问题描述 基于用户信息表user_info、试卷信息表examination_info、试卷作答记录表exam_record、题目练习记录表practice_record,筛选出 高难度SQL试卷得分平均值大于80并且是7级的用户,统计他…...
机器学习:逻辑回归处理手写数字的识别
1、获取数据, 图像分割该数据有50行100列,每个数字占据20*20个像素点,可以进行切分,划分出训练集和测试集。 import numpy as np import pandas as pd import cv2 imgcv2.imread("digits.png")#读取文件 graycv2.cvtColor(img,cv2.COLOR_BGR2G…...
文件上传真hard
一、SpringMVC实现文件上传 1.1.项目结构 1.1.2 控制器方法 RequestMapping("/upload1.do")public ModelAndView upload1(RequestParam("file1") MultipartFile f1) throws IOException {//获取文件名称String originalFilename f1.getOriginalFilename(…...
精益管理|介绍一本专门研究防错法(Poka-Yoke)的书
在现代制造业中,如何确保产品在每个生产环节中不出现错误是企业追求的目标之一。而实现这一目标的关键技术之一就是防错法(Poka-Yoke)。作为一种简单而有效的精益管理、六西格玛管理工具,防错法帮助企业避免因人为错误或工艺不当导…...
面试题目:(4)给表达式添加运算符
目录 题目 代码 思路解析 例子 题目 题目 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)、- 或 * ,返回 所有能够得到 target 的表达式。1 < num.length &…...
[C#]将opencvsharp的Mat对象转成onnxruntime的inputtensor的3种方法
第一种方法:在创建tensor时候直接赋值改变每个tensor的值,以下是伪代码: var image new Mat(image_path);inpWidth image.Width;inpHeight image.Height;//将图片转为RGB通道Mat image_rgb new Mat();Cv2.CvtColor(image, image_rgb, Col…...
CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!
一、CTF简介 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…...
数据链路层 I(组帧、差错控制)【★★★★★】
(★★)代表非常重要的知识点,(★)代表重要的知识点。 为了把主要精力放在点对点信道的数据链路层协议上,可以采用下图(a)所示的三层模型。在这种三层模型中,不管在哪一段…...
悟空降世 撼动全球
文|琥珀食酒社 作者 | 积溪 一只猴子能值多少钱? 答案是:13个小目标 这两天 只要你家没有断网 一定会被这只猴子刷屏 它就是咱国产的3A游戏 《黑神话:悟空》 这只猴子到底有多火? 这么跟你说吧 茅台见了它都…...
Swoole 和 Java 哪个更有优势呢
Swoole 和 Java 各有优势,在性能上不能简单地说哪一个更好,需要根据具体的应用场景来分析。 Swoole 优势:高并发:Swoole 是一个基于 PHP 的异步、协程框架,专为高并发场景设计,适用于 I/O 密集型应用&…...
Salesforce 发布开源大模型 xGen-MM
xGen-MM 论文 在当今 AI 技术飞速发展的时代,一个新的多模态 AI 模型悄然崛起,引起了业界的广泛关注。这个由 Salesforce 推出的开源模型—— xGen-MM,正以其惊人的全能特性和独特优势,在 AI 领域掀起一阵旋风。那么,x…...
冒 泡 排 序
今天咱们单独拎出一小节来聊一聊冒泡排序昂 冒泡排序的核心思想就是:两两相邻的元素进行比较(理解思路诸君可看下图) 接下来我们上代码演示: 以上就是我们初步完成的冒泡排序,大家不难发现,不管数组中的元…...
采用先进的人工智能视觉分析技术,能够精确识别和分析,提供科学、精准的数据支持的智慧物流开源了。
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...
IAA游戏APP如何让合理地让用户观看更多广告,提高广告渗透率
广告变现已经成为休闲游戏开发者重要的收益方式之一,超50%国内休闲游戏已经采用广告变现的方式,游戏广告预算是游戏行业开发者广告变现的主要预算来源。 #深度好文计划#如何合理地提高广告渗透率? 广告渗透率能直接反映游戏中有广告行为用户…...
环网交换机的特殊作用是什么?
环网交换机作为现代网络建设的重要组成部分,具有独特而特殊的作用。在信息技术迅猛发展的今天,各类数据传输和网络连接需求日益增加,环网交换机的出现为解决这些问题提供了理想的方案。环网交换机通常将多个网络节点通过环形结构连接起来&…...
mac电脑安装Zsh并启用
安装 Zsh 1. 安装 Zsh 新版mac系统会默认安装并使用zsh,如没用,需在终端中安装: brew install zsh2. 安装 Oh My Zsh 克隆Oh My Zsh到你的目录: git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh3. 复…...
【后续更新】python搜集上海二手房数据
源码如下: import asyncio import aiohttp from lxml import etree import logging import datetime import openpyxlwb = openpyxl.Workbook() sheet = wb.active sheet.append([房源, 房子信息, 所在区域, 单价, 关注人数和发布时间, 标签]) logging.basicConfig(level=log…...
创建GPTs,打造你的专属AI聊天机器人
在2023年11月的「OpenAI Devday」大会上,OpenAI再度带来了一系列令人瞩目的新功能,其中ChatGPT方面的突破尤为引人关注。而GPTs的亮相,不仅标志着个性化AI时代的到来,更为开发者和普通用户提供了前所未有的便利。接下来࿰…...
深度学习 vector 之模拟实现 vector (C++)
1. 基础框架 这里我们有三个私有变量,使用 _finish - _start 代表 _size,_end_of_storage - _start 代表 _capacity,并且使用到了模版,可以灵活定义存储不同类型的 vector,这里将代码量较小的函数直接定义在类的内部使…...
关于LLC知识10
在LLC谐振腔中能够变化的量 1、输入电压 2、Rac(负载) 所以增益曲线为红色(Rac无穷大)已经是工作的最大极限了,LLC不可能工作在红色曲线之外 负载越重时,增益曲线越往里面 假设: 输入电压…...
最长的严格递增或递减子数组
给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 示例 1: 输入:nums [1,4,3,3,2] 输出:2 解释: nums 中严格递增的子数组有[1]、[2]、[3]、[3]、[4] 以及 [1,4] 。 nums 中…...
【JavaEE】SpringBoot 统一功能处理:拦截器、统一数据返回与异常处理的综合应用与源码解析
目录 SpringBoot 统⼀功能处理拦截器拦截器快速⼊⻔拦截器详解拦截路径拦截器执⾏流程 登录校验定义拦截器注册配置拦截器 DispatcherServlet 源码分析(了解)初始化(了解) DispatcherServlet的初始化1. HttpServletBean.init()2. FrameworkServlet.initServletBean() WebApplic…...
I2C学习:上拉电阻选取
一.I2C简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。I2C总线在使用时,需要接上拉电阻,这是因为I2C接口是开漏输出,如图1所示。 图1 I2C开漏输出 I2C有5种速度模式:标准(100KHz&am…...
AC自动机-1
AC自动机(Aho-Corasick Automaton)是一种高效的多模式字符串匹配算法。它是由Alfred Aho和Margaret Corasick在1975年提出的。这种算法可以在一次扫描输入文本的情况下,同时查找多个模式串。 基本概念 Trie树 AC自动机是基于字典树数据结构构建的字典树…...
dnf做汉堡怎么玩间网站/企业建网站一般要多少钱
汽车广泛普及在改变人们生活方式 、提高人们生活质量方面发挥了巨大作用,但汽车消耗大量不可再生的石油资源、排放大量有毒有害气体、制造噪音,给人类生活的环境带来的不可估量的危害。特别是近二十多年来,世界范围内的能源危机与日益严峻的环…...
wordpress登陆重定向/常州谷歌优化
excel文件中的工作表默认的工作表名是Sheet 1,想要修改工作表的名字只要双击工作表名就会出现光标,删除点默认名称,输入想要修改的名字就可以了。如果想要对工作表还有其他操作,可以右键点击工作表名称,会有选项框弹出…...
酒店品牌网站建设推广/网站关键词快速优化
本文介绍以下内容: LFET JOIN、RIGHT JOIN、INNER JOIN、UNION、UNION ALL、FULL JOIN等! 测试数据(以下数据未经考证,非真实有效数据,仅作为本次学习的测试数据!) 全国大学排名TOP20No.校名地区…...
上海的网站建设公司/广州seo优化外包服务
[1,2,3].map(String) > [‘1’,‘2’,‘3’] [‘1’,‘2’,‘3’].map(Number) // [1,2,3] 0.toString() 数字传字符串 ‘0’ Number(n5)字符串转数字...
wap网站有哪些/深圳全网推互联科技有限公司
https://segmentfault.com/a/1190000013822385转载于:https://www.cnblogs.com/EricZ-Blog/p/10817168.html...
枣庄市建设局网站/seo是广告投放吗
使用Java完成Excel文件的上传、内容的解析和以及保存操作。重点主要在于使用org.apache.poi包下的Workbook类完成对Excel内容的解析首先pom文件引入Apache poi,org.apache.poipoi-ooxml3.9Apache POI提供API给Java程序对Microsoft Office(Excel、Word、PowerPoint等…...