Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 确保如果hashtag在搜索中匹配,则它匹配整个hashtag_Postgresql_Search_Hashtag - Fatal编程技术网

Postgresql 确保如果hashtag在搜索中匹配,则它匹配整个hashtag

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

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

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

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时,从文本中解析它们。

我认为实现这一点的理想方法是使用自定义全文搜索解析器或词典。这可能需要做很多工作,但是通过允许对以
#
开头的单词进行词干分析,我认为您几乎可以达到您想要的效果。谢谢您的帮助!我有一个后续问题:如果你能帮助我。我感谢你的全面答复。