2016-11-21 5 views

Antwort

0

Der Staat scheint geradlinig genug - ein normaler Index sollte ausreichen. Was die vollständige Namenssuche betrifft, ist das eine Menge Arbeit, aber mit 20 Millionen Rekorden denke ich, dass die Dividenden für sich selbst sprechen werden.

Erstellen Sie eine neue Felder in der Tabelle als tsvector, und nennen es full_name_search zum Zwecke dieses Beispiels:

alter table <blah> add column full_name_search tsvector; 

eine anfängliche Population der Spalte Sie:

update <blah> 
set full_name_search = to_tsvector (full_name); 

Wenn möglich , machen Sie das Feld nicht NULL-fähig.

einen Trigger erstellen, die jetzt dieses Feld automatisch bevölkern werden, wenn es aktualisiert wird:

create trigger <blah>_insert_update 
before insert or update on <blah> 
for each row execute procedure 
    tsvector_update_trigger(full_name_search,'pg_catalog.english',full_name); 

einen Index für das neue Feld hinzufügen:

create index <blah>_ix1 on <blah> 
using gin(full_name_search); 

Von hier aus restrukturieren die Abfrage auf dem zur Suche tsvector Feld anstelle des Textfelds:

WHERE full_name_search @@ to_tsquery('jones') AND state = 'CA'; 

Sie können shortc nehmen Achten Sie auf einige dieser Schritte (erstellen Sie beispielsweise kein zusätzliches Feld, sondern verwenden Sie stattdessen einen funktionsbasierten Index), und zwar mit verbesserter Leistung, aber nicht so gut wie das, was Sie erhalten können.

Ein Nachteil - Ich denke, die to_tsvector in Vektorkomponenten basierend auf logischen Brüche in den Inhalt aufgeteilt wird, so folgt aus:

Catherine Jones Is a Nice Lady 

wird gut funktionieren, aber dies:

I've been Jonesing all day 

Wahrscheinlich Gewohnheit.

+0

Ich glaube nicht, dass Sie tatsächlich die 'full_name_search'-Spalte zur Tabelle hinzufügen müssen. Sie können einen Index auf 'to_tsvector (full_name)' direkt –

+0

@a_horse_with_no_name erstellen - ich könnte falsch liegen, aber ich habe an einem Punkt die beiden Benchmarking, und es war merklich schneller, wenn ich es ein separates Feld machte. Es ist möglich, dass sich dies mit den folgenden Releases geändert hat, und es ist auch möglich, dass ich mich einfach geirrt habe. – Hambone

+0

John - Ich würde Ihnen empfehlen, beides zu versuchen. Ich bin bestrebt, den Unterschied zu sehen, wenn das Hinzufügen des Feldes es wert ist oder nicht. – Hambone

Verwandte Themen