【问题标题】:How to make Sunspot works with Mongoid + Rails 3如何使 Sunspot 与 Mongoid + Rails 3 一起使用
【发布时间】:2011-12-28 09:55:34
【问题描述】:

我正在使用 Rails3/Mongoid 编写类似博客的应用程序,现在尝试使用 Sunspot 进行全文搜索

我按照以下步骤操作:https://github.com/outoftime/sunspot,将此https://github.com/jugyo/sunspot_mongoid 安装为插件,并添加以下代码以使sunspot:reindex 正常工作,

module Mongoid
  module BaseModel
    extend ActiveSupport::Concern

    included do
      scope :recent, desc(:_id)
      scope :exclude_ids, Proc.new { |ids| where(:_id.nin => ids.map(&:to_i)) }
    end

    module ClassMethods
      # like ActiveRecord find_by_id
      #def find_by_id(id)
      #  if id.is_a?(Integer) or id.is_a?(String)
      #    where(:_id => id.to_i).first
      #  else
      #    nil
      #  end
      #end

      def find_in_batches(opts = {})
        batch_size = opts[:batch_size] || 1000
        start = opts.delete(:start).to_i || 0
        objects = self.limit(batch_size).skip(start)
        t = Time.new
        while objects.any?
          yield objects
          start += batch_size
          # Rails.logger.debug("processed #{start} records in #{Time.new - t} seconds") if Rails.logger.debug?
          break if objects.size < batch_size
          objects = self.limit(batch_size).skip(start)
        end
      end
    end
  end
end

在我的帖子模型中:

  include Sunspot::Mongoid
  searchable do
    text :title, :stored => true
    text :content, :stored => true
    text :comments, :stored => true do
      comments.map { |comment| comment.content }
    end                                                                                                  
    time :last_comment_at
  end 

但是当我使用@search = Post.search 时,它总是给我这个错误..

Mongoid::Errors::InvalidFind in SearchController#index
Calling Document#find with nil is invalid

我发现可能和Mongoid有冲突,改成Post.solr_search

但是还是不行:

[parano@u330 attix.us]$ bundle exec rake sunspot:solr:start 
:public is no longer used to avoid overloading Module#public, use :public_folder instead
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/resque-1.19.0/lib/resque/server.rb:12:in `<class:Server>'
Removing stale PID file at /home/parano/code/rails_projects/attix.us/solr/pids/development/sunspot-solr-development.pid
Successfully started Solr ...


[parano@u330 attix.us]$ rails console
:public is no longer used to avoid overloading Module#public, use :public_folder instead
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/resque-1.19.0/lib/resque/server.rb:12:in `<class:Server>'
Loading development environment (Rails 3.1.3)

ruby-1.9.3-p0 :001 > p = Post.solr_search { fulltext 'vero' }

 => <Sunspot::Search:{:fq=>["type:Post"], :q=>"vero", :fl=>"* score", :qf=>"title_texts content_texts comments_texts", :defType=>"dismax", :start=>0, :rows=>30}> 

ruby-1.9.3-p0 :002 > p.results

NoMethodError: undefined method `id' for #<Array:0xb4916b8>
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/mongoid-2.3.4/lib/mongoid/criteria.rb:382:in `method_missing'
    from /home/parano/code/rails_projects/attix.us/vendor/plugins/sunspot_mongoid/lib/sunspot/mongoid.rb:45:in `criteria'
    from /home/parano/code/rails_projects/attix.us/vendor/plugins/sunspot_mongoid/lib/sunspot/mongoid.rb:39:in `load_all'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/abstract_search.rb:228:in `block in populate_hits'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/abstract_search.rb:224:in `each_pair'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/abstract_search.rb:224:in `populate_hits'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/hit.rb:90:in `result'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/abstract_search.rb:275:in `block in verified_hits'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/paginated_collection.rb:50:in `select'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/paginated_collection.rb:50:in `method_missing'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/abstract_search.rb:275:in `verified_hits'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/sunspot-1.3.0/lib/sunspot/search/abstract_search.rb:59:in `results'
    from (irb):2
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in `start'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in `start'
    from /home/parano/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands.rb:40:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'ruby-1.9.3-p0 :003 > 

有人可以帮助我吗?

【问题讨论】:

  • 我在 solr 中重新索引时遇到问题。您已经提到添加上述代码可以解决该问题,但是我应该将该代码添加到哪个文件以重新索引工作?

标签: ruby-on-rails mongodb mongoid sunspot sunspot-rails


【解决方案1】:

这是非常测试版。我试图让最简单的例子与 sunspot_mongoid 一起工作,但没有运气。未包含 rake 任务,可能与 github 上的此问题有关:

https://github.com/jugyo/sunspot_mongoid/issues/7

也许如果您在那里提出问题,维护者将能够查看并回复。

【讨论】:

  • 在 github 上的描述中说 sunspot_mongoid “不再维护” :( 最后一次提交是一年前的。
  • 是的,现在弹性搜索似乎是一个更好的选择。
  • 你在用弹性搜索的轮胎宝石吗?
【解决方案2】:

我已经更新了sunspot_mongoid,现在效果很好:D https://github.com/hlegius/sunspot_mongoid2

【讨论】:

    【解决方案3】:

    在我的应用程序中,我只使用 sunspot_rails gem。这是我的太阳黑子配置文件:

    Sunspot.config.pagination.default_per_page = 24
    
    module MongoidAdapter
      class InstanceAdapter < Sunspot::Adapters::InstanceAdapter
        def id
          @instance.id.to_s
        end
      end
    
      class DataAccessor < Sunspot::Adapters::DataAccessor
        def load(id)
          @clazz.criteria.for_ids(BSON::ObjectId(id))
        end
    
        def load_all(ids)
          @clazz.criteria.in(:_id => ids.map {|id| BSON::ObjectId(id)})
        end
      end
    end
    
    Sunspot::Adapters::DataAccessor.register(MongoidAdapter::DataAccessor, Mongoid::Document)
    Sunspot::Adapters::InstanceAdapter.register(MongoidAdapter::InstanceAdapter, Mongoid::Document)
    

    【讨论】:

    • 您使用的是哪个版本的 Mongoid 和 Sunspot Rails?
    • mongoid 2.4.10, sunspot_rails 1.3.2
    【解决方案4】:

    如果您仍然想在 mongo 中使用 sunspot,您可以使用 sunspot_mongo(与 mongo mapper 和 mongoid 一起使用) https://github.com/derekharmel/sunspot_mongo

    【讨论】:

      【解决方案5】:

      该项目有 4 个活跃的分叉。

      您可以在此处查看所有 70 个分叉并选择您最喜欢的一个:

      https://github.com/jugyo/sunspot_mongoid/network

      我目前正在使用 hlegius 提到的新 sunspot_mongoid2 gem(谢谢!)

      【讨论】:

        【解决方案6】:

        我可能会补充一点,有一个名为 sunspot_mongoid2 的新 gem 对我有用,但 sunspot_mongoid 非常失败。

        我没有查看代码本身,但是从 GitHub 看来 sunspot_mongoid 已经有一段时间没有收到任何相关更新了。

        【讨论】:

          猜你喜欢
          • 2012-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-11
          • 2013-03-22
          • 1970-01-01
          • 2011-09-26
          相关资源
          最近更新 更多