2

モデルの属性のいずれかによって、多数のコレクションのいずれかでモデルを検索できるようにするグローバル検索を作成するというアイデアをいじっています。例えば:

次のコレクションがあります。

  • ユーザー
  • アプリケーション
  • 役割

各ユーザー、アプリケーション、およびロールがどのような属性を持つかは事前にわかりませんが、説明のために次のようにします。

  • ユーザー名
  • User.last_name
  • ユーザー.email
  • アプリケーション.タイトル
  • アプリケーションの説明
  • Role.name
  • Role.説明

Siteここで、というメソッドで呼び出されるモデルを作成するとしsearchます。いずれかの属性に一致するSite.search(term)各コレクション内のすべてのアイテムを検索したいと考えています。term本質的には、グローバル モデル検索です。

これにどのようにアプローチすることをお勧めしますか? すべてのコレクションのモデルと各モデルの属性を繰り返し処理することで力ずくで実行できますが、それは肥大化して非効率的です。

助言がありますか?

/// 数分後...

これが私が今試したコードの一部です:

find: function(query) {
    var results = {}; // variable to hold the results
    // iterate over the collections
    _.each(["users", "applications", "roles"], _.bind(function(collection){
        // I want the result to be grouped by type of model so I add arrays to the results object
        if ( !_.isUndefined(results[collection]) || !_.isArray(results[collection]) ) {
            results[collection] = [];
        }
        // iterate over the collection's models
        _.each(this.get(collection).models, function(model){
            // iterate over each model's attributes
            _.each(model.attributes, function(value){
                // for now I'm only considering string searches
                if (_.isString(value)) {
                    // see if `query` is in the attribute's string/value
                    if (value.indexOf(query) > -1) {
                        // if so, push it into the result's collection arrray
                        results[collection].push(model);
                    }
                };
            });
        });
        // a little cleanup
        results[collection] = _.compact(results[collection]);
        // remove empty arrays
        if (results[collection].length < 1) {
            delete results[collection];
        }
    },this));
    // return the results
    return results;
}

これで期待どおりの結果が得られ、問題なく動作すると思いますが、3 つの配列を反復処理していることに気付きます。別の解決策はないかもしれませんが、私はあると感じています。誰かが提案できる場合は、ありがとうございます!その間、私は研究を続けます。

ありがとうございました!

4

1 に答える 1

2

データのセットが非常に限られており、パフォーマンスが実際に問題にならない場合を除き、これを行うことは強くお勧めしません。

検索を実行したい場合、すべての反復はノーノーです。検索エンジンはデータにインデックスを付け、プロセスを実行可能にします。検索を構築するのは難しく、それを効果的に行うクライアント側のライブラリはありません。

これが、誰もがサーバー上で検索を行っている理由です。solrや最近の私の個人的な好みのElasticsearchなどの使いやすい (または一種の) 検索エンジンが存在します。おそらく、モデル/コレクションをサーバーに既に保存していると思われます。それらにインデックスを付けることも簡単です。次に、検索は、クライアントから REST 呼び出しを行う問題になります。

于 2012-08-02T09:09:57.460 に答える