wake-up-neo.com

Gibt es Gründe, warum Sie die integrierte Volltextsuche von PostgreSQL auf Heroku nicht verwenden sollten?

Ich bereite die Bereitstellung einer Rails-App auf Heroku vor, für die eine Volltextsuche erforderlich ist. Ich habe es bisher auf einem VPS mit MySQL mit Sphinx ausgeführt.

Wenn ich jedoch Sphinx oder Solr für Heroku verwenden möchte, muss ich für ein Add-On bezahlen.

Ich stelle fest, dass PostgreSQL (die bei Heroku verwendete Datenbank) über eine integrierte Volltextsuche verfügt.

Gibt es einen Grund, warum ich die Volltextsuche von Postgres nicht verwenden konnte? Ist es langsamer als die Sphinx oder gibt es eine andere wesentliche Einschränkung?

54
Ethan

Edit, 2016 - Warum nicht beides?

Wenn Sie sich für Postgres vs. Lucene interessieren, warum nicht beides? Schauen Sie sich die Erweiterung ZomboDB für Postgres an, die Elasticsearch als erstklassigen Indextyp integriert. Noch ein recht frühes Projekt, aber es sieht für mich sehr vielversprechend aus.

(Technisch nicht auf Heroku verfügbar, aber immer noch einen Blick wert.)


Offenlegung: Ich bin Mitbegründer der Websolr und Bonsai Heroku-Add-Ons, daher ist meine Perspektive ein wenig voreingenommen gegenüber Lucene.

Ich lese in der Volltextsuche von Postgres, dass sie für einfache Anwendungsfälle ziemlich solide ist. Es gibt jedoch eine Reihe von Gründen, warum Lucene (und damit auch Solr und ElasticSearch) sowohl in Bezug auf Leistung als auch Funktionalität überlegen ist.

Für den Anfang bietet jpountz eine wirklich hervorragende technische Antwort auf die Frage: Warum ist Solr so viel schneller als Postgres? Es lohnt sich ein paar Mal durchzulesen, um wirklich zu verdauen.

Ich kommentierte auch eine letzte RailsCast-Episode die relativen Vor- und Nachteile der Postgres-Volltextsuche im Vergleich zu Solr. Lassen Sie mich das hier zusammenfassen:

Pragmatische Vorteile für Postgres

  • Verwenden Sie einen bereits vorhandenen Dienst, den Sie bereits ausführen, anstatt etwas anderes einzurichten und zu warten (oder dafür zu bezahlen).
  • Dem ungeheuer langsamen SQL-Operator LIKE weit überlegen.
  • Weniger Aufwand für die Synchronisierung der Daten, da sich alle in derselben Datenbank befinden - keine Integration auf Anwendungsebene mit einer externen API für Datendienste.

Vorteile für Solr (oder ElasticSearch)

Von meinem Kopf aus, in keiner bestimmten Reihenfolge…

  • Skalieren Sie Ihre Indizierungs- und Suchlast getrennt von Ihrer regulären Datenbanklast.
  • Flexiblere Ausdrucksanalyse für Akzent-Normalisierung, sprachliches Stemming, N-Gramm, Entfernen von Markierungen… Weitere coole Funktionen wie Rechtschreibprüfung, "Rich Content" (z. B. PDF und Word) ...
  • Solr/Lucene kann alles auf der Postgres-Volltextsuch-TODO-Liste machen.
  • Viel besseres und schnelleres Ranking der Term-Relevanz, effizient an Suchzeiten anpassbar.
  • Wahrscheinlich schnellere Suchleistung für häufig verwendete Begriffe oder komplizierte Abfragen.
  • Vermutlich effizientere Indexierungsleistung als Postgres.
  • Bessere Toleranz für Änderungen in Ihrem Datenmodell durch Entkopplung der Indizierung vom primären Datenspeicher

Ich glaube eindeutig, dass eine dedizierte Suchmaschine, die auf Lucene basiert, die bessere Option ist. Grundsätzlich kann man sich Lucene als das de facto Open Source Repository für Suchexperten vorstellen.

Wenn Ihre einzige andere Option jedoch der Operator LIKE ist, ist die Volltextsuche von Postgres definitiv ein Gewinn.

60
Nick Zadrozny

Da ich mich gerade bemüht habe, die elastische Suche (1,9) mit Postgres-FTS zu vergleichen, dachte ich, ich sollte meine Ergebnisse teilen, da sie etwas aktueller sind als die von @gustavodiazjaimes.

Meine Hauptsorge bei Postgres war, dass es keine Facettierung gab, aber es ist trivial, sich selbst zu bauen, hier ist mein Beispiel (in Django):

results = YourModel.objects.filter(vector_search=query)
facets = (results
    .values('book')
    .annotate(total=Count('book'))
    .order_by('book'))

Ich verwende Postgres 9.6 und Elastic-Search 1.9 (durch Heuhaufen auf Django). Hier ist ein Vergleich zwischen Elasticsearch und Postgres über 16 verschiedene Arten von Abfragen.

    es_times  pg_times  es_times_faceted  pg_times_faceted
0   0.065972  0.000543          0.015538          0.037876
1   0.000292  0.000233          0.005865          0.007130
2   0.000257  0.000229          0.005203          0.002168
3   0.000247  0.000161          0.003052          0.001299
4   0.000276  0.000150          0.002647          0.001167
5   0.000245  0.000151          0.005098          0.001512
6   0.000251  0.000155          0.005317          0.002550
7   0.000331  0.000163          0.005635          0.002202
8   0.000268  0.000168          0.006469          0.002408
9   0.000290  0.000236          0.006167          0.002398
10  0.000364  0.000224          0.005755          0.001846
11  0.000264  0.000182          0.005153          0.001667
12  0.000287  0.000153          0.010218          0.001769
13  0.000264  0.000231          0.005309          0.001586
14  0.000257  0.000195          0.004813          0.001562
15  0.000248  0.000174          0.032146          0.002246
                  count      mean       std       min       25%       50%       75%       max
es_times           16.0  0.004382  0.016424  0.000245  0.000255  0.000266  0.000291  0.065972
pg_times           16.0  0.000209  0.000095  0.000150  0.000160  0.000178  0.000229  0.000543
es_times_faceted   16.0  0.007774  0.007150  0.002647  0.005139  0.005476  0.006242  0.032146
pg_times_faceted   16.0  0.004462  0.009015  0.001167  0.001580  0.002007  0.002400  0.037876

Um Postgres für facettierte Suchvorgänge auf diese Geschwindigkeiten zu bringen, musste ich einen GIN-Index für das Feld mit einem SearchVectorField verwenden, das Django-spezifisch ist.

Eine andere Überlegung ist, dass Seite 9.6 jetzt das Zuordnen von Phrasen unterstützt, was enorm ist.

Ich nehme an, dass Postgres in den meisten Fällen vorzuziehen ist, da es folgende Möglichkeiten bietet:

  1. einfacherer Stapel
  2. es gibt keine Such-Backend-API-Wrapper-Abhängigkeiten (Denksphinx, Django-Sphinx, Heuhaufen usw.). Dies kann ein Ziehen sein, da sie möglicherweise nicht die Funktionen unterstützen, die Ihr Back-End für die Suche bietet (z. B. Facetten/Aggregate von Heuhaufen).
  3. hat ähnliche Leistung und Funktionen (für meine Bedürfnisse)
19
yekta

Ich fand diesen erstaunlichen Vergleich und möchte ihn teilen: 

Volltextsuche in PostgreSQL

Zeit zum Erstellen eines Index-LIKE-Prädikats - keine
PostgreSQL/GIN - 40 min
Sphinx-Suche - 6 min
Apache Lucene - 9 min
Invertierter Index - hoch 

Index Storage LIKE-Prädikat - keine
PostgreSQL/GIN - 532 MB
Sphinx-Suche - 533 MB
Apache Lucene - 1071 MB
Invertierter Index - 101 MB 

Abfragegeschwindigkeit LIKE Prädikat - 90+ Sekunden
PostgreSQL/GIN - 20 ms
Sphinx-Suche - 8 ms
Apache Lucene - 80 ms
Invertierter Index - 40 ms 

15

Die Volltextsuche von Postgres bietet erstaunliche Fähigkeiten in den Bereichen Stemming, Ranking/Boosting, Umgang mit Synonymen, Fuzzy-Suchen, aber keine Unterstützung für die Suche nach Facetten.

Wenn Postgres bereits in Ihrem Stack ist und Sie keine Facettierung benötigen, sollten Sie es besser ausprobieren, um den RIESIGEN Vorteil der einfachen Synchronisierung der Indizes und des schlanken Stacks zu nutzen, bevor Sie nach Lösungen von Lucene suchen - zumindest wenn alle Ihre App basiert nicht auf Suche.

2
Devi

Die FTS-Funktion von Postgresql ist ausgereift und bei Suchvorgängen ziemlich schnell. Es lohnt sich sicher zu schauen.

0
Scott Marlowe