引言

在上一篇文章当中,我们介绍了如何在 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 中的数据只是为了参与搜索,而不参与其他的业务逻辑。因此,数据库中存储商品数据是必要的。

附:Github 代码地址

PHP 中使用 ElasticSearch 的最佳实践 (中)的更多相关文章

  1. 在objc项目中使用常量的最佳实践

    在objc项目中使用常量的最佳实践   之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量.比如,可以做个头文件,然后在需要的类文件中import,使用常量. 但这不是最佳实践 ...

  2. 在Flask中使用Celery的最佳实践

    写在前面 本最佳实践是基于作者有限的经验,欢迎大家共同讨论,可以持续维护此最佳实践.另本文中所使用的环境为Mac&Ubuntu环境,软件版本如下: Celery (4.1.0) Flask ( ...

  3. Kafka在大型应用中的 20 项最佳实践

    原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...

  4. 说出几点 Java 中使用 Collections 的最佳实践?

    这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ...

  5. 教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023

    目录 1. 本篇适用范围与目的 1.1. 适用范围 1.2. 目的 2. 牛刀小试 - 先看到地球 2.1. 创建 Vue3 - TypeScript 工程并安装 cesium 2.2. 清理不必要的 ...

  6. 说出几条 Java 中方法重载的最佳实践?

    下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱. a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参 数. b)不要重载参数数量一致,而只是参数顺序 ...

  7. reactjs中props和state最佳实践

    http://blog.csdn.net/dangnian/article/details/50998981

  8. 同步mysql数据到ElasticSearch的最佳实践

    Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据.ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全 ...

  9. 【转】Java中关于异常处理的十个最佳实践

    原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...

  10. Kubernetes日志的6个最佳实践

    本文转自Rancher Labs Kubernetes可以帮助管理部署在Pod中的上百个容器的生命周期.它是高度分布式的并且各个部分是动态的.一个已经实现的Kubernetes环境通常涉及带有集群和节 ...

随机推荐

  1. Python删除文件、文件夹----os

    使用 os  删除文件 import os '''删除文件 语法: os.unlink(path) 示例: 删除 b 文件夹中的 12.txt ''' os.unlink('b/12.txt')   ...

  2. openGauss升级脚本撰写

    概述 重要提示: 升级过程通过执行升级 sql 脚本实现系统表变更,这些脚本必须由开发人员在修改系统表的同时一并提供升级 sql 脚本,请将这些脚本代码提交至 openGauss-server/src ...

  3. 演示webuploader和cropperjs图片裁剪上传

    最近有个项目要在浏览器端裁剪并上传图片.由于缺乏人力,只能我上阵杀敌.通过参考各种文章,最后决定用cropperjs进行图片裁剪,用webuploader上传文件.本文涉及到的知识至少有Java基础. ...

  4. 正则表达针对html(九)

    前言 关于处理一些html的东西. 正文 假设有一段html文本: <?xml version="1.0" encoding="UTF-8"?> & ...

  5. This beta version of Typora is expired, please download and install a newer version. 实测最简单有效的方案

    This beta version of Typora is expired, please download and install a newer version. 实测最简单有效的方案 一.问题 ...

  6. D365调试进入系统类方法

    在生成InventDIMID时,虽然设置了InventDIMID的Number sequence为自定义的Format,但是总是不按指定的Number sequence产生InventDIMID Di ...

  7. 力扣1077(MySQL)-项目员工Ⅲ(中等)

    题目: 写 一个 SQL 查询语句,报告在每一个项目中经验最丰富的雇员是谁.如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工. 查询结果格式在以下示例中: employee_id 为 1 ...

  8. 基于EasyCV复现ViTDet:单层特征超越FPN

    简介: ViTDet其实是恺明团队MAE和ViT-based Mask R-CNN两个工作的延续.MAE提出了ViT的无监督训练方法,而ViT-based Mask R-CNN给出了用ViT作为bac ...

  9. 云小蜜 Dubbo3.0 实践:从微服务迁移上云到流量治理

    ​简介:阿里云-达摩院-云小蜜对话机器人产品基于深度机器学习技术.自然语言理解技术和对话管理技术,为企业提供多引擎.多渠道.多模态的对话机器人服务.17 年云小蜜对话机器人在公共云开始公测,同期在混合 ...

  10. 一文读懂容器存储接口 CSI

    简介: 在<一文读懂 K8s 持久化存储流程>一文我们重点介绍了 K8s 内部的存储流程,以及 PV.PVC.StorageClass.Kubelet 等之间的调用关系.接下来本文将将重点 ...