インデックスを作る流れ
全体の流れ
code:_
1. 正規化(Normalization)
検索精度を揃えるための前処理。
Unicode正規化(NFKC等):全角半角・合成文字の統一
大文字小文字の統一(lowercase)
記号・空白の処理
2. トークン分割(Tokenization)
テキストを検索単位に分割する。手法は言語特性で変わる。
空白区切り:英語など分かち書き言語
N-gram:機械的にN文字ずつ切る(日本語の bi-gram が典型)。再現率高いがインデックスが肥大
形態素解析:MeCab/Kuromoji等で意味のある単位に分割。精度高いが辞書依存・未知語に弱い
両者の併用:MySQLの ngram + 形態素、PGroongaなど
3. トークン正規化(Token Filter)
ステミング(running → run)
ストップワード除去(the, a, は, が など)
同義語展開
全文検索の中核データ構造。
code:_
各トークンから「どの文書のどの位置に出現するか」へのマップ。位置情報を持つとフレーズ検索("黒い猫" のような連続一致)が可能。
5. 格納・更新戦略
同期更新:INSERT/UPDATE時にインデックスも即時更新(書き込み遅延)
非同期更新:キューに積んでバッチで更新(検索結果に少し遅延)
マージ戦略:Lucene系は小さなセグメントを作って後で統合(書き込み高速)