MYSQL高级搜索-使用LIKE运算符进行排序

标签 mysql sql-order-by sql-like

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;

结果

enter image description here

我想弹出结果,以便以下行先出现

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) ,因此 ela 不会包含在索引中并且无法找到。此外,一些常见单词(如 the)通过 stopword list 被排除。 (对于 MyISAM 和 InnoDB,该停用词列表的默认内容将显着不同)。此外,全文索引找到的结果越多,速度就会越慢。因此,搜索单个稀有词的速度非常快,而搜索将返回大部分数据的几个关键词的组合可能(取决于表的大小)变得非常慢。

旁注:title LIKE '%la fontaine e%' 与查找单独的单词不同 - 它会找到例如'Isabella Fontaine est' 也是如此。并且您的匹配部分也将包含结果,因为它包含单词Fontaine。尽管这只在您搜索超过 2 个单词时才成立,否则 title LIKE '%la fontaine%' 将找到 'Isabella Fontainebleau',其中不包含单词lafontaine。我不确定这是否是您想要或期望的行为。

关于MYSQL高级搜索-使用LIKE运算符进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46421200/

相关文章:

php - 如何使用 LIKE 编写查询来接受特殊字符?

MYSQL自动增量依赖于另一个表

mysql - 具有 ROW_FORMAT=FIXED 和 varchar/text 字段的 MyISAM 表会发生什么情况?

php - PhP中类和OOP的使用

mysql - 如何在同一列中创建2个order by

MySQL:使用 LIKE 或 FULLTEXT 优化搜索

MYSQL WHERE LIKE 语句

mysql - 如何获取 MySQL 中最后一次出现字符之前的所有内容?

sql - Sql Server 2008 View 中的 ORDER BY

mysql - SQL Order By 通过连接表