php - MySQL 撇号-如何使用 MATCH/AGAINST 转义并返回正确的结果

标签 php mysql sql database

我有一个类似这样的表:

TABLE BOOKS
ID   TITLE             SUBTITLE
------------------------------------
1    Don't Forget      
2    Twenty/Twenty      How To Subtitle
3    Red Riding Hood    Another Subtitle
4    The Three Bears
5    The Threev Bears

MySQL 是:

SELECT * FROM books WHERE MATCH (titl, subt) AGAINST ('+don\'t*' IN BOOLEAN MODE)

此查询为我返回(在 phpMyAdmin 中,我仍然不确定如何在 PHP 中转义撇号)以下内容:

   ID  TITLE
   -------------------------------
   1   Twenty/Twenty
   2   The Threev Bears

我不确定为什么我会得到“三只熊”,而不是“三只熊”? “三”是一个被忽视的词吗?

另外,为什么我得到的是“二十/二十”,而不是“不要忘记”?这是我想要的唯一结果。

感谢您的帮助!

最佳答案

您在这里有几个问题,所以让我尝试解决这些问题。

首先,你是对的,确实是一个被忽视的词。默认情况下,MySQL 有一个列表 ignored or "stop" words哪些没有索引。你可以调整这个。这样做的目的是避免索引中出现非常常见的单词,这些单词将返回大部分结果。

要转义 PHP 中的字符,您确实应该使用参数化查询,或者至少使用 msql_real_escape_string。 Here's a great SO post on the subject

最后,您得到 Twenty/Twenty 而不是 Don't忘记 的原因是因为 Don't 也是停用词。我相信 TwentyTwenty 与 t* 相匹配。

关于php - MySQL 撇号-如何使用 MATCH/AGAINST 转义并返回正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7947854/

相关文章:

javascript - 模态框内的 Ajax 表单提交

php - Selenium 下拉选项和 USGS 门户网站

python - ModelForm 未正确插入数据

php - JQuery Ajax Tagit 数组到 PHP 返回 [object Object]

php - HTML - MySQL 表删除条目

mysql - 如何从生日日期开始按年龄对 MySQL 结果进行排序

php - 如何更新字段以将值添加到现有值?

sql - 散列连接和合并连接 (Oracle RDBMS) 之间有什么区别?

sql - 将所有记录放在一个字段中

php - 使用 PHP AJAX 和 XML 进行实时搜索