之前程序测试运行的时候一直没有问题,今天突然跳出来错误:
False,Syntax error, unexpected '@', expecting $end
有点措手不及,检查了一下代码,PHP代码应该不可能有问题,那么只能是MySQL了,提示@字符错误,我想到了在全文索引编码时因为考虑到+号比较麻烦,所以都替换成了@符号。而刚好今天把表格式从MyISAM换成了InnoDB,看来两个引擎对全文索引的处理是不太一样的。
网上找了一下解决方案,把搜索语句用双引号“括起来就可以了。
原代码:
$search_pt = "5bqT6YeM 5pu05b@r";
$db->query_data("select nt_id from ai_news_temp where MATCH (n_main_words_fl) AGAINST('".$search_pt."' IN BOOLEAN MODE) limit 10 ");
修改后的代码:
$search_pt = "5bqT6YeM 5pu05b@r";
$db->query_data("select nt_id from ai_news_temp where MATCH (n_main_words_fl) AGAINST('\"".$search_pt."\"' IN BOOLEAN MODE) limit 10 ");
主要是MATCH()AGAINST()语句,本来是AGAINST('abc' IN BOOLEAN MOD),改成 AGAINST('"abc"' IN BOOLEAN MODE),这样就可以了。
全文索引AGAINST语句除了 + - 外,还有一些其它特殊字符也要注意:
- @
此运算符仅适用于InnoDB表。它测试两个或多个单词是否都以单词为单位在指定的距离内开始。在紧邻@distance运算符之前的双引号字符串中指定搜索词,例如,MATCH(col1)AND('“word1 word2 word3”@8'在布尔模式下) - > <
这两个运算符用于更改单词对分配给行的相关性值的贡献。>运算符增加贡献,<运算符减少贡献。请参见以下列表中的示例。 - ( )
括号将单词分组为子表达式。带圆括号的组可以嵌套。 - ~
前导波浪号充当否定运算符,导致单词对行相关性的贡献为负。这对于标记“噪音”单词很有用。包含这样一个单词的行的评级低于其他单词,但并没有像使用-运算符时那样被完全排除在外。 - *
星号用作截断(或通配符)运算符。与其他运算符不同,它附加在要影响的单词后面。如果单词以*运算符前面的单词开头,则匹配。 - "
包含在双引号(“)中的短语字符仅与键入时包含短语的行匹配。全文引擎将短语拆分为单词,并在FULLTEXT索引中搜索单词。非单词字符不需要完全匹配:短语搜索只要求匹配项包含与短语完全相同的单词,并且顺序相同。例如,“测试短语”匹配“测试,短语”。