【问题标题】:Avoid n+1 query when indexing on elasticsearch rails在 elasticsearch rails 上建立索引时避免 n+1 查询
【发布时间】:2015-05-21 19:36:42
【问题描述】:

我有一个Genre 模型,它的名称在genre_translations 表中翻译(使用globalize gem)

我正在尝试使用 elasticsearch-rails gem 索引模型

def as_indexed_json(options = {})
  as_json(
    only: %i(type available),
    methods: %i(name),
  )
end

但是当我做Genre.import 时,我在我的rails 控制台上得到以下信息:

[1] pry(main)> Genre.import
  Genre Load (27.1ms)  SELECT  "genres".* FROM "genres"  ORDER BY "genres"."id" ASC LIMIT 1000
  Genre::Translation Load (23.9ms)  SELECT "genre_translations".* FROM "genre_translations" WHERE "genre_translations"."genre_id" = $1  [["genre_id", 1]]
  Genre::Translation Load (0.3ms)  SELECT "genre_translations".* FROM "genre_translations" WHERE "genre_translations"."genre_id" = $1  [["genre_id", 2]]
  Genre::Translation Load (0.3ms)  SELECT "genre_translations".* FROM "genre_translations" WHERE "genre_translations"."genre_id" = $1  [["genre_id", 3]]
  ...

关于如何使用连接索引所有 Genre 项目以避免 N+1 行为的任何建议?

【问题讨论】:

  • 你能解释一下你所说的“N+1 行为”是什么意思吗?你的实际问题是什么?
  • @MaxWilliams 问题是当从流派和流派翻译表中获取数据时,它应该在单个查询中完成。它不应该进行查询以获取流派,然后对每种流派进行 1 次查询以获取名称。你可以在这里找到详细的解释:sitepoint.com/silver-bullet-n1-problem

标签: ruby-on-rails optimization elasticsearch


【解决方案1】:

来自文档here

    # @example Pass an ActiveRecord query to limit the imported records
    #
    #    Article.import query: -> { where(author_id: author_id) }

所以你可以这样做:

 Genre.import query: -> { includes(:translations) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多