PHP MySQL 进行全文索引的时候提示False,Syntax error, unexpected ‘@‘, expecting $end 的错误解决方案

之前程序测试运行的时候一直没有问题,今天突然跳出来错误:

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语句除了 + - 外,还有一些其它特殊字符也要注意:

  1. @
    此运算符仅适用于InnoDB表。它测试两个或多个单词是否都以单词为单位在指定的距离内开始。在紧邻@distance运算符之前的双引号字符串中指定搜索词,例如,MATCH(col1)AND('“word1 word2 word3”@8'在布尔模式下)
  2. > <
    这两个运算符用于更改单词对分配给行的相关性值的贡献。>运算符增加贡献,<运算符减少贡献。请参见以下列表中的示例。
  3. ( )
    括号将单词分组为子表达式。带圆括号的组可以嵌套。
  4. ~
    前导波浪号充当否定运算符,导致单词对行相关性的贡献为负。这对于标记“噪音”单词很有用。包含这样一个单词的行的评级低于其他单词,但并没有像使用-运算符时那样被完全排除在外。
  5. *
    星号用作截断(或通配符)运算符。与其他运算符不同,它附加在要影响的单词后面。如果单词以*运算符前面的单词开头,则匹配。
  6. "
    包含在双引号(“)中的短语字符仅与键入时包含短语的行匹配。全文引擎将短语拆分为单词,并在FULLTEXT索引中搜索单词。非单词字符不需要完全匹配:短语搜索只要求匹配项包含与短语完全相同的单词,并且顺序相同。例如,“测试短语”匹配“测试,短语”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP20+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值