Upload
sebastien-prunier
View
524
Download
1
Embed Size (px)
DESCRIPTION
JugSummerCamp 2013 - Un backend NoSQL pour Geektic avec MongoDB : recherche full text et géolocalisation
Citation preview
Un backend NoSQL pour Geektic avec MongoDBJug Summer Camp 2013 - La Rochelle
Sébastien PRUNIER - @sebprunierJérôme CREIGNOU - @jcreignou
Geektic● Site de rencontre pour les geeks en
conférence :-)● Développé par la team “Code Story” lors de
Devoxx France 2013● Backend = local-geeks.json
https://github.com/CodeStory/code-story-geektic
Geektic● Inscription via Twitter
MongoDB● Base de données NoSQL, orientée
Document● Stockage JSON
{ "nom": "Zuckerberg", "prenom": "Mark", "email": "[email protected]", "ville": "Palo Alto", "likes": ["Facebook", "Tongues", "PHP"], "hate1": "Tyler Winklevoss", "hate2": "Cameron Winklevoss"}
MongoDB 2.4Principales nouveautés● Text Search (beta)● GeoSpatial Indexes
○ GeoJSON○ Spherical Geometry
● Hashed Indexes○ Hashed Shard Keys
Step 1 - Load Geeks● Script de chargement des geeks dans la
base Mongo● Node.js
○ Léger, simple, JSON○ Driver pour Mongo○ On aime bien :-)
Step 1 - Load Geeks
var geeks = require('../../web/geeks.json'); ...
db.collection('geeks', function (err, collection) { if (err) { … } collection.insert(geeks, function (err, result) { console.log(result.length + ' geek(s) inserted !'); }); });
Step 2 - Backend Mongo● Branchement du backend sur la base Mongo● Utilisation de Jongo
○ “Comme si on était dans le shell”
geeks.find("{ 'likes' : {$in : #} }", keywords).as(Geek.class)
Testing● To Mock or Not To Mock ?● embedmongo-maven-plugin
○ pre-integration-tests : start mongo○ post-integration-tests : stop mongo
http://antoniogoncalves.org/2012/11/27/launching-the-nomock-movement/
Step 2 - Backend Mongo
Regression detected !!● Sensibilité à la casse
○ Java ~ java
● Une piste : regexp
db.geeks.find({likes : /tests/i})
Index & Performance
Step 3 - Text Search● Indexes de type “text”
db.geeks.ensureIndex({likes: 'text'})
● Requêtes○ OR : scala groovy○ PHRASE : “coder en java”○ NOT : java -scala
db.geeks.runCommand( "text", { search: "java -scala" } )
Step 3 - Text Search● Support des langues
○ code ~ codingdb.geeks.runCommand("text", {search: "code", language:
"english"})
● Pertinence des résultats (Scoring)
"results" : [{ "score" : 1.1, "obj" : { … } },
{ "score" : 0.75, "obj" : { … } }, { "score" : 0.75, "obj" : { … } } ]
Step 4 - Geo Localisation● Index géospatial
○ < 2.4 : “2d”○ >= 2.4 : “2dsphere”
db.geeks.ensureIndex( { location : "2dsphere" } )
vs.
Step 4 - Geo Localisation● GeoJSON
○ Point○ LineString○ Polygon
● Opérateurs○ $geoWithin○ $near○ $geoIntersect
http://geojson.org/geojson-spec.html
Kandinsky
Step 4 - Geo Localisation● Ajout des données géographiques pour les
geeks déjà présents dans la base○ Encore du Node.js :-)
var gm = require('googlemaps'); ...
gm.geocode(geek.ville, function (err, villes) { // enrich geek });
Step 4 - Geo Localisation● Requête simple
○ “Rechercher les geeks proches de Paris dans un rayon de 10 km”
db.geeks.find({ location : { $near : { $geometry : { type : "Point", coordinates : [2.35, 48.853] }, $maxDistance : 10000 } } })
Step 4 - Geo Localisation● Aggregation Framework
○ “Regrouper les geeks par affinité, se situant à La Rochelle dans un rayon de 2 km”
$unwind $group$near
The endMerci pour votre attention !
● Questions ?● Réponses !● Let’s tweet !!