postgresql 解析Postgres中的URL

bq3bfh9z  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(294)

我在Postgres中解析URL时遇到问题。我有一个数据库,里面装满了客户和与他们相关的URL。我需要与每个客户相关联的唯一域的数组。我希望能够在查询中进行解析,而不是将结果转储到Python中并在那里进行解析。
在postgres文档中我发现了这个,但不知道如何将其合并到我的查询中:

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
我从一张table开始,像这样:

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}

我想要一张这样的table:

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

在AWS上运行PostgreSQL 9.3.3数据库。

tvz2xvvm

tvz2xvvm1#

您上面链接的文档用于 *Postgres文本搜索解析器 *。这需要一个单独的配置来设置,并且可能会有更多的开销和/或与您所期望的不同。
如果你想走这条路,设置一个文本解析器,你可以在这里找到更多信息:
http://www.postgresql.org/docs/9.3/static/sql-createtsconfig.html
但是,如果你想在 Postgres 中进行内联解析,我建议你使用一种过程化的 Postgres 语言,你可以在这种语言中导入解析库。
你提到了 Python,所以你可以使用 PL/Python 和一个url解析库,比如 urlparse(在Python 3中称为 urllib.parse)。
More info about 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'

除了这个例子,你还可以用 hostname 成员来获取主机名:

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

如果你只想正确地解析域名(有很多边缘情况和变体--即减去 www 和可能存在的任何其他分类部分--像this answer这样的方法将是最好的。
有关设置 PL/Python 的更多信息,请访问:
http://www.postgresql.org/docs/9.3/static/plpython.html
这就是在 Postgres 中进行解析的方法
而不是将结果转储到Python并在那里解析
最后,使用 PL/Python 会有点绕圈子,但是如果你真的想在SQL中进行解析(特别是出于性能原因,比如说,在一个大型数据集上),使用 PL/Python 可能值得付出额外的努力。

tjjdgumg

tjjdgumg2#

您可以创建一个函数

create or replace function fn_get_url_path(in_link text) returns text as
$$
begin
  return (select token
          from (select token, alias
                from ts_parse('default', in_link)
                       natural join ts_token_type('default')) tokens
          where tokens.alias = 'url_path');

end;
$$ language PLpgSQL;

然后使用函数:

select fn_get_url_path(column1)
from (values ('https://www.example.com'),
         ('https://www.example.com/test.html'),
         ('https://www.example.com/test?a=1'),
         ('this doesnt work and will return null')) a

要获得结果:

/*
  null,
  /test.html
  /test?a=1
  null
*/

相关问题