• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

引言

在上一篇文章当中,我们介绍了如何在 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 代码地址


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
EclipsePHP环境完整搭建运行发布时间:2022-07-10
下一篇:
微信开发之网页授权PHP发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap