sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:テキスト検索を実行して日付で並べ替える方法

    他の複合インデックスキーに関係なく、を含める必要があります $ meta 正しい並べ替えを取得するための「textScore」の場合:

    db.collection.find(
        { "$text": { "$search": "\"[email protected]\""}},
        { "score": { "$meta": "textScore" } }
    ).sort({
        "score": { "$meta": "textScore" }, "Date": 1
    })
    

    したがって、当然のことながら、検索の関連性によって物事が正しくランク付けされるように、最初に「スコア」を並べ替え、次に「日付」で並べ替える必要があります。

    インデックスの順序は重要ではありませんが、もちろん、「1つの」テキストインデックスを持つことができます。したがって、作成する前に他のすべてを削除するようにしてください:

    db.collection.createIndex({ 
       "From": "text",
       "To": "text",
       "CC":"text", 
       "BCC": "text", 
       "Date":1
    })
    

    現在のインデックスを探します:

    db.collection.getIndicies()
    

    または、すべてを削除して最初からやり直してください:

    db.collection.dropIndexes()
    

    ただし、検索しているように見えるデータについては、各フィールドの通常の複合インデックスの方が適していると思います。 「メール」アドレスの検索は「完全一致」である必要があり、各フィールドに複数の項目が必要な場合は、次のように文字列の配列にする必要があります。

    {
        "TO": ["[email protected]"],
        "FROM": ["[email protected]"],
        "CC": ["[email protected]","[email protected]"],
        "BCC": [],
        "Date": ISODate("2015-07-27T13:42:05.535Z")
    }
    

    次に、各フィールドに個別のインデックスが必要です。おそらく、次のように「日付」と組み合わせて使用​​します。

    db.email.createIndex({ "TO": 1, "Date": 1 })
    db.email.createIndex({ "FROM": 1, "Date": 1 })
    db.email.createIndex({ "CC": 1, "Date": 1 })
    db.email.createIndex({ "BCC": 1, "Date": 1 })
    

    そして、 $ orでクエリを実行します 状態:

    db.email.find({
        "$or": [
            { "TO": "[email protected]" },
            { "FROM": "[email protected]" },
            { "CC": "[email protected]" },
            { "BCC": "[email protected]" }
        ],
        "Date": { "$lt": new Date() }
    })
    

    .explain(true)> それからの(詳細な)出力から、勝者の計画は、指定されたすべてのインデックスの「インデックスの共通部分」であることがわかります。すべてのフィールド(および選択されたインデックス)には完全一致値があり、インデックス付けされた日付に範囲が一致するため、これは非常に効率的です。

    これは、テキスト検索の「あいまい一致」よりもはるかに優れています。正規表現でさえ、ここでは一般的に(電子メールアドレスの場合)、特にそれらが「アンカー」されている場合は、より適切に機能するはずです ^ 文字列の先頭まで。

    テキストインデックスは「トークンのような単語」が一致するように意図されていますが、これはあなたのデータであってはなりません。 $または 見栄えは良くありませんが、はるかに優れた仕事をするはずです。




    1. MongoDBの集約パイプライン内にキャストデータを入力することは可能ですか?

    2. rmongodbを使用してRをリモートmongoDBに接続します

    3. MongoDBIDによる遅いクエリ

    4. 毎日のグループ化内のMongoDB集約