1

Die Tabelle ist Produkt:Tuning Postgres Volltextsuche

   Table "public.product" 
    Column  |   Type   | 
-----------------+--------------------------+ 
id    | uuid      | 
attributes  | jsonb     | 

Beachten Sie, dass Attribute ein jsonb Feld ist. Im Moment habe ich ~ 5k Zeilen und ich bin Abfrage es wie folgt aus:

select id, to_tsvector(attributes::text) @@ to_tsquery('22222') from product; 

Diese Abfrage dauert schon ein paar Sekunden dauern, und ich möchte wissen, ob es etwas gibt, was ich tun kann, dass die Zeit zu verbessern, Nämlich Indizes oder verbesserte Abfrage?

für diese Abfrage zurück Start:

    id     | found 
--------------------------------------+------- 
a8230602-ff3f-4414-affc-3594abcfa617 | f 
da0c70d5-5108-42ea-941d-123589129feb | f 
24ac417a-466c-465c-b346-4fad7a9ad3d8 | f 
4bee6122-c5d7-4e0c-840e-e04c28888a9a | f 
ce5fe539-bcb2-4cec-9012-b2501df7012e | f 

was unerwünscht ist, ist es eine Möglichkeit, nur die Zeilen zurück, die ein Spiel haben?

Antwort

3

Sie müssen den Zustand der WHERE Klausel bewegen:

SELECT * 
FROM product 
WHERE to_tsvector('english', attributes::text) @@ to_tsquery('22222'); 

und einen Volltextindex auf dem Ausdruck erstellen:

CREATE INDEX textsearch_idx ON product 
USING GIN (to_tsvector('english', attributes::text)); 

Index Ausdruck und der Ausdruck in der Abfrage übereinstimmen.

Details in the manual.

Oder Sie kann Lage sein, einen jsonb GIN Index zu verwenden:

Aber das ist nicht zur Arbeit gehen, wenn Sie wollen Suchschlüssel und Werte auf einmal.

Sie könnten besser mit einem normalisierten Tabellenlayout beginnen mit ...