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

教程 wyg27 ⋅ 于 2017-01-05 03:33:17 ⋅ 最后回复由 wyg27 2017-01-10 00:23:29 ⋅ 506 阅读

在 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 于 2周前 加精
回复数量: 4
  • nickfan 乐天知命,随遇而安~
    2017-01-05 10:16:47

    我是来歪楼的:-D

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

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

  • wyg27
    2017-01-05 23:28:55

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

  • coodeer PHPer
    2017-01-09 02:23:15

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

    https://laravel-china.org/topics/3600

  • wyg27
    2017-01-10 00:23:29

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

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter