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
于 8年前 加精
我是来歪楼的:-D
doctrine的dbal还是有bug,修改包含enum的字段的表的时候会出错只能靠
DB::statement
这种非对象的方式搞定另外mysql的全文检索对中文分词的支持也是要到5.7之后了,但也仅仅是分词而已,同义词(番茄=西红柿;Nike=耐克)啥的就没法好好做检索了,
对于检索类需求想做好的话目前而言感觉还是Elasticsearch+IK中文分词 更靠谱一些。
@nickfan 感谢回复,受教了!的确,对于中文场景来说,常规的全文索引是无意义的。所幸我遇到的这个场景是全英文的,因此靠这基础的尚可应付。
关于“如何添加全文索引”的问题正好之前我也有过研究,这是我的另外一种实现思路,也整理了一篇帖子,欢迎拍砖:stuck_out_tongue_winking_eye:
分享:让 Laravel 优雅地创建 MySQL 全文索引
@coodeer 已阅读兄台的帖子,佩服兄台的动手能力,自愧不如。