全文検索

全文検索とは

全文検索は、文章そのものの中からキーワードを含む文書を高速に探し出す仕組みです。ブログの記事検索、社内文書の検索、ECサイトの商品説明の検索などが該当します。

[[SQL]] でも LIKE '%キーワード%' で似たことはできますが、この書き方は [[データベースインデックス]] が効かず全行を読むため、データが増えると急激に遅くなります。全文検索はこの弱点を、専用のインデックスで解決します。

仕組み — 転置インデックス

全文検索の中心にあるのが転置インデックス(inverted index)です。本の巻末索引と同じ発想で、「単語 → その単語が出てくる文書ID」の対応表をあらかじめ作っておきます。

単語出現する文書
データベース1, 3, 7
インデックス1, 4
ネットワーク2, 5, 7

検索時は表を引くだけで候補が分かるため、文書が増えても速度が落ちにくいのが特長です。

日本語の壁 — 単語の切り出し

英語は空白で単語が区切られますが、日本語は区切りがありません。そこで文章を単語に分ける処理が必要になります。

  • 形態素解析 — 辞書を使って「データベース / の / 設計」のように意味のある単語へ分割する。精度が高いが辞書のメンテナンスが必要
  • N-gram — 「データ」「ータベ」「タベー」のように機械的にN文字ずつ区切る。辞書不要で取りこぼしが少ないが、インデックスが大きくなり無関係な語もヒットしやすい

新語や固有名詞の多いサービスでは、両方を併用することもあります。

どこで実現するか

  • データベースの機能を使う — [[リレーショナルデータベース]] の多くが全文検索インデックスを備える。データが1か所で済み手軽
  • 専用の検索エンジンを使う — Elasticsearch や OpenSearch など。スコア調整・同義語・ファセット絞り込みなど機能が豊富で、[[NoSQL]] 系のドキュメント指向データストアとしての性格も持つ

小さく始めるならデータベースの機能、検索が製品の主役なら専用エンジン、という判断が一般的です。

初学者向けポイント

  • 全文検索の結果は「一致 / 不一致」ではなく関連度スコア順で返るのが普通。どの語を重視するかの調整が品質を左右する
  • 表記ゆれ(「サーバ」と「サーバー」)は同義語辞書やノーマライズ処理で吸収する
  • キーワードが一致しなくても意味が近い文書を探したい場合は、[[埋め込みとベクトル検索]] と組み合わせる方法がある

関連技術とのつながり

  • [[データベースインデックス]] — B木が苦手な中間一致・文章検索を全文検索が補う
  • [[SQL]] — LIKE 検索の限界を知ることが全文検索を使う出発点
  • [[リレーショナルデータベース]] — 標準機能として全文検索インデックスを持つ製品が多い
  • [[NoSQL]] — 検索エンジンはドキュメント指向のデータストアとしても使われる
  • [[埋め込みとベクトル検索]] — 語の一致ではなく意味の近さで探す補完的な手法
Q: 全文検索が使う代表的なデータ構造はどれ?
- [x] 転置インデックス(単語 → 出現文書の対応表)
- [ ] スタック
- [ ] ハッシュ化されたパスワード表
解説: 転置インデックスは単語からその語を含む文書を直接引けるため、文書が増えても検索が速いままです。

Q: SQL の LIKE '%キーワード%' の弱点として本文が挙げているのはどれ?
- [ ] 大文字と小文字を区別できない
- [x] 通常のインデックスが効かず全行を読むため遅くなる
- [ ] 半角文字しか検索できない
解説: 中間一致は B木インデックスが使えずフルスキャンになるため、データ量が増えると急激に遅くなります。

Q: 日本語の全文検索で単語を切り出す手法として本文で挙げられているのはどれ?
- [ ] 正規化と非正規化
- [x] 形態素解析とN-gram
- [ ] レプリケーションとシャーディング
解説: 日本語は空白で区切られないため、辞書を使う形態素解析か機械的に区切る N-gram で単語を切り出します。