关于laravel使用Elastic Search的一些记录

news2024/12/23 1:11:21

文章目录

      • 1. 准备工作
      • 2. 本地安装elastic search
      • 3. laravel安装es依赖
      • 4. laravel中使用es
      • 参考链接

1. 准备工作

因为我本地php版本是7.3.4,不支持太高的es。
所以使用如下环境:
laravel6 + php7.3.4 + elastic search 7.17.2

2. 本地安装elastic search

1. 下载安装包(这里下载的是7.17.2版本)    https://www.elastic.co/cn/downloads/past-releases
2. 解压进入文件夹
3. 修改config/jvm.options文件,
	1. 将虚拟机大小
		-Xms4g
		-Xmx4g
		改为:
		-Xms256m
		-Xmx1g
	2. 再文件最后添加以下代码。(防止启动时乱码) 
		-Dfile.encoding=GBK
4. 双击bin目录下的elasticsearch.bat文件,启动elastic search。
5. 访问http://localhost:9200/   即可安装成功。

注意事项:

  1. 如果是8以上版本,初次启动时会生成密码。安装成功以后,访问https://localhost:9200/,会提示输入密码。用户名为elastic,密码就是初始化时的密码。
  2. 如果是8以上版本,初始化以后,携带密码访问的话,需要访问https,而不是http
  3. 如果是8以上版本,想要关闭密码的话,需要修改config/elasticsearch.yml文件,修改如下:xpack.security.enabled: false

3. laravel安装es依赖

composer require elasticsearch/elasticsearch “7.17.2”

配置database.php

'elasticsearch' => [
   	// Elasticsearch 支持多台服务器负载均衡,因此这里是一个数组
	'hosts' => explode(',',env('ES_HOSTS')),
]

.env 配置

ES_HOSTS=127.0.0.1:9200

初始化es对象,注入到容器中。
修改App/Providers/AppServiceProvider.php文件

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Elasticsearch\ClientBuilder as ESClientBuilder;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
        // 注册一个名为 es 的单例
        $this->app->singleton('es', function () {
            // 从配置文件读取 Elasticsearch 服务器列表
            $builder = ESClientBuilder::create()->setHosts(config('database.elasticsearch.hosts'));
            // 如果是开发环境
            if (app()->environment() === 'local') {
                // 配置日志,Elasticsearch 的请求和返回数据将打印到日志文件中,方便我们调试
                $builder->setLogger(app('log')->driver());
            }

            return $builder->build();
        });

    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

测试是否成功,

php artisan tinker
>>>app('es')->info();

会输出和访问http://127.0.0.1:9200一样的内容。
在这里插入图片描述

4. laravel中使用es

创建脚本代码

php artisan make:command Elasticsearch/SyncProducts

修改app/Console/Commands/Elasticsearch/SyncProducts.php文件

<?php
namespace App\Console\Commands\Elasticsearch;

use App\Models\Product;
use Illuminate\Console\Command;

class SyncProducts extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'es:sync-products';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '将商品数据同步到 Elastic Search';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // 获取 Elasticsearch 对象
        $es = app('es');

        $sql = 'id,`name`,`desc`,brand_id,category_id,shop_id,price,sold_count,review_count,status,create_time';

        Product::query()
            ->selectRaw($sql)
            // 使用 chunkById 避免一次性加载过多数据
            ->chunkById(100, function ($products) use ($es) {

                $this->info(sprintf('正在同步 ID 范围为 %s 至 %s 的商品', $products->first()->id, $products->last()->id));

                // 初始化请求体
                $req = ['body' => []];
                // 遍历商品
                foreach ($products as $product) {
                    // 将商品模型转为 Elasticsearch 所用的数组
                    $data = $product->toESArray($product->id, $product->category_id);

                    $req['body'][] = [
                        'index' => [
                            '_index' => 'test',
                            '_id' => $data['id'],
                        ],
                    ];
                    $req['body'][] = $data;
                }

                try {
                    // 使用 bulk 方法批量创建
                    $es->bulk($req);
                } catch (\Exception $e) {
                    $this->info($e->getMessage());
                }

            });
        $this->info('同步完成');
    }
}

创建Product模型进行数据过滤

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;

class Product extends Model
{
    //
    public $table = "product";

    public function toESArray($product_id,$category_id)
    {
        // 只取出需要的字段
        $arr = Arr::only($this->toArray(), [
            'id',
            'name',
            'desc',
            'brand_id',
            'shop_id',
            'price',
            'sold_count',
            'review_count',
            'status',
            'create_time'
        ]);

//        $productSkus = ProductSkus::query()->selectRaw('name,price')->where('product_id',$product_id)->get()->toArray();

        // skus在索引中是一个二维数组, 这里只取出需要的 SKU 字段
//        $arr['skus'] = $productSkus;
        $arr['skus'] = rand(111111,999999);

//        $sql = "lmrs_at.name as name,lmrs_at_val.name as value";

//        $attributes = Attributes::query()->selectRaw($sql)
//            ->from('attributes as at')
//
//            ->leftJoin('attribute_values as at_val','at.id','at_val.attribute_id')
//
//            ->where('at.category_id',$category_id)
//
//            ->get()->toArray();

        // attributes 在索引中是一个二维数组, 这里只取出需要的商品属性字段
//        $arr['attributes'] = $attributes;
        $arr['attributes'] = 'attributes';

        return $arr;
    }

}

我们在写入商品数据的时候用的是 bulk() 方法,这是 Elasticsearch 提供的一个批量操作接口。设想一下假如我们系统里有数百万条商品,如果每条商品都单独请求一次 Elasticsearch 的 API,那就是数百万次的请求,性能肯定是很差的,而 bulk() 方法可以让我们用一次 API 请求完成一批操作,从而减少请求次数的数量级,提高整体性能。

创建表

CREATE TABLE `zlsn_product` (
  `id` int(4) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '商品名',
  `desc` varchar(255) DEFAULT NULL COMMENT '描述',
  `brand_id` int(4) DEFAULT NULL COMMENT '品牌id',
  `category_id` int(4) DEFAULT NULL COMMENT '分类id',
  `shop_id` int(4) DEFAULT NULL COMMENT '店铺id',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  `sold_count` int(4) DEFAULT NULL COMMENT '卖出数量',
  `review_count` int(4) DEFAULT NULL COMMENT '回购数量',
  `status` tinyint(1) DEFAULT '1' COMMENT '状态 1 正常 2 下架',
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1002 DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

创建执行过程,用来随机插入1000条测试数据

CREATE PROCEDURE p01 ()
BEGIN
declare i int;
set i=1001;

while i<=2000 do

INSERT INTO product ( `name`, `desc`, brand_id, category_id, shop_id, price, sold_count, review_count, `status`, create_time )
VALUES
	(
	(SELECT
		SUBSTRING( MD5( RAND()), 1, 5 )),
	(SELECT
		SUBSTRING( MD5( RAND()), 1, 10 )),
	(SELECT
		CEILING( RAND() * 1000 )),
	(SELECT
		CEILING( RAND() * 1000 )),
	(SELECT
		CEILING( RAND() * 1000 )),
	(SELECT
		CEILING( RAND() * 1000 )),
	(SELECT
		CEILING( RAND() * 1000 )),
	(SELECT
		CEILING( RAND() * 1000 )),
	1,
	NOW());

set i=i+1;
end WHILE;

END;

运行以下SQL,执行此执行过程,生成测试数据

CALL p01 ();

此时zlsn_product表中就有测试数据了。

运行php脚本,将生成的SQL数据存入到es

php artisan es:sync-products

参考链接

  1. laravel使用elasticsearch
  2. Mysql循环添加1000条数据案列
  3. MySQL生成随机字符串
  4. win10下Elasticsearch安装配置完整教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

备战金九银十,两份 JAVA 面试题 2023 最新整合版,祝你脱颖而出

前言 马上又准备到了一年一度的金九银十环节&#xff0c;作为一年中的跳槽求职高峰期&#xff0c;相信有很多朋友都已经开始着手准备面试了&#xff0c;但是网上的面试题杂七杂八的&#xff0c;所以今天分享 2 份整合好的合集版&#xff0c;从基础到深入比较全面。即适合初入社…

windows10系统-14-Hexo博客框架和DevSidecar加速访问GitHub

HexoGitee零代码基础从0到1部署博客全流程&#xff08;一&#xff09; HexoGithub博客搭建教程 亲测解决npm ERR! Unexpected end of JSON input while parsing near…的方法 Hexo-修改Hexo主题 hexo免费主题 现在市面上的博客很多&#xff0c;如CSDN&#xff0c;博客园&#x…

【干货】Android系统定制基础篇:第二部分

1、Android Launcher3支持键盘切换焦点 Android Launcher3 默认并不支持键盘操作&#xff0c;无法切换焦点&#xff0c;在一些需要支持键盘或遥控操作的设备中无法使用&#xff0c;因些对 Launcher3 做简单修改&#xff0c;使其支持键盘切换焦点。 diff --git a/packages/app…

C语言学习笔记:指针

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 目录 简介 …

Redis客户端 - SpringDataRedis

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - SpringDataRedis | CoderMast编程桅杆https://www.codermast.com/database/redis/spring-data-redis.html 介绍 SpringData 是 Spring 中操作数据的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中…

2023 年最新阿里巴巴 Java 面试权威指南(泰山版)

不知道现在同学们有没有想法备战金九银十&#xff0c;好多未雨绸缪的同学已经开始整理学习资源了&#xff0c;有些同学想冲击一下大厂&#xff0c;有些同学希望自己能够涨薪&#xff01;不管是出于哪种想法&#xff0c;看一下现在的时间&#xff0c;也确实该准备了&#xff0c;…

English Learning - L3 作业打卡 Lesson6 Day41 2023.6.14 周三

English Learning - L3 作业打卡 Lesson6 Day41 2023.6.14 周三 引言&#x1f349;句1: In the early morning, the food that had been laid out for the dead is thrown into a river or into the sea as it is considered unlucky for anyone living to eat it.成分划分弱读…

C语言学习笔记:数组

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 目录​​​​…

基于javaweb jsp+SSM 酒店客房管理系统的设计与实现

一.项目介绍 本系统需要进行登录&#xff0c;点击登录即可跳转到登陆页面&#xff0c; 管理员密码是在数据库中设置好的可以直接登录&#xff0c; 其它用户需要管理员登录以后注册用户才可以根据账号密码登录。 当登录进入到系统当中时 可以对客房&#xff0c;商品&#xff…

使用python制作一个批量查询搜索排名的SEO免费工具

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 搭建背景 最近工作中需要用…

《人月神话》译文修订明细(10)-读者可以对照修改

《人月神话》译文修订明细&#xff08;1&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;2&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;3&#xff09;-读者可以对照修改 《人月神话》译文修订明细&#xff08;4&#xff09;-读…

团队管理之性能实施团队日志14 -- 项目终结

历时2个月16天&#xff0c;项目结束了。 今天给客户做最终的汇报。 本来汇报准备了92页PPT&#xff0c;把几个系统单独的都一个个说了个遍。但是感觉这种方式老板不一定能接受。于是换了一个方式&#xff0c;只说overview的结果&#xff0c;但系统的就不一一解释了。 老板更想…

【C/C++套接字编程】TCP通信实验

一、实验目的&#xff1a; 通过本实验使学员了解和掌握编写基于TCP协议的网络应用程序。任务是开发一个基于TCP Socket API的网络聊天程序。 二、实验内容简要描述 用所学的TCP Socket API知识来开发基于TCP协议的网络。通过编程实现服务端和客户端的信息通信。TCP协议建立交…

【MySQL】之索引与索引优化

目录 一、索引介绍二、MySQL索引结构二、索引优化 一、索引介绍 1、索引简介 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 可以得到索引的本质&#xff1a;索引是数据结构。索引的目的在于提高查询效率&…

高考状元、通用语言和轰趴-UMLChina建模知识竞赛第4赛季第4轮

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响获奖&#xff0c…

Springboot使用pdfbox提取PDF图片

Springboot使用pdfbox提取PDF图片 PDFBox的介绍Springboot集成PDFBox一、提取pdf首页为图像1. 实现需求2. 项目代码3. 执行结果 二、将pdf内容全部转换为图像1. 实现需求2. 项目代码3. 执行结果4.注意事项1.优化项目代码2.提升Java heap size PDFBox的介绍 PDFBox是一个用于创…

FDM3D打印系列——1、愉快的给自己打印一个手办

大家好&#xff0c;我是阿赵。 我日常的个人爱好&#xff0c;除了写博客&#xff0c;还有弹吉他打鼓电子琴&#xff0c;还有3D打印。 3D打印只是我的一个业余&#xff0c;不过由于经常把做好的作品发朋友圈&#xff0c;也带动了身边一些朋友买了和我一样型号的打印机&#xff0…

一种说法:哲学是研究真善美的

一种说法&#xff1a;哲学是研究真、善、美的 今天在工作中谈到了真善美 确定一个企业价值观&#xff1a;求真&#xff0c;求善&#xff0c;求美 我觉得挺好&#xff0c;起码无需解释能懂意思 趣讲大白话&#xff1a;真善美是基本问题 【趣讲信息科技199期】 *****************…

用Python做一个下载器,从获取数据到编写GUI界面

本片文章目录 前言案例基本实现思路?代码实现一、单张小说下载二、整本小说下载三、多线程采集四、采集排行榜所有小说五、搜索小说功能六、GUI界面 尾语 前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 对于广大书虫而言&#xff0c;没有小说看是最痛苦的&#xff0…

English Learning - L3 作业打卡 Lesson6 Day42 2023.6.15 周四

English Learning - L3 作业打卡 Lesson6 Day42 2023.6.15 周四 引言&#x1f349;句1: In towns that are near the sea, the tiny lanterns which had been hung in the streets the night before, are placed into the water when the festival is over.成分划分弱读连读爆破…