17


7

検索エンジンは、転置インデックスからの結果をどのようにマージしますか?

検索エンジンは、転置インデックスからの結果をどのようにマージしますか?

たとえば、「dog」と「bat」という単語の逆インデックスを検索した場合、2つの単語のいずれかを含むすべてのドキュメントの2つの巨大なリストがあります。

検索エンジンがこれらのリストを一度に1つずつ調べ、リストの結果と一致するものを見つけようとするのは疑わしい。 このマージプロセスを高速化するために、アルゴリズム的に何が行われますか?

2 Answer


8


実際、検索エンジンはこれらのドキュメントリストを_do_マージします。 他の手法を使用することで優れたパフォーマンスが得られます。最も重要なのは枝刈りです。たとえば、ドキュメントはページランクの低い順に保存され、最初の10に入る可能性のある結果を取得します(これにより、ユーザーに表示されます)犬とコウモリのリストのかなり小さい部分、たとえば最初の1000個をたどることができます。 (そしてもちろん、キャッシュがありますが、それはクエリ実行アルゴリズムとは関係ありません)

それに、結局のところ、犬やコウモリに関するドキュメントはそれほど多くありません。たとえ数百万であっても、適切な実装では数秒になります。

'' '' '

P.S. 私は国の主要な検索エンジンで働いていましたが、私たちの主力検索製品のエンジンではありませんでしたが、その開発者と話をして、クエリ実行アルゴリズムが実際にはかなり馬鹿げていることを知って驚いていました: _huge_許容可能な時間範囲への計算量。 もちろん非常に最適化されていますが、魔法も奇跡もありません。


6


逆索引はdocIdによって順序付けられているため、非常に高速にマージできます。 [単語の1つがdocId 23で始まり、2番目がdocId 100001である場合、最初のリストでもdocId 100001以上にすぐに早送りできます。 ]

一般的なドキュメントの交差点は最大数百万であるため、非常に高速にランク付けすることができます。 私は「犬猫」[非常に一般的な2単語]を検索しましたが、5400万ヒットしか返されませんでした。

私のMacでは、シングルスレッドコードで10ミリオンのランダムな整数のソートにかかった時間はわずか2.3秒でした(100万は206ミリ秒かかりました!)。

誰かが並べ替えの速度を試して、コードを書くのが面倒すぎる場合のコードは次のとおりです!

import java.lang.*;
import java.math.*;
import java.util.*;

public class SortTest {
   public static void main(String[] args) {
   int count = Integer.parseInt(args[0]);

Random random = new Random();
int[] values = new int[count];
int[] bogusValues = new int[100000]; //screw cache
    for(int i = 0; i < values.length;++i) {
    values[i] = random.nextInt(count);
}
for(int i = 0; i < bogusValues.length;++i) {
    bogusValues[i] = random.nextInt(count);
}
long start = System.currentTimeMillis();
System.out.println(start);
        Arrays.sort(values);
System.out.println(System.currentTimeMillis());
System.out.println(System.currentTimeMillis()-start);
    Arrays.sort(bogusValues);
 }

}