2016-04-14 7 views
0

Ich benutze Postgres, um ein Muster in einer Spalte von Strings, ohne die Volltext-Suchmaschine (weil ich nicht Stemming, Stoppwörter, Ranking, etc.) übereinstimmen soll.Gesamtmuster Übereinstimmung in Postgres?

Wie kann ich die Gesamtzahl der übereinstimmenden Muster abrufen (auch wenn mehr Felder das Muster mehrfach enthalten). Ist das möglich?

Zum Beispiel: Die Suche nach Hund in

text 
---- 

The dog looked at the other dog. 
The dog looked at the cat. 

Ergebnis, wenn für Hund Suche: 3 Treffer.

Antwort

0
SELECT 
SUM(
    (LENGTH(text) - LENGTH(REGEXP_REPLACE(text,'dog','','g')))/LENGTH('dog') 
) as hits 
FROM 
the_table 

Fiddle: http://sqlfiddle.com/#!15/600f5/1

+0

Schön, ich habe dieses Schnipsel schon mal im Internet gesehen, jetzt erinnere ich mich. Ist das schnell genug auf einem Tisch mit 1m Reihen? Und heißt das, ich führe zwei Abfragen aus: eine zum Zählen und eine zum Abrufen? – Private

0

Sie können es mit Volltextsuche tun, ohne entwickelt wurden und Stoppwörter zu verwenden. Sie können das "einfache" Wörterbuch verwenden. Mehr über Wörterbücher in der documentation.

Hier ist das Beispiel für die Tabelle "tst":

CREATE TABLE tst (t text); 
INSERT INTO tst VALUES ('The dog looked at the other dog.'); 
INSERT INTO tst VALUES ('The dog looked at the cat.'); 

Beispiel Abfrage, die die Funktion ts_stat verwendet():

postgres=# SELECT SUM(nentry) FROM ts_stat('SELECT to_tsvector(t) FROM tst') WHERE word = 'dog'; 
sum 
----- 
    3 
(1 row) 

Ich weiß nicht, über die Leistung von ts_stat(). Sie können es mit Indizes testen.

0

regexp_matches gibt für jede Übereinstimmung eine Zeile zurück, wenn sie mit dem Parameter g aufgerufen wird. Sie können dies verwenden, um die Anzahl der gefundenen Übereinstimmungen zu zählen, wenn Sie eine Primärschlüsselspalte in der Tabelle haben.

select id, count(*) 
from the_table, regexp_matches(the_column, 'dog', 'g') 
where the_column ~ 'dog' 
group by id 

Die Bedingung where the_column ~ 'dog' reduziert die Anzahl der Zeilen, die verarbeitet werden müssen, und damit die Anzahl der Zeilen, die Gruppe zu sein brauchen. Wenn Sie nur wenige Zeilen mit dem Suchbegriff haben, sollte dies die Leistung verbessern.