我有Account
模型,Asset
,Capital
和Revenue
此表都在我的Account
模型中继承。我的帐户模型中有3种属性。名称,代码和类型。当我创建一个帐户,其中将插入将在我的帐户中发生一个,另一个在我的类型中,例如
Account.create(name: "test123", code:"test123", type:"Asset")
sql将运行两个插入一个用于帐户模型,一个用于资产表
我的太阳黑子工作得很好重新索引我的数据库,我可以搜索我的参数
但是当我更新我的模型帐户时,我的sql运行一次插入和一次更新
我的问题是我在更新时如何重新索引我的模型。有特定数据。我可以Sunspot.reindex
,但这将加载我的SQL中的所有数据。这将导致我放慢速度
答案 0 :(得分:4)
sql将运行两个插入一个用于帐户模型,一个用于资产表
当您想要在多个模型之间共享相同的数据库表时,您使用STI是因为它们在属性和行为上相似。与AdminUser
模型类似,可能与PublisherUser
或ReaderUser
具有几乎相同的属性/列。因此,您可能希望拥有一个名为users
或模型User
的公用表,并在上述模型中共享此表。
点是:ActiveRecord将运行单个SQL查询而不是两个,如:
INSERT INTO "accounts" ("name", "code", "type") VALUES ('test123', 'test123', 'Asset')
我的问题是我在更新时如何重新索引我的模型。有特定数据。我可以做Sunspot.reindex,但这将加载我的SQL中的所有数据。这将导致我放慢速度
实际上,sunspot_rails
用于在您对模型/记录进行更改时自动重新索引。它会收听save
callbacks。
但是你需要确保你没有使用像update_column(s)
这样的方法。 See the list of silent create/update methods which do not trigger callbacks and validations at all
此外,您需要从Solr的角度理解batch size
的概念。出于性能原因,不会立即提交所有新索引。 已提交表示将索引写入数据库,就像在RDBMS提交中一样。
默认情况下,提交的batch_size
为 50 。在50个index
方法执行后的含义仅提交索引,您将能够搜索记录。要更改它,请使用以下
# in config/initializers/sunspot_config.rb
Sunspot.config.indexing.default_batch_size = 1 # or any number
或
# in models; its not considered good though
after_commit do
Sunspot.commit
end
对于手动重新编制索引,您可以使用建议的@Kathryn。
但是,我认为你不需要介入自动操作。我认为你没有立即看到结果,所以你担心。
答案 1 :(得分:1)
According to the documentation, objects will be indexed automatically if you are on Rails. But it also mentions you can reindex a class manually:
Account.reindex
Sunspot.commit
It also suggests using Sunspot.index
on individual objects.
答案 2 :(得分:1)
我把它放到我的模型中
after_update do
Sunspot.index Account.where(id: self.id)
end