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

时间:2017-09-26 08:17:01

标签: 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

结果将过滤&基于键入关键字排序。

2 个答案:

答案 0 :(得分:0)

如果1 - 列不包含您的任何搜索字词,则您的布尔表达式将为title,如果不包含0,则为asc。因此,您必须在desc之前将1更改为0以订购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 列,则可能需要使用实际相关性分数来订购结果。它应该(可能)给你一个比#34更好的订单;它包含任何搜索词"。尝试例如

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

这将要求您在e上添加单独的全文索引。

您还应该了解全文搜索的限制和选项。例如,默认情况下,索引不包含短于3 (for InnoDB)4 (for MyISAM)的字词,因此lathe不会包含在索引中,也无法找到。此外,title LIKE '%la fontaine e%'等常见字词会被stopword list排除(该止损字列表的默认内容会因MyISAM和InnoDB而显着不同)。此外,全文索引将越慢,它将找到更多的结果。因此,搜索单个罕见单词的速度非常快,而搜索几个关键单词的组合会导致大部分数据丢失(取决于表格的大小)变得非常缓慢。

附注:'Isabella Fontaine est'与查找单独的字词不同 - 它会找到例如match against也是。您的Fontaine - 部分也会包含结果,因为它包含单词title LIKE '%la fontaine%'。虽然仅在搜索超过2个字时才有效,否则'Isabella Fontainebleau'会找到la,其中不包含fontaine<button>字样。我不确定这是你想要或期望的行为。

答案 1 :(得分:0)

我已经为这些列定义了全文索引。 现在查询变为

SELECT title
FROM team
WHERE 
MATCH(title, title_fr, meta_tags, summary, seo_keyword, seo_description) AGAINST('(+la +fontaine +eau) (la fontaine eau)' IN BOOLEAN MODE) 
OR title LIKE '%la fontaine eau%' 
ORDER BY MATCH(title) AGAINST('(+la +fontaine +eau) (la fontaine eau)' IN BOOLEAN MODE) DESC;

但第一行是

- Fontaine à eau pour chien et chat Fresh & Clear Dogit Design

并希望从第二个到第二个开始行

- La fontaine à eau pour chats et chiens Vega
- La fontaine à eau Edelvia Home 11L
- La fontaine à eau Edelvia Home 11L livrée à domicile

enter image description here