Postgres文本搜索多行

时间:2012-09-27 02:08:24

标签: 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
-----------------------------------------------

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

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'), ' ')
)

1 个答案:

答案 0 :(得分:1)

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

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

这是documentation

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

hstore @> hstore

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

你可以看到文档(对于PostgreSQL 9.1)hstore以及如何使用它here