PHP 中使用 ElasticSearch 的最佳实践 (中)

引言#

在上一篇文章当中,我们介绍了如何在 ElasticSearch 中创建索引以及建立字段映射关系。
接下来的这篇文章,我们将在 Laravel 中对商品信息进行增删改查及搜索。
记得 ElasticSearch 的核心应用场景,就如这句话一样 "你知道了,为了搜索"。
使用 ElasticSearch 就是为了提升数据的检索速度。

部分实践代码#

创建商品#

Copy
/** * 创建商品数据 * @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']); }

删除商品#

Copy
/** * 删除商品数据 * @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']); }

更新商品#

Copy
/** * 更新商品数据 * @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']); }

查询单个商品#

Copy
/** * 获取单个商品数据 * @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']); }

搜索商品#

Copy
/** * 搜索商品数据 * @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 代码地址

posted @   Yxh_blogs  阅读(681)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2017-08-02 CentOS6.5搭建LNMP
点击右上角即可分享
微信分享提示
CONTENTS