确保hashtag在搜索中匹配,它与整个hashtag匹配

时间:2012-10-11 21:54:13

标签: postgresql search hashtag

我有一个应用程序,利用主题标签来帮助标记帖子。我想尝试更详细的搜索。

让我们说我正在搜索的一条记录是:

The #bird flew very far.

当我搜索“flew”,“fle”或“#bird”时,它应该返回记录。

然而,当我搜索“#bir”时,它不应该返回句子,因为搜索的整个标签不匹配。

我也不确定“鸟”是否应该返回句子。我也有兴趣怎么做。

现在,我有一个非常基本的搜索:

SELECT "posts".* FROM "posts" WHERE (body LIKE '%search%')

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你可以用LIKE做到这一点,但它会相当可怕,正则表达式会在这里为你提供更好的服务。如果你想忽略哈希,那么像这样的简单搜索就可以解决问题:

WHERE body ~ E'\\mbird\M''

这会找到'The bird flew very far.''The #bird flew very far.'。你想在搜索之前剥离任何#,但是这样:

WHERE body ~ E'\\m#bird\M''
由于\m and \M的性质,

无法找到这些结果。

如果您不想忽略#中的body,那么您必须使用此类内容自行展开和修改\m\M个快捷方式:

WHERE body ~ E'(^|[^\\w#])#bird($|[^\\w#])'
--   search term goes here^^^^^

使用E'(^|[^\\w#])#bird($|[^\\w#])'会找到'The #bird flew very far.'但不会'The bird flew very far.',而E'(^|[^\\w#])bird($|[^\\w#])'会找到'The bird flew very far.'但不会找到'The #bird flew very far.'。您可能还希望\A代替^\Z而不是$,因为subtle differences但我认为$和{ {1}}就是你想要的。

您应该记住,这些正则表达式搜索(或您的LIKE搜索)都不会使用索引,因此您需要为自己设置大量的表扫描和性能问题,除非您可以使用某些内容限制搜索将使用索引。您可能希望改为查看全文搜索解决方案。

答案 1 :(得分:2)

在插入/更新文章时,可能有助于从文本中解析哈希标记并将其存储在名为say hashtags的单独列中的数组中。从文章body中删除它们,然后将其提交到to_tsvector并将tsvector存储在表格的列中。然后使用:

WHERE body_tsvector @@ to_tsquery('search') OR 'search' IN hashtags

您可以在表上使用触发器来维护hashtags列和body_tsvector剥离的哈希标记,以便应用程序不必执行此操作。条目INSERTUPDATE d。

时,将它们从文本中解析出来