Bez ohledu na jiné složené indexové klíče musíte zahrnout $meta
pro "textScore", abyste získali správné řazení:
db.collection.find(
{ "$text": { "$search": "\"[email protected]\""}},
{ "score": { "$meta": "textScore" } }
).sort({
"score": { "$meta": "textScore" }, "Date": 1
})
Přirozeně tedy chcete, aby se toto „skóre“ nejprve seřadilo a poté podle „Datum“, aby bylo možné věci správně seřadit podle relevance vyhledávání.
Na pořadí indexu nezáleží, ale samozřejmě můžete mít „jeden“ textový index. Před vytvořením se tedy ujistěte, že jste vypustili všechny ostatní:
db.collection.createIndex({
"From": "text",
"To": "text",
"CC":"text",
"BCC": "text",
"Date":1
})
Hledejte indexy, které jsou aktuální s:
db.collection.getIndicies()
Nebo prostě všechno zahoďte a začněte znovu:
db.collection.dropIndexes()
Pokud jde o data, která podle všeho vyhledáváte, myslel bych si, že by vám lépe vyhovoval pravidelný složený index na každém poli. Hledání „e-mailových“ adres by mělo odpovídat „přesné shodě“ a pokud očekáváte více položek pro každé pole, pak by to měly být pole řetězců, například:
{
"TO": ["[email protected]"],
"FROM": ["[email protected]"],
"CC": ["[email protected]","[email protected]"],
"BCC": [],
"Date": ISODate("2015-07-27T13:42:05.535Z")
}
Pak potřebujete samostatné indexy pro každé pole, případně ve složení s "Datem" takto:
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 })
A dotazujte pomocí $or
podmínka:
db.email.find({
"$or": [
{ "TO": "[email protected]" },
{ "FROM": "[email protected]" },
{ "CC": "[email protected]" },
{ "BCC": "[email protected]" }
],
"Date": { "$lt": new Date() }
})
Pokud se podíváte na .explain(true)
(podrobný) výstup z toho, měli byste vidět, že vítězný plán je "průnikem indexů" všech zadaných indexů. To se ukazuje jako velmi efektivní, protože každé pole (a vybraný index) má přesnou hodnotu shody a shodu rozsahu v indexované datum.
To pro vás bude mnohem lepší než „fuzzy párování“ textových vyhledávání. I regulární výrazy by zde obecně měly fungovat lépe (pro e-mailové adresy) a zvláště pokud jsou "ukotveny" ^
na začátek řetězce.
Textové indexy jsou určeny k tomu, aby se "slovo podobné tokeny" shodovaly, ale neměly by to být vaše data. $or
nevypadá hezky, ale měl by dělat mnohem lepší práci.