2017-03-09 2 views
2

Ich habe eine Reihe von Textzeilen in einer PostgreSQL-Tabelle und ich versuche, gemeinsame Strings zu finden.Lokalisieren Sie beliebte Strings mit PostgreSQL

Zum Beispiel lassen Sie uns sagen, dass ich eine einfache Tabelle haben wie:

CREATE TABLE a (id serial, value text); 
INSERT INTO a (value) VALUES 
    ('I go to the movie theater'), 
    ('New movie theater releases'), 
    ('Coming out this week at your local movie theater'), 
    ('New exposition about learning disabilities at the children museum'), 
    ('The genius found in learning disabilities') 
; 

ich beliebte Zeichenketten wie movie theater und learning disabilities über alle Zeilen zu finden versuche (das Ziel ist es, eine Liste der „Trend“ zeigen Saiten König von wie Twitter "Trends")

Ich benutze die Volltextsuche und ich habe versucht, ts_stat kombiniert mit ts_headline zu verwenden, aber die Ergebnisse sind ziemlich enttäuschend.

Irgendwelche Gedanken? Vielen Dank!

Antwort

1

Es gibt keine gebrauchsfertige Posgres-Textsuchfunktion, um die beliebtesten Sätze zu finden. Für Zwei-Wörter-Phrasen können Sie ts_stat() verwenden, um die beliebtesten Wörter zu finden, Partikel, Präpositionen usw. zu entfernen und diese Wörter miteinander zu verbinden, um die beliebtesten Paare zu finden.

Für eine tatsächliche Daten möchten Sie die Werte ändern, die als --> parameter. markiert sind Die Abfrage kann auf einem größeren Dataset ziemlich teuer sein.

with popular_words as (
    select word 
    from ts_stat('select value::tsvector from a') 
    where nentry > 1        --> parameter 
    and not word in ('to', 'the', 'at', 'in', 'a') --> parameter 
) 
select concat_ws(' ', a1.word, a2.word) phrase, count(*) 
from popular_words as a1 
cross join popular_words as a2 
cross join a 
where value ilike format('%%%s %s%%', a1.word, a2.word) 
group by 1 
having count(*) > 1         --> parameter 
order by 2 desc; 


     phrase   | count 
-----------------------+------- 
movie theater   |  3 
learning disabilities |  2 
(2 rows) 
+0

Danke Klin, das klingt nach einem guten Ansatz, ich werde das testen! – Gab

1

Wie sei es so etwas wie: SELECT * FROM a WHERE value LIKE '%movie theater%';

Reihen Dies würde finden, die das Muster ‚Kino‘ irgendwo in der Spalte Wert entsprechen (und eine beliebige Anzahl von Zeichen enthalten könnte vor oder nach).

+0

HALLO @Lionel, ich habe keine Ahnung, dass 'Film theater' ist eine beliebte String, dass die Informationen, die ich für – Gab

+0

suche ich sehen. Kannst du ein bisschen mehr darüber erzählen, was du unter "populäre Zeichenfolge" meinst? Suchen Sie beispielsweise nach beliebten Keywords oder vielleicht nach Phrasen? Suchst du nach dem Beliebtesten, oder gibt es eine Schwelle, bei der ein Keyword oder eine Phrase ausreichend beliebt ist? – Lionel

+0

Beliebte Suchbegriffe wie Twitter für "Trends" zum Beispiel. Mein Ziel ist es, die beliebtesten zu finden (Top 10 zum Beispiel) – Gab

Verwandte Themen