我使用以下include语句对我的solr索引的第2版进行了基准测试:
searchable(:auto_index => false, :auto_remove => true,
:include => { :account => true,
:user_practice_contact => [:city],
:user_professional_detail => [:specialty, :subspecialties]}) do
第二个:
searchable(:auto_index => false, :auto_remove => true) do
我期待看到带有包含的版本的速度提升,但结果如下:
版本包括:
Benchmark.measure { User.limit(50).each do |u|; u.index; end; Sunspot.commit; }
=> #<Benchmark::Tms:0x1130b34e8 @real=6.8079788684845, @utime=5.05, @cstime=0.0, @cutime=0.0, @total=5.2, @label="", @stime=0.149999999999999>
且没有包含:
Benchmark.measure { User.limit(50).each do |u|; u.index; end; Sunspot.commit; }
=> #<Benchmark::Tms:0x112ef0fe8 @real=6.82465195655823, @utime=4.92, @cstime=0.0, @cutime=0.0, @total=5.07, @label="", @stime=0.15>
有人知道这些包含是否有效?如果是这样,我做错了吗? 我查看了文档:http://outoftime.github.com/sunspot/rails/docs/并且没有提及。
答案 0 :(得分:3)
根据the API,:include
将:
允许ActiveRecord在编制索引时加载所需的关联。
您的基准测试无法正常工作,因为您在普通的Ruby迭代器中索引单个记录。当您将单个记录编入索引50次时,太阳黑子根本无法使用预先加载。相反,你应该这样做:
Sunspot.index( User.limit(50) );
Sunspot.commit
哦,你可以测试以下是否比上面更快?我真的很想知道。
Sunspot.index( User.includes(:account).limit(50) );
Sunspot.commit
目前还有一个bug,STI模型会忽略:include
。
答案 1 :(得分:1)
通过查看Rails日志中的SQL查询,您可以看到可搜索的:include
导致索引时急切加载。 :include
上的#search
在搜索时引起了急切的加载。