こんにちは!データベースの世界へようこそ。
普段、私たちがWebアプリを使っているとき、検索窓にキーワードを入れると一瞬で結果が表示されますよね。あれって実は、裏側でデータベースがものすごいスピードで「辞書引き」をしてくれているおかげなんです。
でも、ちょっと困ったことが起きる時があります。それは「あいまい検索」です。
たとえば、「『PostgreSQL』という単語を検索したいけれど、『Postgres』だけで検索したい」とか、「『データベースエンジニア』という言葉が含まれる記事を探したい」といったケース。
普通のインデックスだと、実はこういう検索ってすごく苦手なんです。今日は、そんな「かゆいところに手が届かない!」を解決してくれる、PostgreSQLの隠れたヒーロー「pg_trgm(トリグラム)」について、お話ししますね。
—
インデックスは「本の巻末の索引」
まずはイメージしてみましょう。データベースのインデックスは、辞書や教科書の巻末にある「索引」と同じです。
- 「あ」から始まる言葉がどこにあるか
- 「データベース」という言葉は○ページにあるか
索引があれば、本を最初から最後まで1ページずつめくる必要はありませんよね。これがインデックスの仕組みです。
でも、もしあなたが「『ーベース』で終わる言葉全部教えて!」と言われたらどうでしょう? 索引は「言葉の頭文字」で並んでいるので、後ろの方だけを調べるのは、結局すべてのページをめくるくらい大変な作業になってしまいます。
トリグラム:言葉を「3文字ずつの断片」に切り分ける
ここで登場するのが、pg_trgm(トリグラム)という拡張機能です。
「トリグラム(trigram)」とは、言葉を「3文字ずつの塊」に分解するテクニックのこと。たとえば、「apple」という単語だったら、こんなふうに切り分けます。
1. ` a` (空白+a+p)
2. ` ap` (空白+a+p)…おっと、実際は ` a`, ` ap`, `app`, `ppl`, `pl ` といった具合に、文字を重ねながら3文字ずつにスライスしていきます。
こうやって分解しておくと、データベースは「『ppl』という欠片を持っているデータはこれとこれだ!」と、言葉の途中や終わりからでも一瞬で探し出せるようになるんです。
なぜこれが凄いの?
これを使えるようになると、今まで「重い……」と諦めていた検索が劇的に変わります。
- LIKE検索の高速化: `WHERE name LIKE ‘%postgres%’` のような、前方にワイルドカード(%)を置く検索も爆速になります。
- タイポ(打ち間違い)の許容: 「Postgresql」と「Postgresql」の間で、どれくらい似ているかを計算できます。「あ、これ打ち間違えてるけど、たぶんこれのことだな?」という検索も実現できちゃうわけです。
さっそく使ってみよう!
PostgreSQLでこれを使うのはとっても簡単です。黒い画面(SQLコンソール)で、おまじないを唱えるだけ。
— これでトリグラムの機能が使えるようになります!
CREATE EXTENSION pg_trgm;
— あとはテーブルにインデックスを貼るだけ
CREATE INDEX idx_name_trgm ON your_table USING gin (name gin_trgm_ops);
たったこれだけで、あなたのデータベースは「あいまいな問いかけ」にも柔軟に答えられる、頼れる相棒に進化します。
—
最後に:使いすぎには注意!
ここまで良いことづくめのように話しましたが、一つだけ気をつけてほしいことがあります。
トリグラムインデックスは、言葉を細かく刻んで保存するため、普通のインデックスよりも少しだけ場所(ディスク容量)を取ります。 何でもかんでも設定するのではなく、「ここ、あいまい検索をよく使うな」という場所にピンポイントで貼ってあげるのが、エンジニアとしての粋な使い方ですよ。
「検索が遅いな……」と悩んだときは、ぜひこのトリグラムを思い出してみてください。きっと、あなたのアプリを劇的に快適にしてくれるはずです。
それでは、また次回の記事でお会いしましょう!ハッピー・コーディング!
コメント