1

ElasticsearchとTireに基づく全文検索を備えたRailsアプリがあり、CategoryというMongoDBモデルですでに動作していますが、今度は、 embeds_manyであるMongoID Embedded 1-nmodelUserに基づくより複雑な検索を追加したいと思います。 :ウォッチリスト

ここで、ウォッチリストのすべてのフィールドを一括インポートしてインデックスを作成する必要があります。知りたいのは次のとおりです。

  1. どうやってやるの ?
  2. ユーザーの親フィールドなしで、ウォッチリストの子フィールドのみにインデックスを付けることができますか?

Embedded 1-N MongoDB / MongoIDモデルは、次のようになります。

app / models / user.rb(親):

class User
  include Mongoid::Document

  include Tire::Model::Search
  include Tire::Model::Callbacks
  index_name 'users'

  field :nickname
  field ... many others

  embeds_many :watchlists
end

app / models / watchlist.rb(埋め込まれた「多くの」子):

class Watchlist
  include Mongoid::Document

  include Tire::Model::Search
  include Tire::Model::Callbacks
  index_name 'watchlists'

  field :html_url
  embedded_in :user
end

タスクを達成する方法について何か提案はありますか?

更新: ここでは、mongoシェルで見られるモデルのチャンクです

    > user = db.users.findOne({'nickname': 'lgs'})
    {
       "_id" : ObjectId("4f76a16cf2a6a12f88cbca43"),
       "encrypted_password" : "",
       "sign_in_count" : 0,
       "provider" : "github",
       "uid" : "1573",
       "name" : "Luca G. Soave",
       "email" : "luca.soave@gmail.com",
       "nickname" : "lgs",
       "watchlists" : [
           {
               "_id" : ObjectId("4f76997f1d41c81173000002"),
               "tags_array" : [ git, peristence ],
               "html_url" : "https://github.com/mojombo/grit",
               "description" : "Grit gives you object oriented read/write access to Git repositories via Ruby.",
               "fork_" : false,
               "forks" : 207,
               "watchers" : 1258,
               "created_at" : ISODate("2007-10-29T14:37:16Z"),
               "pushed_at" : ISODate("2012-01-27T01:05:45Z"),
               "avatar_url" : "https://secure.gravatar.com/avatar/25c7c18223fb42a4c6ae1c8db6f50f9b?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"
           },
       ...
       ...
    } 

埋め込まれた子ウォッチリストのドキュメントが所有するフィールドにインデックスを付けてクエリを実行したいのですが:

 ... "tags_array", "html_url", "description", "forks" 

しかし、elasticsearchに親ユーザーフィールドを含めたくありません:

 ... "uid", "name", "email", "nickname" 

そのため、「git persistence」をクエリすると、元のMongoDBの各「ユーザー」の各「ウォッチリスト」インデックス付きフィールドが調べられます。

(ここでは単数形と複数形が一致していないことをお詫びします。ドキュメントオブジェクト名を示しているだけです)

4

1 に答える 1

3

クエリの方法に基づいて、検索エンジンのデータをどのようにシリアル化するかによって異なります。質問を更新してください。回答を更新します。(また、ESログを削除することをお勧めします。ここでは関係ありません。)

RakeタスクがMongoの埋め込みドキュメントでどのように機能するのか、また、なぜ最後に「ハング」するように見えるのかはわかりません。タスクを実行するとき、データは「ユーザー」インデックスにありますか?

Rakeタスクの柔軟性が十分でない場合は、独自のインデックスコードを提供するのは非常に簡単であることに注意してください。Tire::Index#import統合テストを参照してください。

于 2012-11-22T17:07:01.410 に答える