Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

50
MongoDB Europe 2016 MongoDB Europe 2016 Old Billingsgate, London Old Billingsgate, London 15. November 15. November Mit meinem Code Mit meinem Code benjaminlorenz benjaminlorenz 20 20 sind sind Ihre Tickets 20 % günstiger! Ihre Tickets 20 % günstiger! mongodb.com/europe mongodb.com/europe

Transcript of Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

Page 1: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 2: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

Back to Basics 2016 : Webinar 4

Indizierung für Fortgeschrittene: Text- und Geoindizes

Benjamin LorenzSenior Solutions Architect, MongoDB Frankfurt

@benjaminlorenz

V1.1

Page 3: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 4: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

4

Indizierung

• Eine effiziente Methode, Daten über ihren Wert zu finden• Vermeidet das Durchsuchen ganzer Tabellen

Page 5: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

5

Herkömmliche Datenbanken nutzen B-Bäume

• MongoDB auch!

Page 6: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

6

Komplexität O(log (n)) für select, insert & delete

Page 7: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 8: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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.

Page 9: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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 >

Page 10: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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}

Page 11: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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}

Page 12: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

}

Page 13: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 14: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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" } )>>

Page 15: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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.

Page 16: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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 }>>

Page 17: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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)

Page 18: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

Geoindizes

Page 19: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und 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.

Page 20: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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.

Page 21: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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.

Page 22: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

22

Erstellen eines sphärischen 2D-Index

db.collection.createIndex ( { <location field> : "2dsphere" } )

•Das „location field“ muss Koordinaten oder GeoJSON-Daten enthalten.

Page 23: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

23

Beispiel

>> db.test.createIndex( { loc : "2dsphere" } ){

"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1

}

Page 24: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

24

Ergebnis

>> db.test.getIndexes()[

{"v" : 1,"key" : {

"loc" : "2dsphere"},"name" : "loc_2dsphere","ns" : "geo.test","2dsphereIndexVersion" : 3

}]>>

Page 25: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 26: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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"

}

Page 27: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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.

Page 28: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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 >

Page 29: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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 ]}}}})

Page 30: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

30

Ergebnisse

{"geometry" : {

”coordinates" : [[

-73.9338307684026,40.81959665747723

], ...

[-73.93383000695911,40.81949109558767

] ]

"type" : "Polygon"},"name" : "Central Harlem North-Polo Grounds"

}

Page 31: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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.

Page 32: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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" }

Page 33: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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)

Page 34: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 35: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

35

Frage- und Antwortrunde

Page 36: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Page 37: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

37

• Platzhaltertext

Page 38: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Page 39: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Page 40: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Page 41: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

41

Page 42: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

42

Page 43: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

LOREM IPSUM

LOREM IPSUM

LOREM IPSUM

LOREM IPSUM

Sollicitudin VenenatisLOREM IPSUM

LOREM IPSUM

LOREM IPSUM

LOREM IPSUM

Grafische Elemente (Beispiele)

Page 44: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

Porta Ultricies

Commodo Porta

Diagramme (Beispiele)

Page 45: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Page 46: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

{ _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)

Page 47: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 48: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 49: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

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

Page 50: Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes

Rettungsring RSS Skalierbarkeit Waage Sekundärindex Lenkrad

Stopuhr Textsuche Tick-Daten Schulung Funkturm Trophäe

Frau Welt