使用持久性模型从一个索引导入新索引

时间:2013-06-24 00:11:10

标签: elasticsearch will-paginate tire

我有一个应用程序,它有一个Nutch抓取工具将结果直接发送到由轮胎持久性模型创建的ElasticSearch索引。

我正在寻找对不需要删除索引的索引进行更改的最佳方法,然后重新创建它并在索引是主数据源时重新填充它。我一直在努力让方法在索引是别名的地方工作,然后让索引与别名相关联,然后从主索引导入到新索引。

我一直试图通过这种方法获得rake environment tire:import CLASS='Applicant' INDEX='index_new'命令来完成工作,但由于未定义的方法'paginate'而导致导入失败,因此没有取得任何成功我在我的模型中定义了一个'paginate'方法,它从未定义的方法'count'失败,它在轮胎-0.60.0 / lib / tire / model / import.rb:102中命中。

我一直在寻找正确的方法,但我现在还不相信我现在正走在正确的道路上。我已将我的模型包含在下面以供参考。我使用WillPaginate进行分页。

class Applicant
  include Tire::Model::Persistence
  include Tire::Model::Search
  include Tire::Model::Callbacks  

  require 'will_paginate'
  require 'will_paginate-bootstrap'
  require 'will_paginate/array'

  index_name 'index'
  document_type 'doc'

 mapping  
    indexes :boost, type: 'string'
    indexes :content, type: 'string'
    indexes :digest, type: 'string'          
    indexes :id, type: 'string'
    indexes :skill, type: 'string'
    indexes :title, type: 'string'
    indexes :tstamp, type: 'date', format: 'dateOptionalTime'
    indexes :url, type: 'string'
    indexes :domain, type 'string'

 property :boost
 property :content
 property :digest  
 property :id
 property :skill 
 property :title    
 property :tstamp  
 property :url
 property :domain

  def self.search(params)
   tire.search(page: params[:page], per_page: 20)do
      query { string params[:query], default_operator: "AND" } if params[:query].present?
      filter :term, domain: params[:domain_selected]  if params[:domain_selected].present?
      filter :term, skill: params[:skill_selected]  if params[:skill_selected].present?
      facet "domains" do
        terms :domain
      end 
      facet "skills" do
        terms :skill
      end
    end
  end 

  def self.paginate(params)
   @page_results = WillPaginate::Collection.create(params[:page], per_page, total_entries) do |pager|
     pager.replace(@self.to_array)
   end
   @page_results = @self.paginate(params[:current_page], params[:per_page])
  end
end

在旁注而且优先级较低的情况下,我一直在挖掘代码,试图理解为什么导入需要分页,而且我不清楚。

提前致谢。

2 个答案:

答案 0 :(得分:0)

嗯,你得到这个错误的原因是,在你看来,我猜,你指的是paginate gem。

要做的第一件事就是检查你的视图,从视图和控制器中剥离paginate,或者,如果你需要paginate,做这个简单的测试:

  

您的应用程序应该加载will_paginate gem。看看是否   已加载库,打开您的应用程序的控制台并尝试   以下几行:

     
    
      

定义? WillPaginate       ActiveRecord的:: Base.respond_to? :paginate如果这些行中的任何一行返回nil / false,则will_paginate未在您的应用中正确加载。

    
  

((来自https://github.com/mislav/will_paginate/wiki/Troubleshooting))

如果失败,请确保Gemfile中有以下两行:

gem 'will_paginate', '~> 3.0.3'
gem 'bootstrap-will_paginate', '~> 0.0.6'

如果这对你不起作用,请告诉我,我们会深入挖掘。

答案 1 :(得分:0)

经过2周的搜索,我找到了我正在寻找的解决方案。我基本上使用Article.create_elasticsearch_index后跟Tire.index('original-index-name').reindex 'new-index-name'来完成我想要的结果。 Karmi的推文就是让我找到正确解决方案的原因。

https://twitter.com/karmiq/status/185811361069142016

我也正在努力使jarosan的工作适应我的工作,并将很快发布。

https://gist.github.com/3124884

感谢Michel和Karel。