【Laravel】whereFullText メソッドの全文検索で IN BOOLEAN MODE を使う

 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 MODEIN BOOLEAN MODEはよく使い分けます。

 Laravel でこの全文検索クエリをクエリビルダで使えます。そこそこ前まではwhereRawを使う必要がありましたが、今はwhereFullIndexが使えます。これは次の様に書けます。

$users = DB::table('users')
           ->whereFullText('bio', 'web developer')
           ->get();

データベース:クエリビルダ 9.x Laravel

 書くことを迷わなくて済むのですが、これは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

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG