Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説
2022.02.25
Laravel + MySQLで全文検索を実装する
バックエンドエンジニアの赤岸です
先日全文検索機能を初めて実装したのですが、参考にしたネットに転がっている記事がよくわからない初心者に優しくないと感じました。
ですので当ブログは初心者でも簡単に!あっという間に!実装出来る方法を解説します
環境
Laravel8.x
MySql
Docker
ドキュメントの罠!機能不全な書き方
初心者の鑑なので、ドキュメントで全文検索の書き方を調べると
以下のように解説されていました。
$table->fulltext(‘body’); | フルテキストのインデックスを追加(MySQL/PostgreSQL)
https://readouble.com/laravel/8.x/ja/migrations.html
めっちゃ簡単じゃんチョロ〜と思ったんですが、
上記の書き方だと「部分一致でレコードが取得できない」という問題に直面します。ガッデム!!!
部分一致でレコードを取得するためには、ngram parserやmecabを使う必要があります。
更にデフォルトだと3文字以上の単語で検索する仕様になってます。日本語だと不便。
あらゆる熟語に対応できるよう、2文字以上の単語で検索出来るように設定変更してあげる必要もあります。
次の節で詳しく書きます
完成版|2文字以上の単語で部分一致させる書き方
2文字以上で検索する設定
Dockerを使っているので、MySQLの設定ファイル(xxx.cnf)に以下を記載します
[mysqld]
innodb_ft_min_token_size = 2
マイグレーションでngram parserを使う
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatexxxTable extends Migration
{
public function up()
{
Schema::create('xxx', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('hogehoge');
$table->timestamps();
});
\DB::statement('ALTER TABLE テーブル名 ADD FULLTEXT INDEX インデックス名 (`該当カラム名`) with parser ngram');
}
public function down()
{
Schema::dropIfExists('xxx');
}
}
以上です。
これであなたも素敵な全文検索マスター
それではまた合う日まで
ごきげんようウフフフフ〜