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?
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:
LIKE
weit überlegen.Von meinem Kopf aus, in keiner bestimmten Reihenfolge…
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.
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:
Ich fand diesen erstaunlichen Vergleich und möchte ihn teilen:
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
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.
Die FTS-Funktion von Postgresql ist ausgereift und bei Suchvorgängen ziemlich schnell. Es lohnt sich sicher zu schauen.