Xapian 和 Sphinx都是非常棒的开源全文搜索解决方案,但是我想知道哪个性能更好一些,Xapian官方提供了与Solr的对比,但是没有和Sphinx的,所以我决定自己来测试。
这两个都是开源的解决方案,你可以使用他们来搜索任何关键字比如马,桃子或者是Getminted等等,也可以使用通配符进行更广范围的查询。
数据集
要测试首先需要准备好数据集,我的数据是大约12000条blog记录,每个记录有两个字段需要搜索:title, description,代码如下:
class Blog < ActiveRecord::Base
# Thinking sphinx indexes
define_index do
indexes :title
indexes :description
end
# Acts_as_xapian indexes
acts_as_xapian :texts => [ :title, :description ]
...
end
测试环境
下面是我的测试环境:
- Sphinx: 0.9.8
- Xapian: 1.0.1
- Sphinx plugin: thinking_sphinx
- Xapian plugin: acts_as_xapian
- Ruby: 1.8.6 p114
- Rails: 2.1.0
- Mysql: 5.0.51
- OS: OS X 10.5.6
- CPU: Intel Core 2 Duo 2.0G
- Ram: 4G
索引
我们首先来看看索引的性能:
$ time rake xapian:rebuild_index models="Blog"
real 2m12.942s
user 0m24.569s
sys 0m12.798s
$ time rake thinking_sphinx:index
real 1m53.543s
user 0m4.725s
sys 0m0.887s
结果显示Sphinx稍微快一点,但是因为Sphinx有索引进度提示,所以感觉上Sphinx快了好多。
查询
下面来看查询性能
keywords = ['key1', 'key2', ..., 'key30']
Benchmark.bm do |x|
x.report("Xapian") { 30.times {|i| ActsAsXapian::Search.new "Blog", keywords[i], :limit => 10 } }
x.report("Sphinx") { 30.times {|i| Blog.search keywords[i], :per_page => 10, :page => 1 }}
end
这里我首先定义了30个关键字,每个关键字的匹配结果都在10个以上,然后用它们分别进行查询,因为可能有缓存的关系,所以每个查询只执行了一次,下面是结果:
user system total real
Xapian 0.020000 0.020000 0.040000 ( 0.042381)
Sphinx 0.150000 0.030000 0.180000 ( 0.285173)
结果显示,Xapian要快很多,但因为我的数据集实在是太小,所以可能并不能说明问题,这个结果仅供参考,当然,我想大部分人恐怕还是会选择Sphinx,因为Xapian的Rails插件acts_as_xapian实在是太难用了。
