web-dev-qa-db-ja.com

マングースの重み付き全文検索

私が知っているように、バージョン3.8.9以降、mongooseは全文検索をサポートしています。しかし、私はそれのための良いドキュメントを見つけることができません!
次のようなことをしたい:

db.collection.ensureIndex(
    // Fields to index
    {
        animal:  "text",
        color:   "text",
        pattern: "text",
        size:    "text"
    },

    // Options
    {
        name: "best_match_index",

        // Adjust field weights (default is 1)
        weights: {
            animal: 5,  // Most relevant search field
            size:   4   // Also relevant
       }
    }
)

純粋なマングースでできますか?または、 mongoose-text-search ?のようなプラグインを使用する必要があります体重なしでどうですか?
そして、どうすればいいですか?

44

はい、Mongoose> = 3.8.9で全文検索を使用できます。まず、コレクションには最大1つのテキストインデックスを含めることができます( docs を参照)。したがって、 複数フィールド のテキストインデックスを定義するには、複合インデックスが必要です。

_schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' });
_

次のように $ textクエリ演算子 を使用できます:

_Model
    .find(
        { $text : { $search : "text to look for" } }, 
        { score : { $meta: "textScore" } }
    )
    .sort({ score : { $meta : 'textScore' } })
    .exec(function(err, results) {
        // callback
    });
_

これにより、関連性スコアで結果がソートされます。

weights については、weightsオプションオブジェクトを index() メソッド(複合インデックスを定義する場所)に渡すことができます(少なくともv4.0.1で動作します)マングースの):

_schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' }, {name: 'My text index', weights: {animal: 10, color: 4, pattern: 2, size: 1}});
_
108
eagor

MongoDB 2.6以降、コレクションには最大で1つのテキストインデックスを含めることができます(文書化された here )。したがって、MongoDBの現在のバージョンでは、必要なことを実行できません。実際、一致の場所に応じて異なる重みの要件を持つ複雑なテキスト検索の問題については、SolrやElasticSearchのような本格的なテキスト検索ソリューションを検討する必要があります。

MongoDBの回避策として、フィールドを手動でトークン化し、それらをキーワード配列として保存し、インデックスを付けることができます。

animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"]

その後のようなクエリ

db.test.find({動物:{$ in:["茶色"、 "靴"]})

テキスト検索を模倣します。このアプローチには、設定に必要な手作業、「夢」と「夢」を一致させるための語幹がないなどのいくつかの制限があります。ストップワードは通常のテキストインデックス、および重み付けメカニズムの欠如。

2
wdberkeley

http://code.tutsplus.com/tutorials/full-text-search-in-mongodb--cms-24835 に作成されたインデックスを削除した次の記事を見つけました以下を使用したトップアンサー

db.tablename.dropIndex({"indexname_text"})  

このコマンドでインデックスのリストを取得しました

db.tablename.getIndexes()

次に、以下を使用してインデックスを作成しました

db.tablename.createIndex({"$**":"text"})

次のコマンドはMongooseで機能しました

model.find(
    {$text: {$search: "text you are searching for"}},
    {score: {$meta: "textScore"}})
    .sort({score:{$meta:"textScore"}}
)
.exec(function(err, results) {
    `enter code here`if(!err){
    console.log('results ' + results);
}
else
{
    console.log(err);
}
});
1
Gordon Deudney