全文検索
大量の文章から該当箇所を高速に探す仕組みです。転置インデックスの考え方、LIKE 検索との違い、専用エンジンを使う場面を解説します。
- 1.全文検索は大量の文章から、検索語を含む文書を高速に見つける技術。事前に作る転置インデックスが要。
- 2.転置インデックスは「単語 → その語を含む文書一覧」の辞書。毎回全文を読む LIKE と違い直行できる。
- 3.RDB の機能でも可能だが、本格的な検索や関連度順・あいまい一致は Elasticsearch 等の専用エンジンが得意。
全文検索とは
商品の説明文、記事、メールの本文といった 長い文章の集まり から、「この言葉を含むものはどれか」を探したい場面は多くあります。全文検索(Full-Text Search) は、こうした文章群から検索語にマッチする文書を 高速に 見つけ出す技術です。
素朴にやるなら全文書を頭から読んで照合すればよいのですが、文書が数百万件あればとても間に合いません。全文検索が速いのは、検索のたびに本文を読むのではなく、あらかじめ作っておいた 索引 を引くからです。
転置インデックスの仕組み
全文検索の心臓部が 転置インデックス(inverted index) です。これは「文書 → 含まれる単語」ではなく、逆向きの 「単語 → その単語を含む文書の一覧」 という辞書です。
たとえば 3 つの文書があったとします。
| 文書 | 本文 |
|---|---|
| doc1 | データベース 入門 |
| doc2 | 検索 エンジン 入門 |
| doc3 | データベース 設計 |
これを単語ごとにばらして整理すると、次のような転置インデックスができます。
| 単語 | 含む文書 |
|---|---|
| データベース | doc1, doc3 |
| 入門 | doc1, doc2 |
| 検索 | doc2 |
| 設計 | doc3 |
「データベース」で検索すれば、辞書を 1 回引くだけで doc1 と doc3 に 直行 できます。文書をすべて読み直す必要はありません。日本語のように単語が空白で区切られない言語では、文章を単語に分割する 形態素解析 や、機械的に N 文字ずつ区切る N-gram という前処理を挟んで、この辞書を作ります。
LIKE 検索との違い
RDB で部分一致を書くなら LIKE が思い浮かびます。
SELECT * FROM articles WHERE body LIKE '%データベース%';
これは動きますが、毎回テーブルの全行を頭から走査 して照合します。前後に % が付く中間一致は通常のインデックスも効かないため、行数が増えるほど線形に遅くなります。
| 観点 | LIKE 検索 | 全文検索(転置インデックス) |
|---|---|---|
| 事前準備 | 不要 | 索引の構築が必要 |
| 速度(大量データ) | 遅い(全件走査になりがち) | 速い(索引を引くだけ) |
| 単語の認識 | 文字列の並びとして扱う | 単語単位で扱える |
| 関連度の並べ替え | できない | スコア順に並べられる |
| あいまい一致・表記ゆれ | 苦手 | 同義語・ゆらぎ吸収が可能 |
LIKE は手軽で件数が少なければ十分ですが、文章をまともに検索するなら全文検索の仕組みが要ります。
LIKE '%data%' は database や metadata にもヒットします。文字の並びとしてしか見ていないからです。全文検索は本文を単語に分けて索引化するため、「data という語」を狙って検索でき、無関係な部分一致を拾いにくくなります。「とりあえず LIKE」で精度に困ったら、全文検索への切り替えを検討する合図です。
専用エンジンを使う場面
PostgreSQL の tsvector / tsquery や MySQL の全文索引など、RDB にも全文検索機能はあります。データ量が中規模で、検索が機能の一部に過ぎないなら、まずはこれで十分なことも多いです。
一方で、検索そのものが中心的な機能になると、Elasticsearch / OpenSearch などの専用検索エンジンが選ばれます。
- 関連度スコアリング: 一致の強さで結果を並べ替え、「より関連の高い順」に出せる。
- あいまい検索・表記ゆれ: タイプミス許容(ファジー)や同義語辞書、活用形の正規化に強い。
- ファセット・集計: カテゴリ別の件数集計など、検索結果の絞り込み UI を作りやすい。
- スケール: 大量の文書を複数ノードに分散し、検索負荷を横に広げられる。
専用エンジンを導入する際は、データの正本(マスター)は RDB に置いたまま、その内容を検索エンジンへ同期して 検索専用の写し として使う構成が一般的です。こうすると検索が落ちても本体データは無事ですし、索引の作り直しも安全に行えます。RDB と検索エンジンは置き換えではなく、役割分担で組み合わせるのが定石です。
全文検索は「全文を毎回読む」発想から「索引を引く」発想への転換です。転置インデックスという辞書さえ押さえれば、LIKE との違いも専用エンジンを足す理由も、すっきり腑に落ちるはずです。
データベース Article
全文検索を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
全文検索
比較で見る軸
難易度: intermediate / カテゴリ: データベース / タグ数: 3
導入後に効く点
転置インデックスは「単語 → その語を含む文書一覧」の辞書。毎回全文を読む LIKE と違い直行できる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- データベース
- タグ数
- 3
判断チェックリスト
- 自社の用途が「全文検索 / 転置インデックス」に近いか確認する。
- 強みである「全文検索は大量の文章から、検索語を含む文書を高速に見つける技術。事前に作る転置インデックスが要。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。