Xapian的检索流程和大部分搜索系统都一样,就先从倒排表抽取候选文档,然后结合其他信息进行排序,取top文档作为搜索结果,具体流程如下:

  xapian倒排索引的归并流程-LMLPHP

   图1 xapian搜索流程

  具体流程

  1. 在terms中找到documents
  2. 查询这些文档对应的values,进行排序,如果候选document比较多,这个过程就会很慢。
  3. 给出top结果,一般会读取data数据。

  和别的搜索系统一样,提高搜索速度,主要靠优化第一步,较少允许量,或者缩减到下一步的候选文档数目。

  xapian倒排索引的归并中,对and的归并采用的是一般的一次一文档的方法DAAT(Document and a time)的方法,但对于OR检索则做了优化,好比query里面包含100个词,如果采用常用的每个词搜索一次,速度会很慢,因此可以采用可一种优化的方法。

  Xapian对于OR检索,同事也是并行的读取倒排列表的,但这样做的一个问题就是很难调表(jump),这时就需要将其转换为AND检索。具体方式和WAND算法的思路基本一样。

  其基本假设为: 我们只需要很少的top结果,这样,我们只需要追踪这个结果集合的最小值,然后估算每个term能够带来的权重的上界,如果这个上界<下界,则两者都需要,这样就变成了AND计算,然后将这个方法应用于整个query树,

  Xapian::Enquire 提供检索服务的类,检索服务主要在这里,Xapian的or检索执行的是Probabilistic queries。

  一个很好的xapian介绍ppt: http://www.slideshare.net/panjunyong/xapian

  一个xapian速度优化的ppt:http://www.slideshare.net/rboulton/optimising-xapian

04-14 02:09