【问题标题】:Is it possible to treat hyphens and spaces the same in SQL?是否可以在 SQL 中以相同的方式处理连字符和空格?
【发布时间】:2014-02-06 06:08:49
【问题描述】:

所以我正在开发一个社交网站的搜索功能,它会搜索用户的帖子。有些用户喜欢用连字符代替空格,但我希望搜索功能在结果中同时查找连字符和空格。

例如,如果他们有一个名为“SQL-IS AWESOME”的帖子,我搜索“SQL IS AWESOME”,我还能找到那个帖子吗?我尝试使用 2 个 sql 查询,一个用于原始搜索查询,一个修改为将所有空格更改为连字符。

但如果我搜索“SQL IS-AWESOME”,它仍然找不到它。有没有更简单的方法?

我当前的代码:

$sql = "SELECT * FROM posts 
WHERE (post_title='".$query."' 
OR post_title LIKE '%".$query."' 
OR post_title LIKE '%".$query."%' 
OR post_title LIKE '".$query."%') 
".$locquery."
".$cat."
ORDER BY date DESC
LIMIT 18";

【问题讨论】:

标签: php mysql sql search


【解决方案1】:

正如有人建议的那样,您可以适应并使用全文搜索。

如果您选择走这条路线,则需要在所需字段上启用全文搜索。

我假设你会检查 post_title 和 post_body (?),这需要你运行它;

ALTER TABLE `posts` ADD FULLTEXT KEY `post_search` (`post_title`,`post_body`);

完成后,您的搜索查询可以轻松编辑为;

$sql = "SELECT * FROM `posts` WHERE MATCH(post_title,post_body) AGAINST '$search'";

如果你想要更好的匹配,也可以给它一个分数和顺序,这需要类似这样的代码:

$sql = "SELECT *, MATCH(post_title, post_body) AGAINST ('{$search}') AS score ".
       "FROM `posts` WHERE MATCH(post_title, post_body) AGAINST ('{$search}') ORDER BY `score` DESC";

--- 注释

对于搜索,您需要确定搜索方式。

在我使用类似的最后一个实例中,我只是有一个用于搜索词的表单(名为“搜索”),导致 $_POST['search'] 被发送到服务器。

然后我用了;

$search = (array_key_exists('search', $_POST) && is_string($_POST['search'])) ? mysql_real_escape_string($_POST['search'], $c) : FALSE ;
if ($search) {
    // Do the fulltext query requires (See above)
}

由于全文搜索将忽略连字符,因此您只剩下空格,如果您选择使用评分结果,这对全文非常有用。

【讨论】:

  • 第一个是给我一个错误:你的SQL语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“添加 FULLTEXT KEY post_search (post_title,text)”附近使用正确的语法
  • 修改后的帖子。它应该是 ALTER TABLE,而不是 UPDATE——哎呀。
  • 实际上,第三个有效。但它仍然无助于我需要搜索连字符而不是空格的事实......
  • 您希望它使用或不使用连字符进行搜索,对吗?例如,将上述内容与评分系统一起使用会将“random-name-selected”作为搜索词“random-name-selected”和“random-name-selected”的顶部结果 - 这不是您需要的效果吗?目标是什么?
  • 很抱歉,没有正确测试。它完美地工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多