2017-03-09 10 views
2

PostgreSQLのテーブルにテキスト行がたくさんあり、共通の文字列を見つけようとしています。例えばPostgreSQLで一般的な文字列を探す

、のようなものだが、私は基本的なテーブルを持っているとしましょう:私はすべての行にわたるmovie theaterlearning disabilitiesなどの人気の文字列を見つけるためにしようとしています

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

(目標は「トレンド」のリストを表示することですTwitterのような文字列 "Trends")

私はフルテキスト検索を使用して、ts_statts_headlineを組み合わせて使用​​しようとしましたが、結果は非常に残念です。

どのような考えですか?ありがとう! SELECT * FROM a WHERE value LIKE '%movie theater%';

これはどこかに値列内のパターン「映画館」を一致する行を見つけるだろう(と前または後に任意の数の文字を含めることができます):のようなものについてはどのように

答えて

1

人気の高いフレーズを見つけるためにすぐに使用できるPosgresテキスト検索機能はありません。 2単語のフレーズの場合は、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) 
+0

おかげでklin、それは良いアプローチのように聞こえる、私はそれをテストします! – Gab

1

+0

HI @Lionel、私は '映画theater'情報は私が私が見る – Gab

+0

を探していますという人気の文字列であることを知識がありません。あなたは '人気のある文字列'が意味することについて少し詳しい情報を提供できますか?たとえば、人気のあるキーワード、またはおそらくフレーズを探していますか?あなたは最も人気のあるものを探していますか、またはキーワードやフレーズが十分に人気がある閾値がありますか? – Lionel

+0

Twitterのような人気のあるキーワードは、たとえば「トレンド」のキーワードです。私の目標は、最も人気のあるものを見つけることです(例えば、トップ10) – Gab

関連する問題