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

这篇具有很好参考价值的文章主要介绍了关于laravel使用Elastic Search的一些记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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一样的内容。
关于laravel使用Elastic Search的一些记录

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文章来源地址https://www.toymoban.com/news/detail-503525.html

php artisan es:sync-products

参考链接

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

到了这里,关于关于laravel使用Elastic Search的一些记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用docker安装elastic search[ES]和kibana

    使用docker安装elastic search和kibana,版本均为7.17.1 docker pull# 去dockerhub看具体版本,这里用7.17.1 临时安装生成文件# 参数说明 -d 后台启动 –name 起别名即:NAMES -p 9200:9200 将端口映射出来 elasticsearch的9200端口是供外部访问使用;9300端口是供内部访问使用集群间通讯 -e “discovery.

    2024年02月14日
    浏览(29)
  • 【elastic search】JAVA操作elastic search

    目录 1.环境准备 2.ES JAVA API 3.Spring Boot操作ES 本文是作者ES系列的第三篇文章,关于ES的核心概念移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 关于ES的下载安装教程以及基本使用,移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 在前文

    2024年01月25日
    浏览(35)
  • elastic search入门

    参考1:Elastic Search 入门 - 知乎 参考2:Ubuntu上安装ElasticSearch_ubuntu elasticsearch-CSDN博客 1、ElasticSearch安装 1.1安装JDK,省略,之前已安装过 1.2创建ES用户 1.3 下载ElasticSearch安装包 Ubuntu上下载: 然后解压: 1.4配置 配置jvm.options 配置elasticsearch.yml: 根据以上设置的path.data和path.l

    2024年01月23日
    浏览(36)
  • SpringCloud整合Elastic Search

    1、配置Elastic Search 注释说明: spring.elasticsearch.rest.uris :设置Elastic Search的连接地址,这里的示例是本地地址 http://localhost:9200 ,根据实际情况修改。 spring.elasticsearch.username 和 spring.elasticsearch.password :设置Elastic Search的用户名和密码,如果没有设置访问控制,这两项可以省略

    2024年02月15日
    浏览(35)
  • Elastic Search 命令详解-索引操作

    关于Elastic Search安装可以参考《Elastic Search 8.6.2集群安装部署》及Kibana安装可以参考《Elastic Search 8.6.2简单操作》。相关命令将在Kibana工具的Console平台上执行。 Elastic Search索引操作主要包含:创建、删除、关闭和打开索引,以及索引别名的操作。其中,索引别名的操作在生产环

    2024年02月08日
    浏览(32)
  • 【搜索引擎】elastic search核心概念

    前言 本文不涉及ES的具体安装下载、操作、集群的内容,这部分内容会放在后面一篇文章中。本文只包含ES的核心理论,看完本文再去学ES的细节会事半功倍。 目录 1.由日志存储引出的问题 2.什么是ES? 3.ES的数据结构 4.ES的核心原理 5.联系作者 本文或者说本系列的来源: 前面

    2024年02月03日
    浏览(37)
  • Elastic Search的RestFul API入门:如何进行ES的查询-search

    在这篇教学文章中,我们将深入探讨Elasticsearch的search功能。这是一个非常强大且灵活的功能,它允许我们对存储在Elasticsearch中的数据进行各种复杂的查询和分析。本章的目标是让读者理解如何进行Elasticsearch的搜索,以及如何在搜索过程中自主调整搜索参数,从而灵活地控制

    2024年02月03日
    浏览(38)
  • elastic search es 分组统计 aggs 次数用法

    参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html es 各个版本的语法可能会不一样,如果大家在用的时候发现语法报错了,请查阅相关版本的语法。 刚需要按 ip 地址统计某个接口的访问次数,查了下 es 分组统计次数 aggs 的用法,特此记录一下,方

    2024年02月11日
    浏览(44)
  • Elastic Search 根据匹配分和热度分排序

    匹配分、热度分归一化 排序:匹配分 * 0.8 + 热度分 * 0.2

    2024年02月16日
    浏览(36)
  • Laravel 后台管理 Dcat Admin 使用记录

    安装文档地址 框架版本 Laravel 8.* 修改 admin.php 文件 英文改为中文 修改 app.php 文件 表格字段 js 操作 路由 请求方法 链接 1. 字数超出隐藏 2. 链接新窗口打开 功能 - 默认值, 新增操作, 编辑操作 index 方法自动覆盖 grid 方法 将 body 中替换为 表单页面 动态获取选项列表

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包