他の複合インデックスキーに関係なく、を含める必要があります $ 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)
>
それからの(詳細な)出力から、勝者の計画は、指定されたすべてのインデックスの「インデックスの共通部分」であることがわかります。すべてのフィールド(および選択されたインデックス)には完全一致値があり、インデックス付けされた日付に範囲が一致するため、これは非常に効率的です。
これは、テキスト検索の「あいまい一致」よりもはるかに優れています。正規表現でさえ、ここでは一般的に(電子メールアドレスの場合)、特にそれらが「アンカー」されている場合は、より適切に機能するはずです ^
文字列の先頭まで。
テキストインデックスは「トークンのような単語」が一致するように意図されていますが、これはあなたのデータであってはなりません。 $または
見栄えは良くありませんが、はるかに優れた仕事をするはずです。