使用PostgreSQL找到流行的字符串

时间:2017-03-09 18:31:00

标签: sql postgresql full-text-search postgresql-9.6 tsvector

我在PostgreSQL表中有一堆文本行,我正在尝试查找常用字符串。

例如,假设我有一个基本的表格,如:

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')
;

我试图在所有行中找到像movie theaterlearning disabilities这样的流行字符串(目标是显示像Twitter“趋势”之类的“趋势”字符串列表)

我使用全文搜索,并尝试将ts_statts_headline结合使用,但结果非常令人失望。

有什么想法?谢谢!

2 个答案:

答案 0 :(得分:1)

如下: SELECT * FROM a WHERE value LIKE '%movie theater%';

这会在值列中的某处找到与模式“电影院”匹配的行(并且可以在其之前或之后包含任意数量的字符)。

答案 1 :(得分:1)

没有现成的Posgres文本搜索功能来查找最流行的短语。对于双字短语,您可以使用ts_stat()查找最常用的单词,消除粒子,介词等,并交叉连接这些单词以查找最受欢迎的对。

对于实际数据,您需要更改标记为--> parameter.的值。对于较大的数据集,查询可能非常昂贵。

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)