我索引的使用轮胎和ActiveRecord的elasticsearch的数据集。 我有一个艺术家模型,HAS_MANY:图像。 我怎么能指标,它返回一个特定的图像艺术家模型的方法? 或者可替换地引用相关联的模型的方法? 我的期望的艺术家结果将包括用于与艺术家(原始和缩略图)相关联的所述主图像的路径。
我试过这个映射:
mapping do
indexes :id, :index => :not_analyzed
indexes :name
indexes :url
indexes :primary_image_original
indexes :primary_image_thumbnail
end
引用这些艺术家的方法:
def primary_image_original
return images.where(:priority => 'primary').first.original
end
def primary_image_thumbnail
return images.where(:priority => 'primary').first.thumbnail_150
end
这恰恰忽略了索引的方法。 基于其他答案喜欢Elasticsearch,轮胎,并用ActiveRecord嵌套查询/协会 ,我尝试这样做:
mapping do
indexes :id, :index => :not_analyzed
indexes :name
indexes :url
indexes :images do
indexes :original
indexes :thumbnail_150
indexes :priority
end
end
def to_indexed_json
to_json(include: { images: { only: [:original, :thumbnail_150, :priority] } } )
end
但是,这也不能返回我后。 我花了几个小时,谷歌搜索和阅读elasticsearch和轮胎的文件,并没有发现这种模式的工作榜样。 感谢您的想法!
因此,包括您解决问题索引这里。
索引协会
索引的一种方法一种方法是将其包含在to_json
电话:
def to_indexed_json
to_json(
:only => [ :id, :name, :normalized_name, :url ],
:methods => [ :primary_image_original, :primary_image_thumbnail, :account_balance ]
)
end
另外一个,并且更优选的,是使用:as
在映射块的选项:
mapping do
indexes :id, :index => :not_analyzed
indexes :name
# ...
# Relationships
indexes :primary_image_original, :as => 'primary_image_original'
indexes :account_balance, :as => 'account_balance'
end
导入时格斗N + 1个查询
慢索引的问题是最可能是由于N + 1个查询数据库中的:对每一个艺术家,你的索引,你发出的图像(原件和缩略图)查询。 一个更高性能的方法是加入相关的记录在一个查询; 看到预先加载协会在Rails的指南。
该轮胎Index#import
方法,进口Rake任务,让你传递参数然后将其发送到PAGINATE方法沿着电线。
所以,让我们比较原始的方法:
bundle exec rake environment tire:import CLASS=Article FORCE=true
Article Load (7.6ms) SELECT "articles".* FROM "articles" LIMIT 1000 OFFSET 0
Comment Load (0.2ms) SELECT "comments".* FROM "comments" WHERE ("comments".article_id = 1)
Comment Load (0.1ms) SELECT "comments".* FROM "comments" WHERE ("comments".article_id = 2)
...
Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE ("comments".article_id = 100)
而当我们通过include
片段:
bundle exec rake environment tire:import PARAMS='{:include => ["comments"]}' CLASS=Article FORCE=true
Article Load (8.7ms) SELECT "articles".* FROM "articles" LIMIT 1000 OFFSET 0
Comment Load (31.5ms) SELECT "comments".* FROM "comments" WHERE ("comments".article_id IN (1,2, ... ,100))
更好:)请尝试一下,让我知道,如果它解决您的问题。
你也可以尝试一下在Rails的控制台: Article.import
与Article.import(include: ['comments'])
作为一个侧面说明,这种确切的问题是,用于支撑的原因params
在轮胎全进口工具链哈希值。