こんにちは!データベースの世界へようこそ。
今日は、PostgreSQLを使っている人なら一度は憧れる(そして、ちょっとだけ難しそうに感じる)「全文検索」の魔法について、お話ししようと思います。
「検索機能」って、普段何気なく使っていますよね。でも、いざ自分でシステムを作ろうとすると、「あれ?どうやって数万件ものデータから、目的のキーワードを爆速で見つければいいんだろう?」と悩んだことはありませんか?
そんな時、PostgreSQLがそっと差し出してくれる秘密兵器が、`tsvector`(ティーエス・ベクトル)という型なんです。
—
そもそも、普通の「検索」じゃダメなの?
例えば、皆さんのスマホの中にある「メモ帳」を想像してみてください。
メモが10個くらいなら、上から順番に読んでいけばいいですよね。でも、もしそのメモが「100万個」あったらどうでしょう? 全て読み終わる前に日が暮れてしまいますよね。
データベースも同じです。普通の検索(`LIKE ‘%キーワード%’`のようなもの)は、例えるなら「100万枚のメモを一枚ずつ、端から端までじっくり読み直す作業」なんです。これじゃあ、どれだけ高性能なサーバーを使っても限界があります。
そこで登場!「tsvector」という名の魔法の索引
ここで登場するのが`tsvector`です。これは、テキストを「検索しやすいように、あらかじめバラバラに分解して並べ替えたもの」だと思ってください。
料理で例えるなら、「食材を洗って、切って、小分けにして、ラベルを貼って冷蔵庫に整頓しておく」ようなイメージです。
tsvectorがやってくれること
1. 正規化(お掃除):大文字・小文字を揃えたり、不要な単語(「あ」や「の」みたいな意味のない言葉)を捨てたりします。
2. トークン化(バラバラにする):文章を単語単位に切り分けます。
3. 位置情報の記録:どの単語が、文章のどこにあったかを記録します。
これをしておくと、検索するときにはもう「メモを読み直す」必要はありません。「冷蔵庫のラベル」を見るだけで、一瞬で「あ、この食材(キーワード)はここにあるよ!」と教えてくれるんです。
—
実際にどう使うの?
難しいコードを書く前に、雰囲気だけ掴んでみましょう。
PostgreSQLには `to_tsvector` という関数があります。これを使うと、ただの文章が「検索用の魔法の形式」に早変わりします。
— 「PostgreSQLは最高のデータベースです」という文章を魔法の形にする
SELECT to_tsvector(‘PostgreSQLは最高のデータベースです’);
これだけで、PostgreSQLは「PostgreSQL」「最高」「データベース」といった単語を抽出し、検索しやすいリストを作ってくれます。あとは、このリストに対してインデックス(目次のようなもの)を貼っておくだけ。これだけで、数百万件のデータからでもコンマ数秒で検索結果が返ってくるようになります。
—
初心者の皆さんへ伝えたいこと
最初は「ベクトル」なんて聞くと、数学の授業みたいで身構えてしまいますよね。でも、要は「探す手間を、先に済ませておく」という工夫にすぎません。
- まずは「普通の検索」で不便さを実感してみる
- 次に「tsvector」という整理整頓術を知る
この順番で経験すると、「なるほど、こうやってデータベースは賢くなっているんだ!」という感動を味わえるはずです。
もし今、皆さんの作っているアプリケーションの検索が少し重いなと感じたら、ぜひこの「tsvector」という扉を叩いてみてください。最初は少し不思議な形に見えるかもしれませんが、一度使いこなせれば、これほど頼もしい相棒はいませんよ。
それでは、また次回のブログでお会いしましょう。楽しいデータベースライフを!
コメント