Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Start The Dialog

Start The Dialog

This presentation is about how we used MongoDB and ElasticSearch for our first big data project at goudengids.be. I gave this talk at Telenet Idealabs, at my first MongoDB Belgium Meetup.

Avatar for Dylan Honorez

Dylan Honorez

September 16, 2014
Tweet

Other Decks in Programming

Transcript

  1. Overview 1. MongoDB @ goudengids.be 2. The Campaign 3. Dialog

    v1.0 4. Behind the scenes 5. Benchmarking 6. Lessons learned
  2. enrichedListing.json db.businesses.findOne({'name.officialName.nameNL':'Truvo Belgium’}) { "_id" : ObjectId("524420db24ac9dc12bad8714"), "_class" : "com.truvo.ocapi.domain.business.Business",

    "address" : { "officialAddress" : [ { "resolved" : true, "coordinates" : { "latitude" : 51.21789235, "longitude" : 4.416003988 }, "language" : "DUTCH", "province" : "Antwerpen",
  3. Dataset {                

     "ns"  :  "OnlineContent.businesses",                  "count"  :  1.407.653,                  "size"  :  3.819.002.432,                  "avgObjSize"  :  2713.028304560854,                  "storageSize"  :  6137573376,                  "nindexes"  :  14,                  "paddingFactor"  :  1.0010000000744692,                  "totalIndexSize"  :  1016334032,                  "indexSizes"  :  {                                  "_id_"  :  62178480,                                  "businessId_1"  :  50862896,                                  "headings_1"  :  89911472,                                  "adverKser.adverKserId_1"  :  52113824,                                  "adverKser.status_1"  :  60412464,                                  "adverKser.vatNumber_1"  :  60935728,                                  "adverKser.language_1"  :  63364000,                                  "address.locality_1"  :  314203680,                                  "companyStats.employeeSize_1"  :  48287456,                                  "companyStats.financialResults.revenue_1"  :  49333984,                                                                                                                                ...                  }   }
  4. Aggregation Phase 1: $match {          

           $match:{                        advertiser.status:{  $in:[  "ACTIV",  "NEW"  ]  },                    address.officialAddress:{  $ne:  {  }  },                    headings:{  $in:[  ?,  …  ]  },          location:{  $in:  [  ?,  …  ]  },          …              }   }
  5. Aggregation Phase 2: $project          $project:{  

                         hasPhone:{  $cond:[  {  $and:[  {  $eq:[  "$phones",  {}]  },  {  $eq:[  "$mobiles",  {}  ]  }  ]  },  0,  1  ]  },                    hasEmail:{  $cond:[  {  $eq:[  "$emails",  {}  ]  },  0,  1  ]  },                    hasUrl:{  $cond:[  {  $eq:[  "$websites",  {}  ]  },  0,  1  ]  },                    hasEmailOrUrl:{  $cond:[  {  $and:[  {  $eq:[  "$emails",  {}]  },  {  $eq:[  "$websites",  {}  ]  }  ]  },  0,  1  ]  },                      hasAddress:{  $cond:[  {  $eq:[  "$address.officialAddress",  {}  ]  },  0,  1  ]  },                    advertiserNL:{  $cond:[  {  $eq:[  "$advertiser.language",  "DUTCH"  ]  },  1,  0  ]  },                    advertiserFR:{  $cond:[  {  $eq:[  "$advertiser.language",  "FRENCH"  ]  },  1,  0  ]  },                    hasContactPerson:{  $cond:[  {  $eq:[  "$companyStats.managers",  {}  ]  },  0,  1  ]  },                    hasEmployeeClass:{  $cond:[  {  $eq:[  "$companyStats.employeeSize",  null  ]  },  0,  1  ]  },                        hasRevenueClass:{  $cond:[  {  $eq:[  "$companyStats.financialResults.revenue",  null  ]  },  0,  1  ]  }              }
  6. Aggregation Phase 3: $group          $group:{  

                         _id:null,                    count:{  $sum:1  },                    withAddress:{  $sum:"$hasAddress"  },                    withPhone:{  $sum:"$hasPhone"  },                    withEmail:{  $sum:"$hasEmail"  },                    withUrl:{  $sum:"$hasUrl"  },                    withEmailOrUrl:{  $sum:"$hasEmailOrUrl"  },                    advertisersNL:{  $sum:"$advertiserNL"  },                    advertisersFR:{  $sum:"$advertiserFR"  },                    withContactPerson:{  $sum:"$hasContactPerson"  },                    withEmployeeClass:{  $sum:"$hasEmployeeClass"  },                    withRevenueClass:{  $sum:"$hasRevenueClass"  }              }
  7. Lessons learned find != $match null != [ ] !=

    missing $gte && $lte sort & limit in ES correlation count & retrieve