朕略显ぼうっと萌

子华宝宝
第 5529 位会员
注册于 2年前
活跃于 1天前

PHP开发工程师 @ 河南索克网络



学习使我快乐!
最近发表的评论
  • Laravel Conf China 2019 上线售票 at 1周前

    file

  • Elasticsearch 迁移报错 at 4个月前

    如果你要是和我一样 没有弄同义词搜索的话,你可以进行如下操作(注意注释):

    #app/Console/Commands/Elasticsearch/Indices/ProjectIndex.php
    ...
     public static function getProperties()
        {
            return [
                'type' => ['type' => 'keyword'],
                'title' => ['type' => 'text'],
                'long_title' => ['type' => 'text'],
    
                // 应该是这样的 但是我没有配置 同义词映射
                // 'title' => ['type' => 'text', 'analyzer' => 'ik_smart', 'search_analyzer' => 'ik_smart_synonym'],
                // 'long_title' => ['type' => 'text', 'analyzer' => 'ik_smart', 'search_analyzer' => 'ik_smart_synonym'],
                'category_id' => ['type' => 'integer'],
                'category' => ['type' => 'keyword'],
                'category_path' => ['type' => 'keyword'],
                'description' => ['type' => 'text', 'analyzer' => 'ik_smart'],
                'price' => ['type' => 'scaled_float', 'scaling_factor' => 100],
                'on_sale' => ['type' => 'boolean'],
                'rating' => ['type' => 'float'],
                'sold_count' => ['type' => 'integer'],
                'review_count' => ['type' => 'integer'],
                'skus' => [
                    'type' => 'nested',
                    'properties' => [
                        'title' => [
                            'type' => 'text',
                            // 我没有配置 同义词映射
                            // 'analyzer' => 'ik_smart',
                            // 'search_analyzer' => 'ik_smart_synonym',
                            'copy_to' => 'skus_title',
                        ],
                        'description' => [
                            'type' => 'text',
                            // 我没有配置 同义词映射
                            // 'analyzer' => 'ik_smart',
                            'copy_to' => 'skus_description',
                        ],
                        'price' => ['type' => 'scaled_float', 'scaling_factor' => 100],
                    ],
                ],
                'properties' => [
                    'type' => 'nested',
                    'properties' => [
                        'name' => ['type' => 'keyword'],
                        'value' => ['type' => 'keyword', 'copy_to' => 'properties_value'],
                        'search_value' => ['type' => 'keyword'],
                    ],
                ],
            ];
        }
    #app/Console/Commands/Elasticsearch/Migrate.php
    
    #注释掉所有的 $indexClass::getSettings(),
    
    <?php
    
    namespace App\Console\Commands\Elasticsearch;
    
    use Illuminate\Console\Command;
    
    /**
     * Elasticsearch 索引结构迁移
     * Class Migrate
     * @auth: kingofzihua
     * @package App\Console\Commands\Elasticsearch
     */
    class Migrate extends Command
    {
        /**
         * @auth: kingofzihua
         * @var string
         */
        protected $signature = 'es:migrate';
        /**
         * @auth: kingofzihua
         * @var string
         */
        protected $description = 'Elasticsearch 索引结构迁移';
        /**
         * @auth: kingofzihua
         * @var
         */
        protected $es;
    
        /**
         * Migrate constructor.
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * @auth: kingofzihua
         * @throws \Exception
         */
        public function handle()
        {
            $this->es = app('es');
    
            // 索引类数组,先留空
            $indices = [Indices\ProjectIndex::class];
            // 遍历索引类数组
            foreach ($indices as $indexClass) {
                // 调用类数组的 getAliasName() 方法来获取索引别名
                $aliasName = $indexClass::getAliasName();
                $this->info('正在处理索引 ' . $aliasName);
                // 通过 exists 方法判断这个别名是否存在
                if (!$this->es->indices()->exists(['index' => $aliasName])) {
                    $this->info('索引不存在,准备创建');
                    $this->createIndex($aliasName, $indexClass);
                    $this->info('创建成功,准备初始化数据');
                    $indexClass::rebuild($aliasName);
                    $this->info('操作成功');
                    continue;
                }
                // 如果索引已经存在,那么尝试更新索引,如果更新失败会抛出异常
                try {
                    $this->info('索引存在,准备更新');
                    $this->updateIndex($aliasName, $indexClass);
                } catch (\Exception $e) {
                    $this->warn('更新失败,准备重建');
                    $this->reCreateIndex($aliasName, $indexClass);
                }
                $this->info($aliasName . ' 操作成功');
            }
        }
    
        /**
         * 创建新索引
         * @auth: kingofzihua
         * @param $aliasName
         * @param $indexClass
         */
        protected function createIndex($aliasName, $indexClass)
        {
            // 调用 create() 方法创建索引
            $this->es->indices()->create([
                // 第一个版本的索引名后缀为 _0
                'index' => $aliasName . '_0',
                'body' => [
                    // 调用索引类的 getSettings() 方法获取索引设置
                    // 'settings' => $indexClass::getSettings(),
                    'mappings' => [
                        '_doc' => [
                            // 调用索引类的 getProperties() 方法获取索引字段
                            'properties' => $indexClass::getProperties(),
                        ],
                    ],
                    'aliases' => [
                        // 同时创建别名
                        $aliasName => new \stdClass(),
                    ],
                ],
            ]);
        }
    
        /**
         * 更新已有索引
         * @auth: kingofzihua
         * @param $aliasName
         * @param $indexClass
         */
        protected function updateIndex($aliasName, $indexClass)
        {
            // 暂时关闭索引
            $this->es->indices()->close(['index' => $aliasName]);
            // 更新索引设置
            $this->es->indices()->putSettings([
                'index' => $aliasName,
                // 'body' => $indexClass::getSettings(),
            ]);
            // 更新索引字段
            $this->es->indices()->putMapping([
                'index' => $aliasName,
                'type' => '_doc',
                'body' => [
                    '_doc' => [
                        'properties' => $indexClass::getProperties(),
                    ],
                ],
            ]);
            // 重新打开索引
            $this->es->indices()->open(['index' => $aliasName]);
        }
    
        /**
         * 重建索引
         * @auth: kingofzihua
         * @param $aliasName
         * @param $indexClass
         * @throws \Exception
         */
        protected function reCreateIndex($aliasName, $indexClass)
        {
            // 获取索引信息,返回结构的 key 为索引名称,value 为别名
            $indexInfo = $this->es->indices()->getAliases(['index' => $aliasName]);
            // 取出第一个 key 即为索引名称
            $indexName = array_keys($indexInfo)[0];
            // 用正则判断索引名称是否以 _数字 结尾
            if (!preg_match('~_(\d+)$~', $indexName, $m)) {
                $msg = '索引名称不正确:' . $indexName;
                $this->error($msg);
                throw new \Exception($msg);
            }
            // 新的索引名称
            $newIndexName = $aliasName . '_' . ($m[1] + 1);
            $this->info('正在创建索引' . $newIndexName);
            $this->es->indices()->create([
                'index' => $newIndexName,
                'body' => [
                    // 'settings' => $indexClass::getSettings(),
                    'mappings' => [
                        '_doc' => [
                            'properties' => $indexClass::getProperties(),
                        ],
                    ],
                ],
            ]);
            $this->info('创建成功,准备重建数据');
            $indexClass::rebuild($newIndexName);
            $this->info('重建成功,准备修改别名');
            $this->es->indices()->putAlias(['index' => $newIndexName, 'name' => $aliasName]);
            $this->info('修改成功,准备删除旧索引');
            $this->es->indices()->delete(['index' => $indexName]);
            $this->info('删除成功');
        }
    }
    

    修改完后 继续就可以了!

  • Elasticsearch 迁移报错 at 4个月前

    你是不是也没弄那个 同义词搜索?

  • use Illuminate\Notifications\Notifiable; 和 use Notifiable; 有什么区别 ? at 7个月前

    我觉得你是对 这两个use使用理解上有点问题,
    use Notifiable 是引用 trait 的一种方式 这个这个use和命名空间的use是不相同的
    抛开 trait 来说, 在你实例化类的时候是下面这样的

    <?php
    
    use App\Models\User;
    
    ...
    
    $user = new User();

    这样的化 我use的时候是指定命名空间 new 是具体实例话那个类。
    替换成 trait来说不就是

    <?php
    use Illuminate\Notifications\Notifiable;
    
    class User 
    {
        use Notifiable;
        ...
    }

    use 在不同的地方 代表着不同的意思 .

    • 头部 use Illuminate\Notifications\Notifiable; 代表我引入的Notifiable是在 Illuminate\Notifications这个命名空间下的类。
    • 类里面use Notifiable; 代表我引入Notifiable这个trait
    • 匿名函数function()user($user){}代表我引用外部的变量到函数内。
  • 深圳某互联网公司刚毕业程序员猝死,大家怎么看? at 7个月前

    那时候他们还太年轻,不知道什么最重要。

  • cache 和 session 如何区分使用场景? at 7个月前

    @Soldoros 是的,所以session方便

  • cache 和 session 如何区分使用场景? at 7个月前

    @Soldoros 放到session是因为错误信息只是针对于当前用户的当前操作,你考虑下,如果我不放到session里面的话,我能放到哪里呢?

  • 路由名称前缀:/admin.users 无法访问? at 7个月前

    这个不应该是访问 /users 路径吗? name 只是给 这个路径起了个名字,在控制器内跳转到时候指定name 就可以跳转到路由

  • cache 和 session 如何区分使用场景? at 7个月前

    session一般来说和用户认证有关的,保存登录用户的凭据,比如把登录后的用户信息放到session

    cache 是缓存,缓存一些数据,比如不需要频繁查询数据库的数据,等,这两个完全是不同的概念,为什么会混在一起呢?

    最简单的理解就是session储存和登录用户有关的数据,cache储存和程序有关的数据

  • 真不敢相信要面对这种上古世纪的代码风格 at 8个月前

    @wallboy 微擎是一个众包产品,所以,你懂我的意思吧

  • 「PSR 规范」PSR-2 编码风格规范 at 9个月前

    @phpcoder :disappointed: 这样啊 ,看来是我想复杂了

  • Laravel Lumen 5.5 和 5.6 中文文档翻译完成 at 9个月前

    好的
    @Summer

  • Laravel Lumen 5.5 和 5.6 中文文档翻译完成 at 9个月前

    Lumen 的文档终于更新了,我还以为被放弃了,非常感谢参与的译者, 文档大体走了一边,发现了一个问题,就是说 引用连接地址 有问题,例如 https://learnku.com/docs/laravel/cache 这个连接, 这个连接明显是有问题的可以访问下 看看效果,实际地址应该是 https://learnku.com/docs/laravel/5.6/cache , 我在文档中 发现了好多地址全是这种的,这个应该是bug 所以 @Summer

  • 为什么文末的 Route facade and Route 实例两链接打开都是空白页面的? at 10个月前

    对照laravel官网的地址 发现 其实真正的地址是 https://laravel.com/api/5.6/Illuminate/Routing/Router.html
    但是文章中地址是 https://laravel.com/api/laravel/5.6/Illuminate/Routing/Router.html
    仔细看 会发现多了 laravel 那么这个laravel 是哪里来的呢? 点击纠正,不难发现 laravel/5.6 是 {{version}} ,我猜测因为文档过多,所以version 代表着当前文档的版本, 所以其实当前版本是5.6 应该为5.6 而不是laravel/5.6,估计是开始时没考虑到外链版本对应的问题吧,这个应该是网站bug ,所以@Summer

  • 说说这个网站的教程! at 10个月前

    「我怕把电脑改坏了还得重新装系统」这句话不像是开发者说的

  • 通过 Swoole 加速 Laravel at 11个月前

    @lmaster larvael 写错了 laravel

  • 遇到 MySQL 8.0.11 的一些坑 at 11个月前

    厉害啊,老哥,我也全遇到了,

  • 「PSR 规范」PSR-2 编码风格规范 at 11个月前

    每条 use 声明语句 必须 只有一个 use 关键词。

    这句话 是什么意思呢?

  • Laravel 教程系列第四套《Laravel 教程实战高级 - 微信小程序从零到发布》 at 11个月前

    我买还不行吗

  • 谈谈杭州 PHP ? 感觉人不多呀!!! at 1年前

    老油子