2012-05-16 5 views
7

Ich möchte eine Textsuche wie google suggestions tun.vorschlagen, wie Google mit Postgresql Trigramme und Volltextsuche

Ich benutze PostgreSQL wegen der magischen Postgis.

ich mit FTS dachte, aber ich sah, dass es nicht partial words suchen konnte, so fand ich this question, und sah, wie trigrams funktioniert.

Das Hauptproblem ist, dass die Suchmaschine, an der ich arbeite, für die spanische Sprache ist. FTS funktionierte gut mit stemming und dictionaries (Synonyme, falsch geschrieben), UTF und so weiter. Trigramme funktionierten gut für Teilwörter, aber sie funktionieren nur für ASCII und (offensichtlich) benutzen sie keine Wörterbücher.

Ich dachte, ob es irgendeinen Weg gäbe, in dem die besten Dinge von beiden verwendet werden könnten.

Ist es möglich, Volltextsuche und Trigramme in PGSQL zusammen zu arbeiten?

Antwort

3

Sie können dies in Postgres tun und brauchen Lucene nicht.

Sie können Sätze in tsquery oder tsvector wie folgt zitieren. Sie können eine :* nach einem tsquery Begriff fügen Sie ein Präfix Suche zu tun:

select 
'''new york city'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york times'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york'''::tsvector  @@ '''new yo'':*'::tsquery, --true 
'''new'''::tsvector    @@ '''new yo'':*'::tsquery, --false 
'new'::tsvector     @@ '''new yo'':*'::tsquery, --false 
'new york'::tsvector   @@ '''new yo'':*'::tsquery --false 

Das Hauptproblem ist, dass to_tsvector() und [plain]to_tsquery() Ihre Zitate abzustreifen. Sie können Ihre eigenen Versionen schreiben, die dies nicht tun (es ist nicht so schwer), oder sie nachbearbeiten, um Ihre Term-N-Gramme zu erstellen.

Die zusätzlichen Hochkommas oben sind nur Fluchten. select $$ i heart 'new york city' $$::tsvector; ist gleichwertig.

+0

wow! Können Sie bitte einen Verweis auf die Dokumentation zu diesem Triple-Zitat hinzufügen? – jperelli

+1

das Triple-Zitat ist eigentlich normal SQL, ich entkomme nur ein einziges Zitat mit einem anderen. Die Dokumente erwähnen es hier: http://www.postgresql.org/docs/9.3/static/textsearch-controls.html –

2

Ich würde empfehlen, einen Blick auf Lucene. Es kann nativ in Java, leicht in .NET oder mit SOLR und Web Services in PHP integriert werden.

Es hat große Fähigkeiten für Freitextsuchen, Begriffskategorie out-of-the-box, Unterstützung für verschiedene Sprachen mit verschiedenen Analysers (Link für die spanische).

Last but not least ist es auch extrem schnell (für große Mengen, sagen 4Gb Index ~ 5 000 000 Zeilen in einer DB, es ist viel schneller als eine Postgres-Datenbank).

+3

Ich werde mit einer ähnlichen Lösung gehen, Elasticsearch verwenden, aber ich kann nicht akzeptieren, weil es die Frage nicht beantwortet (falls jemand hier auf der Suche nach der Antwort ankommt). Vielen Dank! – jperelli

Verwandte Themen