-->

索引的方法的在ElasticSearch结果(轮胎+ ActiveRecord的)(Index th

2019-07-04 05:24发布

我索引的使用轮胎和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和轮胎的文件,并没有发现这种模式的工作榜样。 感谢您的想法!

Answer 1:

因此,包括您解决问题索引这里。

索引协会

索引的一种方法一种方法是将其包含在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.importArticle.import(include: ['comments']) 作为一个侧面说明,这种确切的问题是,用于支撑的原因params轮胎全进口工具链哈希值。



文章来源: Index the results of a method in ElasticSearch (Tire + ActiveRecord)