sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB:Jak provádět textové vyhledávání a řazení podle data

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.




  1. ID objektu nodejs mongodb na řetězec

  2. Chyba Express/Node.js:Reference Error:Res není definováno

  3. MongoDB Bound Queries:Jak převedu míli na radiány?

  4. Mongoengine je velmi pomalý na velkých dokumentech ve srovnání s nativním používáním pymongo