搜索引擎如何合并倒排索引的结果?

时间:2010-03-06 19:15:19

标签: algorithm web-services merge inverted-index

搜索引擎如何合并倒排索引的结果?

例如,如果我搜索单词“dog”和“bat”的倒排索引,那么每个文档中都会有两个巨大的列表,其中包含两个单词中的一个。

我怀疑搜索引擎是否会遍历这些列表,一次一个文档,并尝试查找与列表结果匹配的内容。在算法上做了什么来使这个合并过程快速发展?

2 个答案:

答案 0 :(得分:8)

实际上搜索引擎合并这些文档列表。它们通过使用其他技术获得了良好的性能,其中最重要的是修剪:例如,对于每个单词,文档按照减少的pagerank的顺序存储,并获得有可能进入前10个的结果(这将是向用户显示)你可以遍历一小部分狗和蝙蝠名单,比如第一千。 (当然,还有缓存,但这与查询执行算法无关)

此外,毕竟, 没有关于狗和蝙蝠的许多文件:即使它是数百万,它也会变成分秒,并且实施得很好。


P.S。我在我们国家领先的搜索引擎工作,但不是我们的旗舰搜索产品的引擎,但我与它的开发人员交谈,并惊讶地知道查询执行算法实际上相当愚蠢:事实证明,人们可能会压缩巨大的计算量到可接受的时间范围内。当然,这一切都非常优化,但没有魔法,没有奇迹。

答案 1 :(得分:6)

由于反向索引按docId排序,因此可以非常快速地合并。 [如果其中一个单词从docId 23开始,第二个单词在docId 100001开始,你也可以立即快进到第一个列表中的docId 100001或更高版本。 ]

由于典型的文档交叉点几乎是几百万,因此可以非常快速地对排名进行排序。我搜索了“狗猫”[非常常见的2个单词],只返回了5400万次点击。

使用单线程代码在我的Mac上对10毫秒随机整数进行排序只需2.3秒[100万花了206毫秒!]因为我们通常只需要选择前10个甚至不需要完整排序。

如果有人想尝试排序的速度并且懒得编写代码,那么这是代码!

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);
 }

}