全文検索の基本的な側面が逆索引の使用であることを理解しています。そのため、転置インデックスを使用すると、1 語のクエリに答えるのが簡単になります。インデックスが次のように構成されていると仮定します。
some-word -> [doc385, doc211, doc39977, ...] (ランク順、降順)
その単語のクエリに答えるには、インデックスで正しいエントリを見つけ (O(log n) 時間かかります)、インデックスで指定されたリストから特定の数のドキュメント (たとえば、最初の 10) を提示するだけです。
しかし、たとえば 2 つの単語に一致するドキュメントを返すクエリについてはどうでしょうか。最も簡単な実装は次のとおりです。
- A を単語 1 を持つドキュメントのセットに設定します (インデックスを検索することにより)。
- B を単語 2 (同上) を持つドキュメントのセットに設定します。
- A と B の交点を計算します。
さて、ステップ 3 の実行にはおそらく O(n log n) の時間がかかります。非常に大きな A と B の場合、クエリの応答が遅くなる可能性があります。しかし、Google のような検索エンジンは、常に数ミリ秒で回答を返します。したがって、それは完全な答えではありません。
明らかな最適化の 1 つは、Google のような検索エンジンは一致するすべてのドキュメントを返すわけではないため、交差全体を計算する必要がないことです。最小のセット (例: B) から始めて、他のセット (例: A) にも属する十分なエントリを見つけることができます。
しかし、次の最悪のケースはまだあり得ませんか? A を一般的な単語に一致するドキュメントのセットに設定し、B を別の一般的な単語に一致するドキュメントのセットに設定した場合でも、A ∩ B が非常に小さい (つまり、組み合わせがまれである) 場合があります。つまり、検索エンジンは B のすべての要素 x メンバーを直線的に調べ、それらが A の要素でもあるかどうかをチェックして、両方の条件に一致する少数を見つける必要があります。
線形は速くありません。また、検索する単語が 3 つ以上ある場合もあるため、並列処理を採用するだけでは完全な解決策にはなりません。では、これらのケースはどのように最適化されるのでしょうか? 大規模な全文検索エンジンはある種の複合インデックスを使用しますか? ブルームフィルター?何か案は?