【问题标题】:Postgres text search on multiple rowsPostgres 多行文本搜索
【发布时间】:2012-09-27 12:07:16
【问题描述】:

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

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

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

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

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

    这里是documentation

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

    hstore @> hstore
    

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

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

    【讨论】:

    • 传奇!谢啦。我使用了数组的概念,并提出了以下似乎很有效的方法: SELECT tags FROM post WHERE string_to_array(tags, ' ') && (SELECT array(SELECT RTRIM(value) FROM exclude WHERE key = 'tag') )和标签!=''。你会注意到我的标签表结构实际上是 id、key、value,其中 key 是 'tag' 而 value 是 '#oxford' 等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2020-02-04
    • 2015-08-20
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多