FULLTEXT mysql搜索无法正常工作

时间:2012-02-02 23:46:56

标签: mysql full-text-search

我有一个查询,它从数据库中获取注释,并根据用户输入的内容显示它们。

PHP:

$query=mysql_query("SELECT * FROM comments WHERE MATCH (comments) AGAINST ('%$user_text%')");
    while ($row=mysql_fetch_assoc($query)){
        echo "<div>$row['comment']</div>";
    }

这不会返回任何值。可能是我的mysql数据库中的comments列未设置为FULLTEXT。我运行此脚本ALTER TABLE comments ADD FULLTEXT(comment);但我无法验证索引是否确实FULLTEXT

更新(在验证表格的创建方式后):

CREATE TABLE `comments` (
`id` int(11) NOT NULL...

 PRIMARY KEY (`id`),  //these are the last 3 lines
 FULLTEXT KEY `comments` (`comment`)
) ENGINE=MyISAM AUTO_INCREMENT=93 DEFAULT CHARSET=latin1

2 个答案:

答案 0 :(得分:3)

想想我明白了。在原始查询中,您没有指定可选修饰符,根据MySQL,它表示默认为IN NATURAL LANGUAGE MODE。根据我读过的一些文档,以及我自己的测试,IN NATURAL LANGUAGE MODE只匹配“整个”单词。

如果要进行部分字符串匹配,则必须使用IN BOOLEAN MODE修饰符。但是,存在一个限制,即MySQL无法使用搜索字符串前面的通配符进行搜索,因为它们是从左到右,而不是从右到左编制索引的。因此,为了让您的搜索工作,请尝试以下方法:

SELECT * FROM comments WHERE MATCH (comments) AGAINST ('$user_text*' IN BOOLEAN MODE)"

您可以阅读布尔全文搜索here

此外,您应该阅读mysql_real_escape_string以清理进入查询的变量,以防止SQL注入攻击。

答案 1 :(得分:0)

验证表格:

SHOW CREATE TABLE comments;

这将显示用于重新创建表的语句,包括索引。 此外,您在索引中指定了“注释”字段,但在MATCH条件中指定了“问题标题”。

尝试:

"SELECT * FROM comments WHERE MATCH (questiontitle) AGAINST ('$user_text')"

或:

"SELECT * FROM comments WHERE MATCH (questiontitle) AGAINST ('$user_text' WITH QUERY)" EXPANSION

补充:你也有可能的拼写错误

($row=mysql_fetch_assoc($query)

..缺少右括号 - &gt; ($行= mysql_fetch_assoc($查询))