我有一个模型,它部署了一个延迟的工作来更新它的一些属性。该模型被声明为“可搜索”...
searchable do
text :content, :stored => true
end
...我认为保存后会重新索引。在测试中,情况似乎并非如此。如果我运行:rake sunspot:reindex
,那么一切都会按预期进行。什么可能导致此问题?
我有一个模型,它部署了一个延迟的工作来更新它的一些属性。该模型被声明为“可搜索”...
searchable do
text :content, :stored => true
end
...我认为保存后会重新索引。在测试中,情况似乎并非如此。如果我运行:rake sunspot:reindex
,那么一切都会按预期进行。什么可能导致此问题?
正如 Jason 所提到的,您可以致电Sunspot.commit_if_dirty
以从您的客户那里发出提交。
在服务器配置方面,另一种方法是在您的索引中设置autoCommit
属性以在solrconfig.xml
对索引进行更改时自动发出提交。对于maxTime
大多数站点来说,60000 毫秒(一分钟)就足够了。
在生产应用程序中使用autoCommit
可能是更明智的选择,其中大量提交很容易影响 Solr 服务器的性能。事实上,当您的网站开始获得大量更新时,禁用 Sunspot 是一个很好的做法。auto_commit_after_request option
最后,autoCommit
具有能够设置并忘记它的优点。
在Websolr,我们的默认设置是忽略客户端发出的提交,而支持autoCommit
.
索引只会反映Sunspot.commit
调用后的变化。这会在您运行时自动发生rake sunspot:reindex
。
Sunspot 的 Rails 插件还有一个auto_commit_after_request
配置选项,它将Sunspot.commit_if_dirty
在每次请求后调用,但这不会由您的后台进程触发。
你最好的选择是Sunspot.commit_if_dirty
在你延迟的工作中做最后一件事。
我遇到了和你完全相同的问题——当我测试我的搜索功能时,sunspot 永远不会向 solr 提交提交。如果我手动调用 Sunspot.commit 一切正常。我摆弄了auto_commit_after_request,但默认情况下这是真的,所以它不应该有所不同。
因此,经过更多调查后,我发现 Sunspot 不会自动发出提交,除非更改是在 Web 请求的上下文中进行的。如果您要从测试或后台作业中进行更改,则必须手动调用 Sunspot.commit。