Postgresql 确保如果hashtag在搜索中匹配,则它匹配整个hashtag
我有一个应用程序,它利用hashtags来帮助标记帖子。我正在尝试进行更详细的搜索 假设我正在搜索的记录之一是:Postgresql 确保如果hashtag在搜索中匹配,则它匹配整个hashtag,postgresql,search,hashtag,Postgresql,Search,Hashtag,我有一个应用程序,它利用hashtags来帮助标记帖子。我正在尝试进行更详细的搜索 假设我正在搜索的记录之一是: The #bird flew very far. 当我搜索“flied”、“fle”或“bird”时,它应该返回记录 但是,当我搜索“#bir”时,它不应该返回句子,因为正在搜索的标记的整个内容不匹配 我也不确定“bird”是否应该返回这个句子。不过,我也对如何做到这一点感兴趣 现在,我有一个非常基本的搜索: SELECT "posts".* FROM "posts" WHERE
The #bird flew very far.
当我搜索“flied”、“fle”或“bird”时,它应该返回记录
但是,当我搜索“#bir”时,它不应该返回句子,因为正在搜索的标记的整个内容不匹配
我也不确定“bird”是否应该返回这个句子。不过,我也对如何做到这一点感兴趣
现在,我有一个非常基本的搜索:
SELECT "posts".* FROM "posts" WHERE (body LIKE '%search%')
有什么想法吗?你可以用LIKE做这个,但这会很可怕,正则表达式在这里会更好地为你服务。如果您想忽略散列,那么像这样的简单搜索就可以做到:
WHERE body ~ E'\\mbird\M''
这会发现“鸟飞得很远。”
和“鸟飞得很远。”
。在搜索之前,您可能希望去掉任何#
项,但如下所示:
WHERE body ~ E'\\m#bird\M''
由于数据的性质,无法找到这些结果中的任何一个
如果您不想忽略正文
中的#
s,那么您必须自己使用以下内容展开并修改\m
和\m
快捷方式:
WHERE body ~ E'(^|[^\\w#])#bird($|[^\\w#])'
-- search term goes here^^^^^
使用E'(^^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]])
会发现鸟飞得很远。
但不是鸟飞得很远。
而E'(^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\鸟($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。您可能还希望查看\A
而不是^
和\Z
而不是$
,因为它们存在,但我认为$
和^
将是您想要的
您应该记住,这些正则表达式搜索(或类似的搜索)都不会使用索引,因此您正在设置大量的表扫描和性能问题,除非您可以使用将使用索引的内容来限制搜索。您可能需要查看全文搜索解决方案。在插入/更新文章时,将哈希标记从文本中解析出来,并将其存储在一个单独的列中,称为hashtags,这可能会有所帮助。将它们从文章正文
中删除,然后将其输入到to_tsvector
中,并将tsvector
存储在表格的一列中。然后使用:
WHERE body_tsvector @@ to_tsquery('search') OR 'search' IN hashtags
您可以使用表上的触发器来维护hashtags
列和body_tsvector
中的hashtags,这样应用程序就不必做这些工作。当条目是INSERT
ed或UPDATE
d时,从文本中解析它们。我认为实现这一点的理想方法是使用自定义全文搜索解析器或词典。这可能需要做很多工作,但是通过允许对以#
开头的单词进行词干分析,我认为您几乎可以达到您想要的效果。谢谢您的帮助!我有一个后续问题:如果你能帮助我。我感谢你的全面答复。