Questo è il quarto webinar della serie Back to Basics che ti offrirà un'introduzione al database MongoDB. Questo webinar guarda supporto all'indice full-text e il supporto geospaziale.
2. Massimo Brignoli
Principal Solution Architect, EMEA
massimo@mongodb.com
@massimobrignoli
Back to Basics 2016 : Webinar 4
Indicizzazione Avanzata
Indici Geografici e Testuali
3. Riassunto
• Webinar 1 – Introduzione a NoSQL
– I vari tipi di database NoSQL
– Che tipo di database è MongoDB
• Webinar 2 – La nostra prima applicazione
– Creare database e collection
– Operazioni CRUD
– Indici e Explain
• Webinar 3 – Schema Design
– Schema Dinamico
– Approcci all’incapsulamento
– Esempi
4. Indexing
• Un modo efficiente per ricercare dei dati usando il loro valore
• Evitare scansione completa di collection
1 2 3 4 5 6 7
7. Creazione di un Indice Semplice
db.coll.createIndex( { fieldName : <Direction> } )
Nome del Database
Nome della Collection
Comando
Nome del campo(i)
da indicizzare
Ascendente: 1
Discendente: -1
8. Altri due tipi di Indice
• Indice Full Text
– Permette la ricerca all’interno del testo di un campo (Lucene, Solr e
Elastic Search)
• Indice Geospaziale
– Permette la ricerca per posizione geografica (e.g. tutte le persone vicino
a me)
• Questi indici non usano Btree
9. Indici Full Text
• Un “inverted index” di tutte le parole contenute in un singolo campo (si
può creare solo un indice full text per ogni collection)
{ “comment” : “I think your blog post is very interesting
and informative. I hope you will post more
info like this in the future” }
>> db.posts.createIndex( { “comments” : “text” } )
MongoDB Enterprise > db.posts.find( { $text: { $search : "info" }} )
{ "_id" : ObjectId(“…"), "comment" : "I think your blog post is very interesting and informative. I hope you
will post more info like this in the future" }
MongoDB Enterprise >
11. Nel Log del Server
I INDEX [conn275] build index on: test.posts properties: { v: 1, key: {
_fts: "text", _ftsx: 1 }, name: "comment_text", ns: "test.posts",
weights: { comment: 1 }, default_language: "english",
language_override: "language", textIndexVersion: 3 }}
I INDEX [conn275] building index using bulk method
I INDEX [conn275] build index done. scanned 3 total records. 0
secs
13. Usare I Pesi
• Possiamo assegnare pesi diversi ai vari campi nell’indice
testuale
• Ad esempio posso voler favorire i tag rispetto ai commenti
• Quindi incremento il peso del campo tags
>> db.blog.createIndex( { comment: "text",
tags : "text” },
{ weights: { comment: 5,
tags : 10 }} )
• Ora la ricerca favorirà il campo tags
15. Altri Parametri
• Language : Scegli la lingua che vuoi usare in ricerca, ad
esempio:
– $language : Spanish
• Abilita la ricerca case sensitive
– $caseSensitive : True (default false)
• Supporta i caratteri accentati (diacritic sensitive search ad
esempio café è diverso da cafe )
– $diacriticSensitive : True (default false)
17. Indici Geospaziali
• MongoDB supporta indici sferici 2D
• Permette ad un utente di rappresentazione una posizione
sulla terra (approssimata ad una sfera)
• Le coordinate sono memorizzate in un formato GeoJSON
• L’indice geospaziale supporta un sottoinsieme
delle operazioni GeoJSON
• L’indice è basato su una rappresentazione
QuadTree
• L’indice è basato sullo standard WGS 84
18. Coordinate
• Le coordinate sono rappresentate con longitudine e latitudine
• longitudine
– Misurata dal meridiano di Greenwich a Londra (0 gradi). Le posizione ad
est arrivano fino a 180 gradi, mentre quelle ad ovest si esprimono con un
numero negativo
• Latitudine
– Misurata dall’equatore verso nord e sud (da 0 a 90 nord, da 0 a -90 sud)
• Le coordinate in MongoDB sono memorizzate con l’ordine
longitutine/latitudine
• Coordinate in Google sono memorizzate invertite
19. Versioni dell’Indice 2DSphere
• Versione 1 : prima di MongoDB 2.4
• Versione 2 : da MongoDB 2.6 in poi
• Versione 3 : da MongoDB 3.2 in poi
• Parlaremo solo della Versione 3 in questo webinar
20. Creare un Indice 2DSphere
db.collection.createIndex
( { <location field> : "2dsphere" } )
• Il campo di posizione deve contenere coordinate oppure una
struttura dati GeoJSON
23. Usiamo una Semplice Base Dati per Sperimentare le
Query Geografiche
• Cerchiamo i ristoranti a Manhattan
• Scarichiamo I dati di due collection
– https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/neighborhoods.json
– https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/restaurants.json
• Importiamole dentro MongoDB invocando da shell
– mongoimport –c neighborhoods –d geo neighborhoods.json
– mongoimport –c restaurants –d geo restaurants.json
27. Usiamo $geoIntersects per trovare I Quartieri
• Assumiamo di essere a -73.93414657, 40.82302903
• In quale quartiere siamo? Usiamo $geoIntersects
db.neighborhoods.findOne({ geometry:
{ $geoIntersects:
{ $geometry:
{ type: "Point",
coordinates:
[ -73.93414657,
40.82302903 ]}}}})
29. Troviamo I Ristoranti a 350m
db.restaurants.find({ location:
{ $geoWithin: { $centerSphere:
[ [ -73.93414657, 40.82302903 ], 0.35 / 6378.1 ]
} } })
Distanza in KM Dividete per il raggio
della terra per
convertire in radianti
31. Riassunto delle Operazioni
• $geoIntersect: Trova aree o punti che si sovrappongono o
sono adiaicenti
• $geoWithin: Trova aree che contengono un punto
• $geoNear: Restituisce le posizioni geografiche in ordine di
distanza crescente
32. Riassunto
• Text Indexes : Ricerca full text su tutti I campi testo di una
collection
• Geospatial Indexes : Ricerca per posizione, per intersezione o
per distanza a partire da un punto
33. Prossimo Webinar : Introduzione ad Aggregation
Framework
• Consente agli sviluppatori di
– Modificare, trasformare ed estrarre dati.
– Applicare funzioni analitiche standard, dai totali e le medie fino alla
deviazione standard.
• Lo vedrete in azione su un set di dati pubblici.
19 Luglio 2016, 11:00 CET.
Hinweis der Redaktion
Who I am, how long have I been at MongoDB.
Each item in a Btree node points to a sub-tree containing elements below its key value. Insertions require a read before a write. Writes that split nodes are expensive.