巨大索引文件取交集和合并的难题,请高手指点

在编写AKCMS自带的站内搜索时遇到两个技术难题,想来想去都想不到好办法:

难题1

有两个热词的索引,比如:“电影”和“免费”这两个词,均非常大,各有数十万搜索结果。索引的内容是每条3字节二进制数据,是文章的ID,排序是按照关键词出现次数排序的。

现在假设用户搜索“免费 电影”,这就需要把两个索引求交集。求数组的交集我们知道PHP有自带的函数array_intersect。但难点是两个索引都非常大,无法以数组的形式载入内存。

难题2

同样两个热词的索引,求合集,相当于PHP中的array_merge。感觉上求合集比求交集简单一点点,但是也没有找到效率很高的算法。

已经想到的方法效率都不太高,比较靠谱的一个是:

先给索引A、B按照文章ID根据内存大小分组排序,然后归并数据,生成2个和原索引一样大小,按照文章ID排序的临时索引。有了这2个临时索引,问题稍微容易一些,打开两个文件,依次的读,比较,有一样的扔到一个结果文件中去。

这个算法时间复杂度挺高的,尤其是分组排序那一块,但是又想不到更好的办法。在具体的应用场景中,当用户真的搜索“免费 电影”这个词的时候,临时排序的话,估计会很慢;提前把关键词的排列组合排序的话,海量存储的代价更昂贵。两难,请高人指点一二。

 评论
  可以考虑到搜索引擎的算法机制上…… 例如:读取所有数据中的title函数,然后自定义一个规则,title中,被搜索关键词出现一次,排序第一,或者自定义为,title中鱼content中均出现被被搜索关键词,排序第一……

  去问下张宴 看看他有什么好办法
 发表评论
姓   名: