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

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