Laravel 5.3 下通过 migrate 添加 “全文索引” 的方法

在 Laravel 5.3 的官方文档中,并未提及如何在创建 migrate 时给一个字段添加“全文索引”,其实方法也不难,只需照此办理:

首先,在 migrate 中指定数据表的引擎为“MyISAM”,因为在 MySql 5.6 以前是无法在 InnoDB 下将一个数据表的字段设置为全文索引的。具体语句为:

$table->engine = 'MyISAM';

之后,为字段添加全文索引的语句比较特殊,Laravel 没有直接提供,需要我们执行一段自定义的 SQL 语句:

DB::statement('ALTER TABLE `table` ADD FULLTEXT(`content`)');

这样就可以了。以下是一个 migrate 的节选:

    public function up()
    {
        Schema::create('example', function (Blueprint $table) {
            $table->engine = 'MyISAM';

            $table->increments('id');
            $table->string('ml_num', 20);
            $table->longText('ad_text')->nullable()->comment('简介');
            ...
        });

        Schema::table('mlsdatas', function ($table) {
            $table->unique('ml_num');
            $table->index('area');
            ...
        });

        DB::statement('ALTER TABLE `example` ADD FULLTEXT(`content`)');
    }

希望对大家有用。

本帖已被设为精华帖!
本帖由 Summer 于 7年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4
nickfan

我是来歪楼的:-D

doctrine的dbal还是有bug,修改包含enum的字段的表的时候会出错只能靠DB::statement 这种非对象的方式搞定

另外mysql的全文检索对中文分词的支持也是要到5.7之后了,但也仅仅是分词而已,同义词(番茄=西红柿;Nike=耐克)啥的就没法好好做检索了,
对于检索类需求想做好的话目前而言感觉还是Elasticsearch+IK中文分词 更靠谱一些。

7年前 评论

@nickfan 感谢回复,受教了!的确,对于中文场景来说,常规的全文索引是无意义的。所幸我遇到的这个场景是全英文的,因此靠这基础的尚可应付。

7年前 评论

关于“如何添加全文索引”的问题正好之前我也有过研究,这是我的另外一种实现思路,也整理了一篇帖子,欢迎拍砖:stuck_out_tongue_winking_eye:

分享:让 Laravel 优雅地创建 MySQL 全文索引

7年前 评论

@coodeer 已阅读兄台的帖子,佩服兄台的动手能力,自愧不如。

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!