ruby-on-rails - 一旦我的应用程序爬升到 > 1000 个对象,Sunspot-Solr 就会慢下来 [包括 Solr 日志]

标签 ruby-on-rails solr sunspot performance

我很好奇是否有人注意到 Sunspot-Solr 的任何缩放问题。即使我删除了所有可搜索的参数,它也只是自己计算原始类;在我的本地加载仍然需要 5 到 8 秒,生产需要 4 到 5 秒。

有没有其他人能够扩展 Sunspot-Solr ?有哪些常见问题?

如何更深入地了解这一点?

这是单个请求的 Solr 日志:

Solr Select (208.1ms)   {:rows=>20, :start=>0, :q=>"*:*", :sort=>"score desc", :fq=>["type:Organization", "published_b:true", "updated_at_d:[2009\\-02\\-03T16\\:11\\:55Z TO *]"]}

Solr Select (5.5ms)   {:rows=>20, :start=>0, :q=>"*:*", :sort=>"score desc", :fq=>["type:Organization", "published_b:true", "updated_at_d:[2009\\-02\\-03T16\\:11\\:55Z TO *]"]}

Solr Update (12.6ms)   <?xml version="1.0" encoding="UTF-8"?><add><doc><field name="type">User</field><field name="type">ActiveRecord::Base</field><field name="id">User 2</field><field name="class_name">User</field><field name="first_name_s">Bob</field><field name="created_at_d">2009-09-28T21:00:27Z</field><field name="last_name_s">Marley</field><field name="email_s">bob.marley@gmail.com</field><field name="name_s">Bob Marley</field><field name="last_name_text">Marley</field><field name="first_name_text">Bob</field><field name="email_text">bob.marley@gmail.com</field><field name="name_text">Bob Marley</field></doc></add>


Solr Update (487.7ms)   <?xml version="1.0" encoding="UTF-8"?><commit/>
Completed in 12632ms (View: 11633, DB: 228) | 200 OK [http://localhost/organizations/search]

最佳答案

1000 个对象对于 Solr 来说是儿戏,所以这里有一些可疑的东西,大约 200 毫秒的 Solr 读取。但是,您最直接的问题是您在看似是 GET 请求的过程中向 Solr 写信——这是怎么回事?您是否正在保存触发 Sunspot 自动索引的可搜索对象?如果您需要在 GET 请求过程中更新模型(如果可能,应该在后台作业中完成),您需要禁用 Sunspot 中的自动索引:

searchable :auto_index => false
  # sunspot setup
end

然后你需要明确地调用 my_model.index当您确实想在 Solr 中更新它们时,在您的 Controller 中。

最后,最后的重大更新是 Solr 提交,它告诉 Solr 将未暂存的更改写入磁盘并加载反射(reflect)这些更改的新搜索器。提交是昂贵的; Sunspot::Rails 默认在写入 Solr 的任何请求结束时执行提交,但这种行为的目标是为 Sunspot 的新用户提供最少惊喜的原则,而不是生产中的实时应用程序。您需要在 config/sunspot.yml 中禁用它:
auto_commit_after_request: false

然后你可能想在你的 solr/conf/solrconfig.xml 中配置 autoCommit -- 它在默认的 Sunspot Solr 发行版中被注释掉了,里面也有解释。我发现每分钟一次是一个很好的起点。

进行这些更改后,我会看看您的读取是否仍然很慢——我认为很可能是因为每次搜索时,您对 Solr 的写入/提交导致它必须加载一个新的从磁盘搜索。因此,它不能让它的任何内部缓存升温等等,并且通常承受着巨大的压力。

希望有帮助!

关于ruby-on-rails - 一旦我的应用程序爬升到 > 1000 个对象,Sunspot-Solr 就会慢下来 [包括 Solr 日志],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4887142/

相关文章:

ruby-on-rails - 如何仅重新索引 Sunspot Solr 中的某些对象

lucene - 在 Solr 中,NOT 和 -(减号)运算符之间有什么区别?

solr - Solr 中的可更新字段

ruby-on-rails - 使用 OR 的 Sunspot/SOLR 查询

ruby-on-rails - 没有对象的方法的 Rails 源位置

solr - Lucene - 很少或很多索引

ruby-on-rails - Solr (Sunspot) 运行,但不会启动

ruby-on-rails - ActiveRecord SQL执行时间

ruby-on-rails - 模型和助手中的常用方法

ruby-on-rails - Ruby on Rails 版本之间的差异?我应该使用哪个?