首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保hashtag在搜索中匹配,它与整个hashtag匹配

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

Stack Overflow用户
提问于 2012-10-12 05:54:13
回答 2查看 1.2K关注 0票数 3

我有一个应用程序,它利用标签来帮助标记帖子。我正在尝试进行更详细的搜索。

假设我正在搜索的记录之一是:

代码语言:javascript
复制
The #bird flew very far.

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

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

我也不确定“鸟”是否应该返回句子。不过,我对如何做到这一点也很感兴趣。

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

代码语言:javascript
复制
SELECT "posts".* FROM "posts" WHERE (body LIKE '%search%')

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-12 06:43:20

你可以用LIKE来做这件事,但是这将是相当可怕的,正则表达式在这里会更好地为你服务。如果你想忽略这些散列,那么像这样的简单搜索就可以解决这个问题:

代码语言:javascript
复制
WHERE body ~ E'\\mbird\M''

会找到'The bird flew very far.''The #bird flew very far.'。你可能想在搜索之前去掉任何#,如下所示:

代码语言:javascript
复制
WHERE body ~ E'\\m#bird\M''

由于\m and \M的性质,我找不到这些结果中的任何一个。

如果你不想忽略body中的#s,那么你必须自己扩展和修改\m\M快捷键,如下所示:

代码语言:javascript
复制
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搜索)都不会使用索引,所以除非您可以使用使用索引的搜索来限制搜索,否则您将面临大量的表扫描和性能问题。您可能希望使用全文搜索解决方案。

票数 3
EN

Stack Overflow用户

发布于 2012-10-14 13:06:47

在插入/更新文章时,从文本中解析出散列标记并将它们存储在一个单独列中的数组中可能会有所帮助。在将文章body提供给to_tsvector之前,将它们从文章中删除,并将tsvector存储在表的列中。然后使用:

代码语言:javascript
复制
WHERE body_tsvector @@ to_tsquery('search') OR 'search' IN hashtags

您可以在表上使用触发器来维护hashtags列和去掉散列标记的body_tsvector,这样应用程序就不必做这些工作了。当条目为INSERTed或UPDATEd时,将它们从文本中解析出来。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12849139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档