我有一个应用程序,利用主题标签来帮助标记帖子。我想尝试更详细的搜索。
让我们说我正在搜索的一条记录是:
The #bird flew very far.
当我搜索“flew”,“fle”或“#bird”时,它应该返回记录。
然而,当我搜索“#bir”时,它不应该返回句子,因为搜索的整个标签不匹配。
我也不确定“鸟”是否应该返回句子。我也有兴趣怎么做。
现在,我有一个非常基本的搜索:
SELECT "posts".* FROM "posts" WHERE (body LIKE '%search%')
有什么想法吗?
答案 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
剥离的哈希标记,以便应用程序不必执行此操作。条目INSERT
或UPDATE
d。