SELECT title
FROM team
WHERE
title LIKE '%la fontaine e%' OR
MATCH(title, title_fr, summary, seo_keyword, seo_description) AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE)
ORDER BY title LIKE '%la%' OR title LIKE '%fontaine%' OR title LIKE '%e%' ASC;
结果
我想弹出结果,以便以下行先出现
La fontaine à eau Edelvia Home 11L
La fontaine à eau Edelvia Home 11L livrée à domicile
结果将根据输入的关键字进行过滤和排序。
最佳答案
如果 title
列不包含任何搜索词,则 bool 表达式将为 1
,否则为 0
。因此,您必须将 asc
更改为 desc
,以便将 1
排在 0
之前。
但是 like
不会考虑单词边界,因此对于任何包含 e
的值,LIKE '%e%'
均成立 任何地方(例如家
)。这意味着,即使您确实将 asc
更改为 desc
,至少对于示例数据,您仍然会得到任意顺序,如下所示每行实际上都在某处包含 e
,因此您的 bool 表达式对于所有结果都将为 true。
您可能需要考虑例如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'
也是如此。并且您的匹配
部分也将包含结果,因为它包含单词Fontaine
。尽管这只在您搜索超过 2 个单词时才成立,否则 title LIKE '%la fontaine%'
将找到 'Isabella Fontainebleau'
,其中不包含单词la
或 fontaine
。我不确定这是否是您想要或期望的行为。
关于MYSQL高级搜索-使用LIKE运算符进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46421200/