SQL中'>>>‘运算符含义及InnoDB兼容替代方案咨询
MyISAM转InnoDB后MATCH...AGAINST的>>>运算符问题及替代方案
一、>>>运算符的含义
>>>是MyISAM全文索引布尔模式的非官方扩展语法——叠加权重提升符。官方标准布尔模式仅支持单个>来提升匹配词的相关性权重,但MyISAM允许连续多个>叠加,比如>>>相当于给"weld"这个词的权重提升3次,让它在trank的相关性得分里占比更高,排序时更靠前。
但InnoDB的全文索引布尔模式不支持这种多重复的>写法,这就是转表后查询报错的核心原因。
二、InnoDB的替代写法
InnoDB里只能用单个>来提升权重,想要实现类似的高权重效果,可通过两种方式:
方式1:叠加带权重的关键词
把>>>("weld")改成多次使用>("weld"),比如>("weld") >("weld") >("weld"),以此模拟多次权重提升的效果。
方式2:手动调整排序时的权重系数
如果叠加关键词显得冗余,也可以保持单个>提升,然后在排序阶段给trank或crank乘以一个系数,放大其对最终排序的影响。
适配InnoDB的修改后查询
下面是调整后的SQL,同时把隐式连接改成更清晰的显式JOIN,去掉InnoDB不支持的语法:
SELECT wp_posts.ID, MATCH(post_title) AGAINST ('>("weld") >(weld)' IN BOOLEAN MODE) AS trank, MATCH(post_content_filtered) AGAINST ('>("weld") (weld)' IN BOOLEAN MODE) AS crank FROM wp_posts JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE wp_posts.post_type = 'ewimc_article' AND wp_posts.post_status IN ('publish', 'private') AND wp_postmeta.meta_key = 'ewi_pub_year' AND ( MATCH(post_title) AGAINST ('+weld' IN BOOLEAN MODE) OR MATCH(post_content_filtered) AGAINST ('+weld' IN BOOLEAN MODE) ) ORDER BY (trank * 1.5) + crank DESC; -- 给trank乘以1.5放大权重,模拟原>>>的效果
如果想要更接近原>>>的权重,也可以把trank的计算改成叠加多次权重:
MATCH(post_title) AGAINST ('>("weld") >("weld") >("weld") >(weld)' IN BOOLEAN MODE) AS trank
内容的提问来源于stack exchange,提问作者Jansen
相关产品推荐
相关产品推荐

