接http://www.cnblogs.com/twelfthing/articles/1905310.html

4. 性能

    官网上说到xapian的性能,用到了very well 。The short answer is “very well” – a previous version of the software powered BrightStation’s Webtop search engine, which offered a search over around 500 million web pages (around 1.5 terabytes of database files). Searches took less than a second。

    具体的我这么多的数据进行测试,但是我现有的有200w篇文章,大约4.5G中文内容里,搜索任意关键字,都能在0.1s内完成(这里当然不能包括排序),机器配置双核 T7200,2GHz,内存3G。

5. 排序

    xapian里提供了多种排序的方法,简单的说几个, 

    set_sort_by_value     value值是在上篇文章里的value表里的值。具体的设置是document.add_value(1,value),value值尽量简短,有利于提高排寻的性能。

    set_sort_by_relevance  按相关度排序,默认是相关度的算法是BM25,

    set_sort_by_value_then_relevance,set_sort_by_relvance_then_value,set_sort_by_key ,set_sort_by_key_then_relevance都是以上两个的扩展。

    另外还有set_docid_order也算是一种排序的方式了(每个document在添加到database里的时候都会自动产生一个document id)

    排序应该来说是用xapain搭建搜索引擎种性能消耗最大的部分。首先set_docid_order,这种排序方式,在对相同的内容排序的第一次,很慢,而在接下来就很快。其实我一直不同明白这是什么情况。大约的可能和操作系统的缓存有关系,xapian本身是不存在缓存的,我想,在第一次将database读到内存种后,第二次,就是直接从内存里取的。为了这个问题,我还特意在xapian的邮件列表了问了一下这个问题,得到的答案和我想的一样。但是对此我依然保留怀疑的态度。总之就是不解。

   set_sort_by_value,我的value里存放的日期,就是按照日期排序,消耗时间大约是不排序的10倍。  

 

6. set_collapse_key

    enquire.set_collapse_key(valueid),这个设置是对于相同的value值,只取一个。例如基于文本的排重就可以用这个来做

 

import xapian
import hashlib
for text in all_text:
document
= xapian.Document()
md5
= hashlib.new('md5',text).hexdigest()
document.add_value(
1,md5)

在查询的时候enquire.set_collapse_key(1)后,得到的mset就不会包含重复的md5.

 

7.get_matches_estimated

查询结果需要做分页,于是get_matches_estimated就起到作用了,看名字就知道这个一个估计值,http://trac.xapian.org/wiki/FAQ/MoreAccurateEstimates讲的很清楚,想要得到精确的值,get_mset(offset,limit,checkatleast),设置checkatleast为大于实际值就行。

说白了,get_matches_estimated就是像google,baidu一样,就个大约值,google上虽然说结果大约1亿条,其实到了上万条记录后面就几乎没有了。 

 

8.xapian-compact

是xapian的tools里的一个脚本,帮助压缩,合并索引文件的。压缩的效果很明显,postion这张表压缩将近50%,term大约45%,这样极大的压缩索引文件大小,同时提升查询的效率。