sql - 在多行上进行 Postgres 文本搜索

标签 sql postgresql

我有一个名为“exclude”的表,其中包含主题标签:

-------------
id | tag
-------------
1    #oxford
2    #uk
3    #england
-------------

我有另一个名为“post”的表:

-----------------------------------------------
id | tags               | text
1    #oxford #funtimes    Sitting in the sun
2    #oz                  Beach fun
3    #england             Milk was a bad choice
-----------------------------------------------

为了对帖子标签进行文本搜索,我一直在运行如下查询:

SELECT * FROM post WHERE to_tsvector(tags) @@ plainto_tsquery('mysearchterm')

但是,我现在希望能够排除部分或全部标签在我的排除表中的所有帖子。在 SQL/Postgres 中有什么简单的方法可以做到这一点吗?

我尝试将标签行转换为一列,并在 plainto_tsquery 函数中使用该术语,但它不起作用(我不知道如何进行文本搜索“不等于”,因此逻辑是实际错误,尽管在我看来是正确的):

select * from post where to_tsvector(tags) @@ plainto_tsquery(
   select array_to_string(array(select RTRIM(value) from exclude where key = 'tag'), ' ')
)

最佳答案

您使用的是什么版本的 PostgreSQL?您的架构设计有多灵活?换句话说,你能随意改变它吗?或者这是你无法控制的?

当我读到您的问题时,我立刻想到了两件事。一是您应该能够使用数组和 @>(包含)或 <@(包含于)运算符。

这里是 documentation

其次,您可以利用 hstore 并执行类似的操作。 到:

hstore @> hstore

这不是真正的 hstore,因为您没有使用真正的键=>值对。但是,我猜你可以做 {tagname}=True 或 {tagname}=NULL。可能有点老套。

您可以查看文档(针对 PostgreSQL 9.1)hstore 以及如何使用它 here

关于sql - 在多行上进行 Postgres 文本搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12613092/

相关文章:

mysql - 将多行结果转换为一行 SQL

sql - 优化节点连接查询

sql - 社交网络数据库架构?

database - 为什么 SQL 转储文件大小与原始数据库大小相比这么小?

sql - Postgres : update a row on conflict insert and return old values

sql - 谷歌大查询 :How to Generate Date Array by End of Month date

PHP Select语句与mysql的问题

performance - Postgres Hash 加入速度

python-2.7 - 如何关闭 psycopg2 和 postgresql 之间的旧连接?

node.js - sequelize [erro]{ this.name}.hasMany 中的模型关联调用不是 Sequelize.Model 的子类