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
结果将过滤&基于键入关键字排序。
答案 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)的字词,因此la
或the
不会包含在索引中,也无法找到。此外,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