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

ha5z0ras  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(2)|浏览(114)

我正在使用searchkick来 Package 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
}

当我运行reindex任务时:

Program.reindex(refresh: true)

我在日志中看到,已经对Provider和Schedule进行了许多SQL查询,每个Program一个。有没有办法告诉Searchkick“includes“或“preload“以某种方式优化重新索引?

a2mppw5e

a2mppw5e1#

希望searchkick中的eager load方法可用,我们可以在 search_import 方法的帮助下使用includes。
你可以在这里参考更多关于searchkick的文档。
从上面的示例数据中,我看到您的程序表与供应商,类别等有一个关联。在此基础上,我尝试在下面给出给予示例,希望对你有所帮助。

程序模型

从模型内部,您需要编写为

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

现在当你点击重新索引时,它首先会加载你在搜索导入中提到的所有关联数据。现在,它连续地为每个程序数据触发单个查询以在弹性中更新。
希望这有助于解决您的问题:)

z31licg0

z31licg02#

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

相关问题