我有一个应用程序,它利用标签来帮助标记帖子。我正在尝试进行更详细的搜索。
假设我正在搜索的记录之一是:
The #bird flew very far.当我搜索"fle“、”fle“或"#bird”时,它应该返回记录。
然而,当我搜索"#bir“时,它不应该返回句子,因为正在搜索的整个标签都不匹配。
我也不确定“鸟”是否应该返回句子。不过,我对如何做到这一点也很感兴趣。
现在,我有一个非常基本的搜索:
SELECT "posts".* FROM "posts" WHERE (body LIKE '%search%')有什么想法吗?
发布于 2012-10-12 06:43:20
你可以用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中的#s,那么你必须自己扩展和修改\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,但我认为$和^可能是您想要的。
您应该记住,这些正则表达式搜索(或您的LIKE搜索)都不会使用索引,所以除非您可以使用使用索引的搜索来限制搜索,否则您将面临大量的表扫描和性能问题。您可能希望使用全文搜索解决方案。
发布于 2012-10-14 13:06:47
在插入/更新文章时,从文本中解析出散列标记并将它们存储在一个单独列中的数组中可能会有所帮助。在将文章body提供给to_tsvector之前,将它们从文章中删除,并将tsvector存储在表的列中。然后使用:
WHERE body_tsvector @@ to_tsquery('search') OR 'search' IN hashtags您可以在表上使用触发器来维护hashtags列和去掉散列标记的body_tsvector,这样应用程序就不必做这些工作了。当条目为INSERTed或UPDATEd时,将它们从文本中解析出来。
https://stackoverflow.com/questions/12849139
复制相似问题