如果title-列不包含您的任何搜索词,您的布尔表达式将为1,否则为0。因此,您必须将asc 更改为desc 才能在0 之前订购1。
但like 不会考虑字边界,因此LIKE '%e%' 对于包含e 任何位置 的任何值都是正确的(例如home)。这意味着即使您确实将asc 更改为desc,至少对于您的示例数据,您仍然会得到任意顺序,因为每一行确实在某处包含e ,因此您的布尔表达式对所有结果都为真。
您可能需要考虑例如order by (title LIKE '%la%') + (title LIKE '%fontaine%') + (title LIKE '%e%') desc 或类似的东西,所以更多(部分)关键字匹配会导致更好的位置。否则,添加更多关键字可能会使您的订单变得更糟:搜索"fontaine" 订单符合预期,搜索"fontaine e" 再次没有订单。
如果您确实想要尊重单词边界,那么如果您基本上想要进行全文搜索,优先考虑title 列进行排序,您可能需要使用实际相关性分数来对结果进行排序。它应该(可能)给你一个比“它包含任何搜索词”更好的顺序。尝试例如
order by MATCH(title)
AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC
或
order by MATCH(title)
AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC,
MATCH(title, title_fr, summary, seo_keyword, seo_description)
AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC
或
order by MATCH(title)
AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) * 5
+ MATCH(title, title_fr, summary, seo_keyword, seo_description)
AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC
这将要求您在 title 上添加单独的全文索引。
您还应该了解全文搜索的限制和选项。例如,默认情况下,索引将不包含比3 (for InnoDB) 或4 (for MyISAM) 短的单词,因此e 或la 将不会包含在索引中并且无法找到。此外,像the 这样的一些常用词通过stopword list 被排除在外(该停用词列表的默认内容对于MyISAM 和InnoDB 会有很大不同)。此外,全文索引会越慢,它会找到更多的结果。因此,搜索单个稀有词非常快,而搜索将返回大部分数据的几个关键词的组合可能会(取决于表的大小)变得非常缓慢。
附注:title LIKE '%la fontaine e%' 与查找单独的单词不同 - 它会查找例如'Isabella Fontaine est' 也是。并且您的match against-part 也将包含结果,因为它包含单词Fontaine。虽然这仅在您搜索超过 2 个单词时才成立,否则,title LIKE '%la fontaine%' 将找到不包含单词 la 或 fontaine 的 'Isabella Fontainebleau'。我不确定这是否是您想要或期望的行为。