0

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

しかし、それでも機能しません:</ p>

[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 > 

誰でも私を助けることができますか?

4

6 に答える 6

1

これは非常にベータ版です。私は最も単純な例をsunspot_mongoidで機能させようとしましたが、うまくいきませんでした。レーキタスクは含まれていません。githubのこの問題に関連している可能性があります。

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

たぶん、あなたがそこに問題を提出した場合、メンテナは調べて対応することができるでしょう。

于 2012-01-03T23:05:35.283 に答える
1

更新sunspot_mongoidしましたが、うまく機能します:D https://github.com/hlegius/sunspot_mongoid2

于 2013-05-26T15:11:32.113 に答える
0

私のアプリケーションでは、sunspot_railsgemのみを使用しています。これが私のSunspot設定ファイルです:

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)
于 2012-02-08T21:36:50.440 に答える
0

それでもmongoでsunspotを使用したい場合は、sunspot_mongo(mongo mapperおよびmongoidで動作) https://github.com/derekharmel/sunspot_mongoを使用できます。

于 2012-12-05T04:01:08.160 に答える
0

プロジェクトには4つのアクティブなフォークがあります。

70のフォークすべてを表示し、ここで最も気に入ったフォークを選択できます。

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

私は現在、hlegiusが言及した新しいsunspot_mongoid2 gemを使用しています(ありがとうございます!)

于 2013-06-28T21:24:04.667 に答える
0

sunspot_mongoidがひどく失敗していた場所で私のために働いたsunspot_mongoid2と呼ばれる新しい宝石があることを付け加えるかもしれません。

コード自体は調べていませんが、GitHubからは、sunspot_mongoidが関連する更新をかなり長い間受け取っていないようです。

于 2013-07-26T10:22:00.807 に答える