使用Searchkick重新索引模型时如何避免N+1

问题描述 投票:0回答:2

我正在使用 searchkick 来包装 OpenSearch。 我的

Program
模型有这个
search_data
:

{
  name: name,
  description: description,
  provider_name: provider.name,
  category: category&.name,
  age_min: age_min || 0,
  age_max: age_max || 999,
  start_dates: current_published_schedules.pluck(:start_date),
  zipcode: address&.zipcode,
  program_type: program_type
}

当我运行重建索引任务时:

Program.reindex(refresh: true)

我在日志中看到对 Provider 和 Schedule 进行了许多 SQL 查询,每个程序一个。 有没有办法告诉 Searchkick “

includes
”或“
preload
”以某种方式优化重新索引?

ruby-on-rails elasticsearch opensearch searchkick
2个回答
0
投票

您可以使用他们的文档提到您可以在数据库级别缓存这些值


0
投票

希望在 searchkick 急切加载方法中可用,我们可以在 search_import 方法的帮助下使用包含。

您可以参考更多有关 searchkick 文档的信息这里

从上面的示例数据中,我看到您的节目表与提供商、类别等有一个关联。在此帮助下,我尝试在下面提供示例示例,希望对您有所帮助。

程序模型

在模型内部,您需要写为

scope :search_import, -> { includes(:provider, :category, :current_published_schedules) }

现在,当您点击重新索引时,它首先会立即加载您在搜索导入中提到的所有关联数据。现在,它连续触发每个程序数据的单个查询以在弹性中更新。

希望这有助于解决您的问题:)

© www.soinside.com 2019 - 2024. All rights reserved.