MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Elasticsearch vs. MongoDB zum Filtern von Anwendungen

Zunächst einmal ist hier eine wichtige Unterscheidung zu treffen:MongoDB ist eine universelle Datenbank, Elasticsearch ist eine verteilte Textsuchmaschine, die von Lucene unterstützt wird. Die Leute haben darüber gesprochen, Elasticsearch als Allzweckdatenbank zu verwenden, wissen aber, dass dies nicht das ursprüngliche Design war. Ich denke, dass Allzweck-NoSQL-Datenbanken und -Suchmaschinen auf eine Konsolidierung zusteuern, aber so wie es aussieht, kommen die beiden aus zwei sehr unterschiedlichen Lagern.

Wir verwenden in meinem Unternehmen sowohl MongoDB als auch Elasticsearch. Wir speichern unsere Daten in MongoDB und verwenden Elasticsearch ausschließlich für seine Volltextsuchfunktionen. Wir senden nur eine Teilmenge der Mongo-Datenfelder, die wir zum Abfragen an Elastic benötigen. Unser Anwendungsfall unterscheidet sich von Ihrem darin, dass sich unsere Mongo-Daten ständig ändern:Ein Datensatz oder eine Teilmenge der Felder eines Datensatzes kann mehrmals am Tag aktualisiert werden, und dies kann eine Neuindizierung dieses Datensatzes in Elastic erfordern. Allein aus diesem Grund ist die Verwendung von Elastic als alleiniger Datenspeicher keine gute Option für uns, da wir ausgewählte Felder nicht aktualisieren können. wir müssten ein Dokument in seiner Gesamtheit neu indizieren. Dies ist keine elastische Einschränkung, so funktioniert Lucene, die zugrunde liegende Suchmaschine hinter elastisch. In Ihrem Fall erspart Ihnen die Tatsache, dass Datensätze nach dem Speichern nicht mehr geändert werden, diese Entscheidung. Wenn die Datensicherheit jedoch ein Problem darstellt, würde ich es mir zweimal überlegen, ob ich Elasticsearch als einzigen Speichermechanismus für Ihre Daten verwenden sollte. Es kann irgendwann dort ankommen, aber ich bin mir noch nicht sicher, ob es da ist.

In Bezug auf die Geschwindigkeit ist Elastic/Lucene nicht nur auf Augenhöhe mit der Abfragegeschwindigkeit von Mongo, in Ihrem Fall, wo es "sehr wenig Konstante in Bezug darauf gibt, welche Felder zu jedem Zeitpunkt für die Filterung verwendet werden", könnte es sich um Bestellungen handeln Größenordnung schneller, insbesondere wenn die Datensätze größer werden. Der Unterschied liegt in den zugrunde liegenden Abfrageimplementierungen:

  • Elastic/Lucene verwenden das Vektorraummodell und invertierte Indizes zum Abrufen von Informationen, die hocheffiziente Methoden zum Vergleichen von Datensatzähnlichkeiten mit einer Abfrage darstellen. Wenn Sie Elastic/Lucene fragen, kennt es die Antwort bereits; Der größte Teil seiner Arbeit besteht darin, die Ergebnisse für Sie nach den Ergebnissen zu ordnen, die am wahrscheinlichsten mit Ihren Suchbegriffen übereinstimmen. Dies ist ein wichtiger Punkt:Suchmaschinen können Ihnen im Gegensatz zu Datenbanken keine genauen Ergebnisse garantieren; Sie ordnen die Ergebnisse danach, wie nah sie Ihrer Suchanfrage kommen. Es kommt einfach so vor, dass die Ergebnisse meistens ziemlich genau sind.
  • Mongos Ansatz ist der eines allgemeineren Datenspeichers; es vergleicht JSON-Dokumente miteinander. Sie können auf jeden Fall eine hervorragende Leistung erzielen, aber Sie müssen Ihre Indizes sorgfältig erstellen, damit sie mit den Abfragen übereinstimmen, die Sie ausführen werden. Insbesondere wenn Sie mehrere Felder für die Abfrage haben, müssen Sie Ihre zusammengesetzten Schlüssel sorgfältig erstellen, damit sie den abgefragten Datensatz so schnell wie möglich reduzieren. Z.B. Ihr erster Schlüssel sollte den Großteil Ihres Datensatzes herausfiltern, Ihr zweiter sollte weiter nach unten filtern, was noch übrig ist, und so weiter und so fort. Wenn Ihre Abfragen nicht mit den Schlüsseln und der Reihenfolge dieser Schlüssel in den definierten Indizes übereinstimmen, wird Ihre Leistung erheblich sinken. Auf der anderen Seite ist Mongo eine echte Datenbank. Wenn Sie also Genauigkeit brauchen, werden die Antworten genau richtig sein.

Für auslaufende alte Datensätze hat Elastic eine eingebaute TTL-Funktion. Mongo hat es, glaube ich, erst ab Version 2.2 eingeführt.

Da ich Ihre anderen Anforderungen wie erwartete Datengröße, Transaktionen, Genauigkeit oder das Aussehen Ihrer Filter nicht kenne, ist es schwierig, konkrete Empfehlungen zu geben. Hoffentlich gibt es hier genug, um Ihnen den Einstieg zu erleichtern.