joh*_*ers 11 ruby-on-rails elasticsearch tire
我正在使用Tire和ActiveRecord为elasticsearch索引数据集.我有一个Artist模型,has_many:images.如何索引返回特定图像的Artist模型的方法?或者参考相关模型的方法?我想要的艺术家结果将包括与艺术家相关的主要图像的路径(原始图像和缩略图).
我试过这个映射:
mapping do
indexes :id, :index => :not_analyzed
indexes :name
indexes :url
indexes :primary_image_original
indexes :primary_image_thumbnail
end
Run Code Online (Sandbox Code Playgroud)
引用这些Artist方法:
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
Run Code Online (Sandbox Code Playgroud)
这只是忽略了索引方法.基于其他答案,如Elasticsearch,Tire和嵌套查询/与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
Run Code Online (Sandbox Code Playgroud)
但这也不会归还我所追求的.我花了几个小时谷歌搜索和阅读elasticsearch和Tire文档,并没有找到这个模式的工作示例.谢谢你的想法!
因此,在此处包含您的索引编制问题的解决方案.
索引方法的一种方法是将其包含在to_json调用中:
def to_indexed_json
to_json(
:only => [ :id, :name, :normalized_name, :url ],
:methods => [ :primary_image_original, :primary_image_thumbnail, :account_balance ]
)
end
Run Code Online (Sandbox Code Playgroud)
另一个,更优选的是,使用: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
Run Code Online (Sandbox Code Playgroud)
索引速度慢的问题很可能是由于数据库中的n + 1个查询:对于您索引的每个艺术家,您都会对图像(原始和缩略图)发出查询.一种更高效的方法是在一个查询中加入相关记录; 请参阅Rails指南中的Eager Loading Associations.
轮胎Index#import方法和导入Rake任务允许您传递参数,然后将这些参数发送到网上的分页方法.
那么让我们比较天真的方法:
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)
Run Code Online (Sandbox Code Playgroud)
当我们传递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))
Run Code Online (Sandbox Code Playgroud)
好多了:)请尝试一下,让我知道它是否解决了你的问题.
您也可以在Rails控制台中试用它:Article.importvs Article.import(include: ['comments']). 作为旁注,这个确切的问题是params在Tire的整个导入工具链中支持哈希的原因.