【入門編】 pg_trgm拡張によるトリグラムインデックス – PostgreSQL

こんにちは!データベースの世界へようこそ。

普段、私たちが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);

たったこれだけで、あなたのデータベースは「あいまいな問いかけ」にも柔軟に答えられる、頼れる相棒に進化します。

—

最後に:使いすぎには注意!

ここまで良いことづくめのように話しましたが、一つだけ気をつけてほしいことがあります。

トリグラムインデックスは、言葉を細かく刻んで保存するため、普通のインデックスよりも少しだけ場所(ディスク容量)を取ります。 何でもかんでも設定するのではなく、「ここ、あいまい検索をよく使うな」という場所にピンポイントで貼ってあげるのが、エンジニアとしての粋な使い方ですよ。

「検索が遅いな……」と悩んだときは、ぜひこのトリグラムを思い出してみてください。きっと、あなたのアプリを劇的に快適にしてくれるはずです。

それでは、また次回の記事でお会いしましょう!ハッピー・コーディング!

コメント

タイトルとURLをコピーしました