【ぜんぶんけんさく】

全文検索 とは?

💡 大量のテキストから「キーワードで素早く見つけ出す」検索技術
📌 このページのポイント
全文検索:転置インデックスで高速検索 検索クエリ 「Python」 転置インデックス 単語 文書ID Python → D1, D3, D5 Java → D2, D4 機械学習 → D1, D5 Web → D2, D3 データ → D1, D3, D4 D1: Python入門 D3: Python Web D5: Python ML 事前に「どの単語がどの文書にあるか」を索引化しておく → 全文書を毎回読まなくても一瞬でヒットする
全文検索と転置インデックスの仕組み
ひよこ ひよこ

LIKE '%キーワード%'じゃだめなの?

ペンギン先生 ペンギン先生

小さいデータなら問題ないけど、数百万件のテキストだと非常に遅い。LIKEの前方不一致(%が先頭につく)はインデックスが使えず、全行を1文字ずつスキャンするから。全文検索は「転置インデックス」を事前に構築して、キーワードからドキュメントを逆引きできるから圧倒的に速い。

ひよこ ひよこ
ペンギン先生 ペンギン先生

普通のインデックスは「文書→単語」の対応だけど、転置インデックスは「単語→その単語を含む文書の一覧」を記録する。辞書の索引みたいなもの。「データベース」という単語を検索すると、その単語を含む文書IDのリストが即座にわかる仕組み。

ひよこ ひよこ

日本語の全文検索って難しいの?

ペンギン先生 ペンギン先生

英語はスペースで単語が区切られるけど、日本語は「東京都庁に行く」のように単語がくっついている。だから「形態素解析」で「東京/都庁/に/行く」と分割するか、「N-gram」で「東京/京都/都庁/庁に...」と固定長で分割してインデックスを作る必要がある。

ひよこ ひよこ

Elasticsearchってデータベースの全文検索とは違うもの?

ペンギン先生 ペンギン先生

MySQLPostgreSQLにも全文検索機能はあるけど、Elasticsearchは全文検索に特化した専用エンジン。スコアリング、ファセット検索、曖昧検索、シノニム(同義語)対応など、検索周りの機能が段違いに豊富。ただしElasticsearchを導入すると「メインDBとElasticsearchのデータ同期」という新たな課題が生まれる。リアルタイムで同期するかバッチで同期するか、同期が遅延した場合に検索結果と実データが不整合になる問題をどう許容するかなど、運用面の設計がかなり難しいんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
全文検索って出てきたら「転置インデックスで大量テキストからキーワードを高速に探す仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Full-Text Search」 = 全文(Full-Text)検索(Search)
💬 テキスト全体を対象にする検索という意味。部分一致(LIKE)よりはるかに高速で高機能
← 用語集にもどる