【问题标题】:Sunspot Gem Using in STI TABLESTI TABLE 中使用的太阳黑子宝石
【发布时间】:2017-05-17 10:12:13
【问题描述】:

我有Account 模型、AssetCapitalRevenue 这个表都继承在我的Account 模型中。我的帐户模型中有 3 种属性。名称、代码和类型。当我创建一个帐户时,将在我的帐户中插入一个帐户,另一个在我的类型中,例如

Account.create(name: "test123", code:"test123", type:"Asset")

sql 将运行两个 Insert 一个用于 Account 模型,一个用于 Asset Table

我的太阳黑子运行良好,它将重新索引我的数据库,我可以搜索我的参数

但是当我更新我的模型帐户时,我的 sql 运行一次插入和一次更新

我的问题是如何在更新时重新索引我的模型。带有特定的数据。我可以做Sunspot.reindex,但这会将所有数据加载到我的 sql 中。这会让我变慢

【问题讨论】:

    标签: ruby-on-rails ruby sunspot sunspot-rails sunspot-solr


    【解决方案1】:

    sql 将运行两个 Insert 一个用于 Account 模型,一个用于 Asset Table

    仅供参考,当您想在多个模型之间共享同一个数据库表时,您可以使用 STI,因为它们在属性和行为方面相似。像AdminUser 模型可能具有与PublisherUserReaderUser 几乎相同的属性/列。因此,您可能希望有一个名为users 或模型User 的公用表,并在上述模型之间共享此表。

    要点是:ActiveRecord 将运行一个 SQL 查询而不是两个,例如:

    INSERT INTO "accounts" ("name", "code", "type") VALUES ('test123', 'test123', 'Asset')
    

    我的问题是如何在更新时重新索引我的模型。带有特定的数据。我可以做 Sunspot.reindex 但这会加载我的 sql 中的所有数据。这会让我变慢

    实际上,sunspot_rails 旨在在您对模型/记录进行更改时自动重新索引。它监听savecallbacks

    但是你需要确保你没有使用像update_column(s) 这样的方法。 See the list of silent create/update methods which do not trigger callbacks and validations at all.


    另外,你需要了解batch size在Solr方面的概念。出于性能原因,您的所有新索引都不会立即提交。 Committed 意味着,像在 RDBMS 提交中一样将索引写入数据库。

    默认情况下,提交的batch_size50。这意味着在 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 建议。

    但是,我认为您不需要干预自动操作。我认为你没有看到立竿见影的效果,所以你很担心。

    【讨论】:

      【解决方案2】:

      根据the documentation,如果您在 Rails 上,对象将被自动索引。但它也提到你可以手动重新索引一个类:

      Account.reindex
      Sunspot.commit
      

      它还建议在单个对象上使用Sunspot.index

      【讨论】:

        【解决方案3】:

        我把这个放到我的模型上

         after_update do
          Sunspot.index Account.where(id: self.id)
        end
        

        【讨论】:

        • 关于索引,sunspot 自动正确处理。唯一建议您手动执行的操作是“提交”。
        • 提交用于添加、删除和编辑我唯一的问题是编辑
        • 这很奇怪,为什么我在使用 STI 时编辑出现问题,但现在可以了
        猜你喜欢
        • 2013-12-06
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多