是否:包括在太阳黑子/ solr搜索方法内做什么?

时间:2011-09-02 18:48:05

标签: ruby solr sunspot

我使用以下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/并且没有提及。

2 个答案:

答案 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在搜索时引起了急切的加载。