0

私のデータベーステーブル(whitelist_domain_data)には、フィールドid、url、dataがあります

URL列には次のような複数のURLがあります

http://www.dailystrength.org/c/Hidradenitis_​​Suppurativa/forum/8870995-solodyn-135-mg-works
http://au.answers.yahoo.com/question/index?qid=20090325215905AA6UVOa
http://navaspot.wordpress.com                                                              

同じドメインを持つ行をフェッチしたい。

表:Whitelist_domain_data

スキーマ:id、url、data

select regexp_matches(url,'http\:\/\/([a-z0-9\.]+)\.org')  as domain,
       count(*) 
from whitelist_domain_data 
group by domain;

戻る必要があります:

dailystrength.org   200

質問:URLにドメイン「 dailystrength.org」がある場合、すべてのURLデータをフェッチするようにクエリを設計するにはどうすればよいですか?

4

1 に答える 1

0

これはsubstring()を使用して行うことができ、おそらく式インデックスを使用することもできます。次に例を示します(私はあなたが望むものと一致するように正規表現を微調整しました):

CREATE TABLE whitelist_domain_data(
  id SERIAL PRIMARY KEY,
  url TEXT NOT NULL
);

CREATE INDEX domain_index
  ON whitelist_domain_data (substring(url from 'https?\:\/\/([a-z0-9\.]+)'));

INSERT into whitelist_domain_data (url) VALUES
  ('http://www.dailystrength.org/c/Hidradenitis_Suppurativa/forum/8870995-solodyn-135-mg-works'),
  ('http://au.answers.yahoo.com/question/index?qid=20090325215905AA6UVOa'),
  ('http://navaspot.wordpress.com');

SELECT * FROM whitelist_domain_data WHERE substring(url from 'https?\:\/\/([a-z0-9\.]+)') = 'www.dailystrength.org';

これで、このクエリでインデックスを使用できるようになりました。これを頻繁に使用する予定の場合は、特定の関数を作成することも検討してください。

CREATE FUNCTION get_domain(text) RETURNS text
LANGUAGE SQL
AS $$
  SELECT substring($1 from 'https?\:\/\/([a-z0-9\.]+)');
$$;

次に、上記は次のようになります。

CREATE INDEX domain_index
  ON whitelist_domain_data (get_domain(url));

SELECT * FROM whitelist_domain_data WHERE get_domain(url) = 'www.dailystrength.org';

したがって、ドメインが何であるかを変更したい場合(サブドメインを無視するなど)、関数を変更するだけで、クエリはすべて機能します。ただし、その時点でインデックスを再作成する必要があると思います。

これがすべてPostgres9.1で機能することを確認しましたが、最近のバージョンと互換性があるはずです。式インデックスとsubstring()はどちらも7.x日に戻ります。

于 2012-07-04T19:35:30.270 に答える