back to basics – webinar 4: fortschrittliche indizierung, text- und geoindizes

Post on 14-Apr-2017

229 Views

Category:

Data & Analytics

0 Downloads

Preview:

Click to see full reader

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

top related