【问题标题】:ensure if hashtag matches in search, that it matches whole hashtag确保主题标签在搜索中匹配,它匹配整个主题标签
【发布时间】:2012-10-11 21:54:13
【问题描述】:

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

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

The #bird flew very far.

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

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

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

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

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

有什么想法吗?

【问题讨论】:

  • 我认为实现这一点的理想方法是使用自定义全文搜索解析器或字典。这可能需要相当多的工作,但通过允许以# 开头的词进行词干处理,我认为您几乎可以达到您想要的效果。

标签: postgresql search hashtag


【解决方案1】:

您可以使用 LIKE 来执行此操作,但这会相当可怕,正则表达式会在这里为您提供更好的服务。如果你想忽略哈希,那么像这样的简单搜索就可以了:

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

这将找到'The bird flew very far.''The #bird flew very far.'。您可能希望在搜索之前删除任何 #s,但如下所示:

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 搜索)都不会使用索引,因此您要为大量表扫描和性能问题做好准备,除非您可以使用以下内容限制搜索将使用索引。您可能想查看全文搜索解决方案。

【讨论】:

【解决方案2】:

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

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

您可以使用表上的触发器来维护hashtags 列和body_tsvector 的哈希标签剥离,这样应用程序就不必执行这项工作。当条目为 INSERTed 或 UPDATEd 时,将它们从文本中解析出来。

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 2020-11-17
    • 2017-08-03
    • 2011-03-08
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多