MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB:Как да направите текстово търсене и сортиране по дата

Независимо от други съставни индексни ключове, трябва да включите $meta за "textScore", за да получите правилното сортиране:

db.collection.find(
    { "$text": { "$search": "\"[email protected]\""}},
    { "score": { "$meta": "textScore" } }
).sort({
    "score": { "$meta": "textScore" }, "Date": 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) (подробен) изход от това, трябва да видите, че печелившият план е "индексна пресечна точка" на всички посочени индекси. Това се оказва много ефективно, тъй като всяко поле (и избран индекс) има стойност на точно съвпадение и съвпадение на диапазон на индексираната дата.

Това ще бъде много по-добре за вас от "размитото съвпадение" на текстови търсения. Дори регулярните изрази трябва да работят по-добре тук като цяло (за имейл адреси) и особено ако са "закотвени" ^ до началото на низа.

Текстовите индекси са предназначени за съвпадение на „думи като токени“, но това не трябва да са вашите данни. $or не изглежда добре, но трябва да върши много по-добра работа.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ще работят ли транзакциите с mongodb aggregation $merge?

  2. Схема за моделиране за приятели в mongoose?

  3. намерете идентификатора на последния поддокумент, вмъкнат в mongoose

  4. MongoDB Regex, индекс и производителност

  5. Как да кодирам MongoDB foreach Query в PHP