4

Postgres で URL を解析できません。顧客と顧客に関連付けられた URL でいっぱいのデータベースがあります。各顧客に関連付けられた一意のドメインの配列が必要です。結果をPythonにダンプしてそこで解析するのではなく、クエリで解析できるようにしたいと思っています。

postgres docs でこれを見つけましたが、それをクエリに組み込む方法がわかりません:

SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.html');  

  alias   |  description  |            token               
----------+---------------+------------------------------  
 protocol | Protocol head | http://  
 url      | URL           | example.com/stuff/index.html  
 host     | Host          | example.com  
 url_path | URL path      | /stuff/index.html  

( http://www.postgresql.org/docs/9.3/static/textsearch-parsers.html )

次のようなテーブルから始めます。

customer_id | url 
-------------+--------------------   
000001      | www.example.com/fish  
000001      | www.example.com/potato  
000001      | www.potato.com/artichoke
000002      | www.otherexample.com

これまでの私のコード:

SELECT customer_id, array_agg(url)
FROM customer_url_table
GROUP BY customer_id

それは私に与えます:

customer_id | unique_domains
-----------------------------
000001      | {www.example.com/fish, www.example.com/potato, www.potato.com/greenery}
000002      | {www.otherexample.com}

次のようなテーブルが必要です。

customer_id | unique_domains
-----------------------------
000001      | {example.com, potato.com}
000002      | {otherexample.com}

AWS にある PostgreSQL 9.3.3 データベースでの作業。

4

1 に答える 1

4

上でリンクしたドキュメントは、Postgres テキスト検索パーサーで使用するためのものです。これには別の設定が必要であり、オーバーヘッドが増えたり、探しているものとは異なるものになる可能性があります。

テキストパーサーをセットアップするためにそのルートに行きたい場合は、ここで詳細情報を見つけることができます:

http://www.postgresql.org/docs/9.3/static/sql-createtsconfig.html

ただし、 Postgresでインラインで解析を行いたい場合は、その言語で解析ライブラリをインポートできる手続き型のPostgres言語を使用することをお勧めします。

Pythonについて言及したので、 PL/Pythonとurlparse ( Python 3 ではurllib.parseと呼ばれる)などの URL 解析ライブラリを使用できます。

urlparseに関する詳細情報

これには、次のサンプル コードが含まれます。

>>> from urlparse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
>>> o   
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')
>>> o.scheme
'http'
>>> o.port
80
>>> o.geturl()
'http://www.cwi.nl:80/%7Eguido/Python.html'

その例を超えて、ホスト名メンバーを使用してホスト名を取得できます。

>>> print o.hostname
www.cwi.nl

ドメイン名だけを適切に解析したい場合(多くのエッジケースとバリアントがあります-つまり、そこにある可能性のあるwwwとその他のさまざまな部分を差し引いたもの-この回答のようなアプローチが最適です.

PL/Pythonのセットアップの詳細については、次の場所にアクセスしてください。

http://www.postgresql.org/docs/9.3/static/plpython.html

それで、それがPostgresで解析を行う方法です

結果を Python にダンプしてそこで解析する代わりに

PL/Pythonで少し完全な円になりますが、本当に SQL 内で解析を行いたい場合 (特にパフォーマンス上の理由から、たとえば大規模なデータ セット全体で)、PL/Pythonを使用することは余分な価値があるかもしれません。努力。

于 2014-07-24T00:20:09.240 に答える