データベース 2023-04-30

MySQLで全文検索

MySQLで全文検索

Read in: en
MySQLで全文検索

概要

MySQLにはだいぶ前から全文検索が使えるになっているが、最近まで全然触ってもいなかったので軽く素振りしてみた。

# MySQLで全文検索を始める MySQLで全文検索を利用するのはElasticSearchよりも圧倒的に手間が掛からない。

検索対象としたいカラムにFULLTEXT INDEXを付与、MATCH (col1,col2,...) AGAINST (expr [search_modifier]) で検索クエリを投げるだけで全文検索がお手軽にできてしまう。

ex.

// FULLTEXT INDEX付与対象のカラムを持つテーブル
CREATE TABLE `posts` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `title` varchar(255) DEFAULT NULL,
  `body` longtext DEFAULT NULL,
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

// FULLTEXT INDEXを付与
ALTER TABLE posts ADD FULLTEXT INDEX index_title_md_body (title, md_body) WITH PARSER ngram;

// MATCH ... AGINSTで検索クエリ
SELECT
  *
FROM
  posts
WHERE MATCH (title, body)
AGAINST ("MySQLで全文検索" IN BOOLEAN MODE)

FULLTEXT INDEXはALTER TABLE以外にもCREATE TABLEやCREATE INDEXで付与することもできる。

全文パーサー

MySQLの全文検索のパーサーにはngramとMeCabに対応している。

デフォルトではngramが設定される。

MeCabを使いたい場合はプラグインの導入が必要。

全文検索のモード

3つのモードがあり、使いたいモードを指定することができる。

モードによって検索結果に差が出るので、どういう検索体験にしたいかによって選択の余地がある。

検索の精度調整

パーサーや全文検索のモード以外の検索の性質を調整するアプローチとしては、

などある模様。

MySQL の全文検索の微調整も参照。

所感

このブログにもMySQLの全文検索機能を取り入れてみた。

検索記事一覧

LIKE検索より性能が良いと思われるが、実際どこまでパフォーマンスが維持できるかは環境ごとに性能検証が必要と思われるが、要件が満たせるのであれば十分に使える機能だということが分かった。

Tags: MySQL
Share: 𝕏 Post Facebook Hatena
✏️ View source / Discuss on GitHub
☕ サポート

このブログを応援していただける方は、以下からサポートをお願いします。いただいたサポートはブログ運営・技術研鑽に活用します。


関連記事