back to basics – webinar 4: fortschrittliche indizierung, text- und geoindizes
TRANSCRIPT
MongoDB Europe 2016MongoDB Europe 2016Old Billingsgate, LondonOld Billingsgate, London
15. November15. November
Mit meinem Code Mit meinem Code benjaminlorenzbenjaminlorenz2020 sind sind Ihre Tickets 20 % günstiger!Ihre Tickets 20 % günstiger!
mongodb.com/europemongodb.com/europe
Back to Basics 2016 : Webinar 4
Indizierung für Fortgeschrittene: Text- und Geoindizes
Benjamin LorenzSenior Solutions Architect, MongoDB Frankfurt
@benjaminlorenz
V1.1
3
Rückblick
• Webinar 1: Einführung in NoSQL– Verschiedene Typen von NoSQL-Datenbanken– MongoDB ist eine Dokumentendatenbank.
• Webinar 2: Ihre erste MongoDB-Anwendung– Erstellen von Datenbanken und Collections– Erstellen, Lesen, Ändern und Löschen von Daten– Indizes und explain()
• Webinar 3: Schema-Design– Dynamische Schemata– Einbettung von Dokumenten– Beispiele
4
Indizierung
• Eine effiziente Methode, Daten über ihren Wert zu finden• Vermeidet das Durchsuchen ganzer Tabellen
5
Herkömmliche Datenbanken nutzen B-Bäume
• MongoDB auch!
6
Komplexität O(log (n)) für select, insert & delete
7
Erstellen eines einfachen Index
db.coll.createIndex( { fieldName : <Direction> } )
Name der Datenbank
Name der Collection
Befehl
Name des zu indizierenden Feldes
aufsteigend: 1 absteigend: -1
8
Zwei Arten von Indizes
• Volltextindex– ermöglicht das Durchsuchen des in einem Feld enthaltenen Texts
(Lucene, Solr und Elasticsearch)• Geoindex
– ermöglicht die Suche nach Standort (z. B. Leute in meiner Nähe)• Diese Indizes nutzen keine B-Bäume.
9
Volltextindizes
• Ein „invertierter Index“ für alle Wörter in einem Feld (nur ein Textindex je Collection)
{ “comment” : “Ich finde Ihren Blogbeitrag sehr interessant und nützlich. Ich hoffe, dass Sie mehr solche Beiträge veröffentlichen.” }
>> db.posts.createIndex( { “comments” : “text” } )
MongoDB Enterprise > db.posts.find( { $text: { $search : “beitrag" }} ){ "_id" : ObjectId(“…"), "comment" : “Ich finde Ihren Blogbeitrag sehr
interessant und nützlich. Ich hoffe, dass Sie mehr solche Beiträge veröffentlichen.” }
MongoDB Enterprise >
10
Ergebnisse
MongoDB Enterprise > db.posts.getIndexes()...
{"v" : 1,"key" : {"_fts" : "text","_ftsx" : 1},"name" : "comment_text","ns" : "test.posts","weights" : {"comment" : 1},"default_language" : "english","language_override" : "language","textIndexVersion" : 3}
11
Löschen von Textindizes
• Zum Löschen eines Index wird der Indexname benötigt.db.posts.getIndexes()
{"v" : 1,"key" : {"_fts" : "text","_ftsx" : 1},"name" : "comment_text","ns" : "test.posts","weights" : {"comment" : 1},"default_language" : "english","language_override" : "language","textIndexVersion" : 3}
12
Also
MongoDB Enterprise > db.posts.dropIndex( "comment_text" ){ "nIndexesWas" : 2, "ok" : 1 }MongoDB Enterprise >
•Sie können Indizes Namen geben:
MongoDB Enterprise > db.posts.createIndex( { "comments" : "text“ }, { "name" : "text_index" } ){
"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1
}
13
Auf dem 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 methodI INDEX [conn275] build index done. scanned 3 total records. 0 secs
14
Ein ausführlicheres Beispiel
>> db.posts.insert( { "comment" : "Rot gelb orange gruen" } )>> db.posts.insert( { "comment" : "Pink lila blau" } )>> db.posts.insert( { "comment" : "Rot Pink" } )
>> db.posts.find( { "$text" : { "$search" : "Rot" }} ){ "_id" : ObjectId(“…”), "comment" : "Rot gelb orange gruen" } ){ "_id" : ObjectId( »…"), "comment" : "Rot Pink" } )>> db.posts.find( { "$text" : { "$search" : "Rot Gruen" }} ){ "_id" : ObjectId(« …"), "comment" : "Rot Pink" } ){ "_id" : ObjectId(« …"), "comment" : "Rot gelb orange gruen" } )>> db.posts.find( { "$text" : { "$search" : "rot" }} ) # <- Case Insensitve{ "_id" : ObjectId(“…"), "comment" : "Rot gelb orange gruen" } ){ "_id" : ObjectId(«…”), "comment" : "Rot Pink" } )>>
15
Gewichtung
• Wir können verschiedenen Feldern in einem Textindex verschiedene Gewichtungen zuweisen.
• Wenn ich z. B. primär nach Tags und weniger nach Kommentaren suche, weise ich dem Tag-Feld eine höhere Gewichtung zu.
>> db.blog.createIndex( { comment: "text", tags : "text” }, { weights: { comment: 5, tags : 10 }} )• Jetzt werden Tags bei Suchvorgängen bevorzugt behandelt.
16
$textscore
• Die Gewichtung wirkt sich auf $textscore aus:
>> db.posts.find( { "$text" : { "$search" : "Rot" }}, { score: { $meta: "textScore" }} ).sort( { score: { $meta: "textScore" } } )
{ "_id" : …, "comment" : "hallo", "tags" : "Rot gruen orange", "score" : 6.666666666666666 }
{ "_id" : …, "comment" : "Rot Pink", "score“ : 3.75 }{ "_id" : …, "comment" : "Rot gelb orange gruen", "score“ : 3.125 }>>
17
Weitere Parameter
• Berücksichtigen der Groß- und Kleinschreibung bei der Suche:– $caseSensitive : true (default false)
• Berücksichtigen von Umlauten und Buchstaben mit Akzenten:– $diacriticSensitive : True (default false)
Geoindizes
19
Geoindizes
• MongoDB unterstützt Indizes, die auf zweidimensionalen sphärischen Koordinaten basieren (sphärische 2D-Indizes).
• Damit können Punkte auf der Erde abgebildet werden.• Die Koordinaten werden im Format GeoJSON gespeichert.• Geoindizes unterstützen einen Teil der Operationen
in GeoJSON.• Der Index wird als Quadtree gespeichert.• Er entspricht dem Standard WGS 84.
20
Koordinaten
• Koordinaten repräsentieren den Längen- und Breitengrad eines Orts.• Längengrad
– Position östlich oder westlich des durch Greenwich (London) verlaufenden Nullmeridians
– Positiver Längengrad (bis 180°): Position östlich von Greenwich; negativer Längengrad: Position westlich von Greenwich
• Breitengrad– Position nördlich (0 bis 90°) oder südlich des Äquators (0 bis -90°)
• MongoDB speichert Koordinaten als Längengrad/Breitengrad.• Google speichert Koordinaten als Breitengrad/Längengrad.
21
Versionen des sphärischen 2D-Index
• In MongoDB gibt es drei Versionen des sphärischen 2D-Index:
• Version 1: bis MongoDB 2.4• Version 2: ab MongoDB 2.6• Version 3: ab MongoDB 3.2• In diesem Webinar beschränken wir uns auf Version 3.
22
Erstellen eines sphärischen 2D-Index
db.collection.createIndex ( { <location field> : "2dsphere" } )
•Das „location field“ muss Koordinaten oder GeoJSON-Daten enthalten.
23
Beispiel
>> db.test.createIndex( { loc : "2dsphere" } ){
"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1
}
24
Ergebnis
>> db.test.getIndexes()[
{"v" : 1,"key" : {
"loc" : "2dsphere"},"name" : "loc_2dsphere","ns" : "geo.test","2dsphereIndexVersion" : 3
}]>>
25
Standortbasierte Anfragen – ein Beispiel mit zwei einfachen Collections
• Wir suchen ein Restaurant in Manhattan.• Zwei Collections stehen zur Auswahl:
– https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/neighborhoods.json– https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/restaurants.json
• Wir importieren sie in MongoDB:– mongoimport –c neighborhoods –d geo neighborhoods.json– mongoimport –c restaurants –d geo restaurants.json
26
Die Collection „Neighborhood“ (Stadtteil)
MongoDB Enterprise > db.neighborhoods.findOne(){
"_id" : ObjectId("55cb9c666c522cafdb053a1a"),"geometry" : {
"coordinates" : [[
[-73.94193078816193,40.70072523469547
], ...
[-73.94409591260093,40.69897295461309
], ]
"type" : "Polygon"},"name" : "Bedford"
}
27
Die Collection „Restaurants“
MongoDB Enterprise > db.restaurants.findOne(){
"_id" : ObjectId("55cba2476c522cafdb053adf"),"location" : {
"coordinates" : [-73.98241999999999,40.579505
],"type" : "Point"
},"name" : "Riviera Caterer"
}MongoDB Enterprise >
Sie können diese Koordinaten in Google Maps eingeben. Denken Sie
daran, dass der Längengrad bei MongoDB die erste und bei Google die
zweite der beiden Koordinaten ist.
28
Hinzufügen von Indizes
MongoDB Enterprise > db.restaurants.createIndex({ location: "2dsphere" }){
"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1
}MongoDB Enterprise > db.neighborhoods.createIndex({ geometry: "2dsphere" }){
"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1
}MongoDB Enterprise >
29
Ermitteln des Stadtteils mit $geoIntersects
• Nehmen wir an, unsere Koordinaten seien -73.93414657, 40.82302903.• In welchem Stadtteil sind wir? Das zeigt uns $geoIntersects
db.neighborhoods.findOne({ geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ]}}}})
30
Ergebnisse
{"geometry" : {
”coordinates" : [[
-73.9338307684026,40.81959665747723
], ...
[-73.93383000695911,40.81949109558767
] ]
"type" : "Polygon"},"name" : "Central Harlem North-Polo Grounds"
}
31
Alle Restaurants im Umkreis von 0,35 km
db.restaurants.find({ location: { $geoWithin: { $centerSphere: [ [ -73.93414657, 40.82302903 ], 5 / 6,378.1 ] } } })
Entfernung in km
Teilen Sie die Entfernung durch den
Erdradius, um den Wert im Bogenmaß zu
erhalten.
32
Ergebnisse (Projektion)
{ "name" : "Gotham Stadium Tennis Center Cafe" }{ "name" : "Chuck E. Cheese'S" }{ "name" : "Red Star Chinese Restaurant" }{ "name" : "Tia Melli'S Latin Kitchen" }{ "name" : "Domino'S Pizza" }
•Ohne Projektion
{ "_id" : ObjectId("55cba2476c522cafdb0550aa"), "location" : { "coordinates" : [ -73.93795159999999, 40.823376 ], "type" : "Point" }, "name" : "Domino'S Pizza" }
33
Operatoren im Überblick
• $geoIntersect: Findet Gebiete oder Punkte, die aneinander grenzen oder einander überlappen
• $geoWithin: Findet Gebiete oder Punkte, die in einem bestimmten Gebiet liegen
• $geoNear: Zeigt Orte nach Entfernung von einem bestimmten Punkt sortiert an (nächster Ort zuerst)
34
Indizes im Überblick
• Textindizes: Ermöglichen das Durchsuchen von Textfeldern in einer Collection
• Geoindizes: Ermöglichen die Suche nach Koordinaten, einer Überlappung oder der Entfernung von einem bestimmten Punkt
35
Frage- und Antwortrunde
37
• Platzhaltertext
41
42
LOREM IPSUM
LOREM IPSUM
LOREM IPSUM
LOREM IPSUM
Sollicitudin VenenatisLOREM IPSUM
LOREM IPSUM
LOREM IPSUM
LOREM IPSUM
Grafische Elemente (Beispiele)
Porta Ultricies
Commodo Porta
Diagramme (Beispiele)
{ _id : ObjectId("4c4ba5e5e8aabf3"), employee_name: "Dunham, Justin", department : "Marketing", title : "Product Manager, Web", report_up: "Neray, Graham", pay_band: “C", benefits : [ { type : "Health", plan : "PPO Plus" }, { type : "Dental", plan : "Standard" }
] }
Code/Hervorhebung (Beispiele)
Aggregation Framework Flexibilität Backup Big Data Aktenkoffer
Gebäude Business Intelligence Kamera Kasse Katalog
Chat Häkchen Häkchen Cloud Geschäftsvertrag
Computer Inhalt Kont. Entwicklung Kreditkarte Kundenerfolg
Rechenzentrum Datenvielfalt Datengeschwindigkeit Datenvolumen Data Warehouse Datenbank
Dialog Ordner Dokumente Downloads Treiber Dynamisches Schema
EDW-Integration Schnellere Marktreife Dateitransfer Flexibel Zahnrad Hadoop
Zustandsprüfung Hochverfügbarkeit Horizontale Skalierung Integration in eine Infrastruktur
Internet der Dinge Schrittweise Entwicklung
Rettungsring Diagramm Schloss Logdatei Niedrigere Kosten Lupe
Mann Handy Messgerät Überwachung Musik Neue Aps
Neue Datentypen Online Open Source Fallschirm Personalisierung Markiernadel
Plattform-Zertifizierung Produktkatalog Puzzleteile RDBMS Echtzeit-Analysen Anspruchsvolle Fragen
Rettungsring RSS Skalierbarkeit Waage Sekundärindex Lenkrad
Stopuhr Textsuche Tick-Daten Schulung Funkturm Trophäe
Frau Welt