我在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数据库。
2条答案
按热度按时间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
其中包括以下示例代码:
除了这个例子,你还可以用 hostname 成员来获取主机名:
如果你只想正确地解析域名(有很多边缘情况和变体--即减去 www 和可能存在的任何其他分类部分--像this answer这样的方法将是最好的。
有关设置 PL/Python 的更多信息,请访问:
http://www.postgresql.org/docs/9.3/static/plpython.html
这就是在 Postgres 中进行解析的方法
而不是将结果转储到Python并在那里解析
最后,使用 PL/Python 会有点绕圈子,但是如果你真的想在SQL中进行解析(特别是出于性能原因,比如说,在一个大型数据集上),使用 PL/Python 可能值得付出额外的努力。
tjjdgumg2#
您可以创建一个函数
然后使用函数:
要获得结果: