zoukankan      html  css  js  c++  java
  • PHP 中使用 ElasticSearch 的最佳实践 (中)

    引言

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

    部分实践代码

    创建商品

    /**
     * 创建商品数据
     * @param Request $request
     * @return IlluminateHttpJsonResponse
     */
    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 IlluminateHttpJsonResponse
     */
    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 IlluminateHttpJsonResponse
     */
    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 IlluminateHttpJsonResponse
     */
    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 IlluminateHttpJsonResponse
     */
    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 代码地址

  • 相关阅读:
    Ansys Maxwell2——二维电磁场理论和有限元基础
    Ansys Maxwell在工程电磁场中的应用1——二维分析技术
    第四章 栈
    第三章 链表
    第二章 队列
    第三章 操作系统用户界面总结
    第一章 逻辑结构与物理结构
    Linux-Mint的一些配置经验
    docker安装zookeeper的使用说明
    SpringCloud初体验-使用Eureka进行服务注册和发现
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/13418035.html
Copyright © 2011-2022 走看看