Laravel は PHP のフレームワークでデータベースである MySQL とやりとりする機能が含まれています。この機能の中には MySQL の全文検索クエリを構築する機能もあります。 Laravel 8.79 で追加されました。この機能のリファレンスにモードの切り替え方がなかったので、設定方法を紹介します。
MySQL の全文検索には n-gram インデックスというものがあり、これを使うことで全文検索ができます。このあたりは他をググるなりすると見つかります。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.10 全文検索関数
全文検索クエリですが、次の様になります。
# 構文 SELECT * FROM examples WHERE MATCH (col1,col2,...) AGAINST (expr [search_modifier]) # search_modifier: # { # IN NATURAL LANGUAGE MODE # | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION # | IN BOOLEAN MODE # | WITH QUERY EXPANSION # } # 例. SELECT * FROM x_ken_all WHERE MATCH(pref_kanji, city_kanji, area_kanji) AGAINST('静岡県浜松中区' IN NATURAL LANGUAGE MODE);
search_modifier によって実行する検索の内容を変えられます。それぞれ自然言語検索、前回の検索結果の関連も含める検索、単語の一致不一致を見る検索、前回の検索結果を元にした検索です。これらの内、IN NATURAL LANGUAGE MODE
とIN BOOLEAN MODE
はよく使い分けます。
Laravel でこの全文検索クエリをクエリビルダで使えます。そこそこ前まではwhereRaw
を使う必要がありましたが、今はwhereFullIndex
が使えます。これは次の様に書けます。
$users = DB::table('users') ->whereFullText('bio', 'web developer') ->get();
書くことを迷わなくて済むのですが、これはIN NATURAL LANGUAGE MODE
に固定された状態です。先述の検索方法の切り替えは次の様に行えます。
$res = XKenAll::query() ->whereFullText('address_kanji', $str, [ 'mode' => 'boolean', // ここで mode => boolean とすると IN BOOLEAN MODE です 'expanded' => true // ここで expanded => true とすると WITH QUERY EXPANSION が付け足されます ])->get();
知ればまた思い出しやすい形ですが、ソースコードのコメントにもない連想配列ですのでなかなか気づきにくいです。次リンクはこのメソッドが増えた時の資料で、より詳しいです。
Laravel 8.79 Released | Laravel News
[8.x] Implement Full-Text Search for MySQL & PostgreSQL by driesvints · Pull Request #40129 · laravel/framework