端くれプログラマの備忘録 Laravel [Laravel] FULLTEXTインデックスを使った全文検索

[Laravel] FULLTEXTインデックスを使った全文検索

LaravelでFULLTEXTインデックスを使った検索を行うためのメモ。ざっくり。

マイグレーション

テーブルに検索対象ワードを格納するフィールド(keywords)を定義して、FULLTEXTインデックスを振る。

class CreateArticlesTable extends Migration
{
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            ....
            $table->string('keywords'); //検索対象ワードを格納するフィールド
            $table->timestamp('published_at');
        }
        DB::statement('ALTER TABLE articles ADD FULLTEXT(`keywords`)'); //FULLTEXTインデックスを振る
    }
    ....
}

検索対象ワードのセット

記事登録時にタイトルや本文をNgram/形態素解析するなどして、keywordsフィールドに検索対象となるワードを格納する。何をセットするかで検索の精度が変わってくるだろうから工夫する。

全文検索

whereRawで全文検索のためのクエリーを記述する。

$keywords = 'mysql mariadb database sql';
$articles = Article::whereRaw("match(`keywords`) against (? with query expansion)", [$keywords])
    ->latest('published_at')
    ->published()
    ->take(10)
    ->get();

参考サイト

FULLTEXT Indexes at migrations
https://laracasts.com/discuss/channels/general-discussion/fulltext-indexes-at-migrations

How to do a full text search in laravel 5
https://laracasts.com/discuss/channels/laravel/how-to-do-a-full-text-search-in-laravel-5?page=1