PHP 中使用 ElasticSearch 的最佳实践 (中)
引言
在上一篇文章当中,我们介绍了如何在 ElasticSearch 中创建索引以及建立字段映射关系。
接下来的这篇文章,我们将在 Laravel 中对商品信息进行增删改查及搜索。
记得 ElasticSearch 的核心应用场景,就如这句话一样 "你知道了,为了搜索"。
使用 ElasticSearch 就是为了提升数据的检索速度。
部分实践代码
创建商品
/**
* 创建商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function createProduct(Request $request)
{
$title = $request->request->get(ProductModel::TITLE);
$longTitle = $request->request->get(ProductModel::LONG_TITLE);
$description = $request->request->get(ProductModel::DESCRIPTION);
$sku = $request->request->get(ProductModel::SKU);
$price = $request->request->get(ProductModel::PRICE);
$sales = $request->request->get(ProductModel::SALES);
$nowTime = date("Y-m-d H:i:s");
// 商品数据写入 DB
$productId = DB::table(ProductModel::TABLE_NAME)->insertGetId([
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::CREATED_AT => $nowTime,
ProductModel::UPDATED_AT => $nowTime
]);
$params = [
'body' => [
ProductModel::PRODUCT_ID => $productId,
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::CREATED_AT => $nowTime,
ProductModel::UPDATED_AT => $nowTime
],
'id' => $productId,
'index' => self::INDEX,
'type' => self::TYPE,
];
// 商品数据写入 ES
$this->client->create($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
删除商品
/**
* 删除商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function deleteProduct(Request $request)
{
$productId = $request->request->get(ProductModel::PRODUCT_ID);
// 删除 DB 中的商品数据
DB::table(ProductModel::TABLE_NAME)->where(ProductModel::PRODUCT_ID, $productId)->delete();
// 删除 ES 中的商品数据
$params = [
'id' => $productId,
'index' => self::INDEX,
'type' => self::TYPE,
];
$this->client->delete($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
更新商品
/**
* 更新商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function updateProduct(Request $request)
{
$productId = $request->request->get(ProductModel::PRODUCT_ID);
$title = $request->request->get(ProductModel::TITLE);
$longTitle = $request->request->get(ProductModel::LONG_TITLE);
$description = $request->request->get(ProductModel::DESCRIPTION);
$sku = $request->request->get(ProductModel::SKU);
$price = $request->request->get(ProductModel::PRICE);
$sales = $request->request->get(ProductModel::SALES);
$nowTime = date("Y-m-d H:i:s");
// 商品数据更新到 DB
DB::table(ProductModel::TABLE_NAME)
->where(ProductModel::PRODUCT_ID, $productId)
->update([
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::UPDATED_AT => $nowTime
]);
$params = [
'body' => [
ProductModel::PRODUCT_ID => $productId,
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::CREATED_AT => $nowTime,
ProductModel::UPDATED_AT => $nowTime
],
'id' => $productId,
'index' => self::INDEX,
'type' => self::TYPE,
];
// 商品数据更新到 ES
$this->client->update($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
查询单个商品
/**
* 获取单个商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getProductInfo(Request $request)
{
$productId = $request->request->get(ProductModel::PRODUCT_ID);
$params = [
'id' => $productId,
'index' => self::INDEX,
'type' => self::TYPE,
];
$this->client->get($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
搜索商品
/**
* 搜索商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getProductList(Request $request)
{
$params = [
'index' => self::INDEX,
'type' => self::TYPE,
];
$this->client->search($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
小结
这篇文章我们主要是介绍了,商品数据是先写入到数据中,在同步到 ElasticSearch。那为什么不直接写入 ElasticSearch 呢?你知道的,
ElasticSearch 中的数据只是为了参与搜索,而不参与其他的业务逻辑。因此,数据库中存储商品数据是必要的。
PHP 中使用 ElasticSearch 的最佳实践 (中)的更多相关文章
- 在objc项目中使用常量的最佳实践
在objc项目中使用常量的最佳实践 之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量.比如,可以做个头文件,然后在需要的类文件中import,使用常量. 但这不是最佳实践 ...
- 在Flask中使用Celery的最佳实践
写在前面 本最佳实践是基于作者有限的经验,欢迎大家共同讨论,可以持续维护此最佳实践.另本文中所使用的环境为Mac&Ubuntu环境,软件版本如下: Celery (4.1.0) Flask ( ...
- Kafka在大型应用中的 20 项最佳实践
原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...
- 说出几点 Java 中使用 Collections 的最佳实践?
这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ...
- 教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023
目录 1. 本篇适用范围与目的 1.1. 适用范围 1.2. 目的 2. 牛刀小试 - 先看到地球 2.1. 创建 Vue3 - TypeScript 工程并安装 cesium 2.2. 清理不必要的 ...
- 说出几条 Java 中方法重载的最佳实践?
下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱. a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参 数. b)不要重载参数数量一致,而只是参数顺序 ...
- reactjs中props和state最佳实践
http://blog.csdn.net/dangnian/article/details/50998981
- 同步mysql数据到ElasticSearch的最佳实践
Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据.ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全 ...
- 【转】Java中关于异常处理的十个最佳实践
原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...
- Kubernetes日志的6个最佳实践
本文转自Rancher Labs Kubernetes可以帮助管理部署在Pod中的上百个容器的生命周期.它是高度分布式的并且各个部分是动态的.一个已经实现的Kubernetes环境通常涉及带有集群和节 ...
随机推荐
- 重新点亮linux 基本软件————防火墙[一]
前言 简单介绍一下linux的防火墙. 正文 防火墙分类: 软件防火墙和硬件防火墙 包过:过滤防火墙和应用层防火墙 iptables 的表和链 规则表: filter nat mangle raw f ...
- 第八課-Channel Study For Caller Custom JAR Lib
1.下载 apache-maven 推荐3.6.3版本:https://maven.apache.org/download.cgi 设置系统环境变量:PATH 装好后在命令行验证:mvn -v Mav ...
- HarmonyOS NEXT应用开发—自定义视图实现Tab效果
介绍 本示例介绍使用Text.List等组件,添加点击事件onclick,动画,animationTo实现自定义Tab效果. 效果预览图 使用说明 点击页签进行切换,选中态页签字体放大加粗,颜色由灰变 ...
- 阿里巴巴云原生混部系统 Koordinator 正式开源
简介: 脱胎于阿里巴巴内部,经过多年双 11 打磨,每年为公司节省数十亿的混部系统 Koordinator 今天宣布正式开源.通过开源,我们希望将更好的混部能力.调度能力开放到整个行业,帮助企业客户 ...
- 云原生数据仓库TPC-H第一背后的Laser引擎大揭秘
简介: 作者| 魏闯先阿里云数据库资深技术专家 一.ADB PG 和Laser 计算引擎的介绍 (一)ADB PG 架构 ADB PG 是一款云原生数据仓库,在保证事务ACID 能力的前提下,主要解决 ...
- 一年增加 1.2w 星,Dapr 能否引领云原生中间件的未来?
简介: 虽然 Dapr 在国外有很高的关注度,但在国内知名度非常低,而且现有的少量 Dapr 资料也偏新闻资讯和简单介绍,缺乏对 Dapr 的深度解读.在 Dapr v1.0 发布之际,我希望可以通过 ...
- 浅谈分布式一致性:Raft 与 SOFAJRaft
简介: SOFAJRaft已开源 作者 | 家纯来源 | 阿里技术公众号 一 分布式共识算法 (Consensus Algorithm) 1 如何理解分布式共识? 多个参与者针对某一件事达成完全一致: ...
- Flink 和 Iceberg 如何解决数据入湖面临的挑战
简介: 4.17 上海站 Meetup 胡争老师分享内容:数据入湖的挑战有哪些,以及如何用 Flink + Iceberg 解决此类问题. 一.数据入湖的核心挑战 数据实时入湖可以分成三个部分,分别是 ...
- 云原生 DevOps,模型化应用交付能力很重要!
简介: DevOps 文化及其支撑其落地实践的自动化工具与平台能力在云原生架构渐为普及的背后,发挥了关键的价值. 撰稿:溪洋 云原生正在成为企业业务创新和解决规模化挑战的加速器. 云原生带来的变革绝 ...
- dotnet 6 使用 Obfuscar 进行代码混淆
本文来安利大家 Obfuscar 这个好用的基于 MIT 协议开源的混淆工具.这是一个非常老牌的混淆工具,从 2014 年就对外分发,如今已有累计 495.5K 的 nuget 下载量.而且此工具也在 ...