2017-09-26 90 views
0
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; 

導致MYSQL提前搜索 - 爲了與LIKE操作

enter image description here

,我想彈出的結果,使得以下行來第一

La fontaine à eau Edelvia Home 11L 
La fontaine à eau Edelvia Home 11L livrée à domicile 

,結果會過濾&根據輸入關鍵字進行排序。

回答

0

如果title列不包含任何搜索字詞,那麼您的布爾表達式將爲1,如果不包含您的搜索字詞,則爲0。因此,您必須更改ascdesc才能在0之前訂購1

like不會考慮單詞邊界,所以LIKE '%e%'是真正爲包含e任何地方(例如home)的任意值。這意味着即使你更改ascdesc,至少對於你的示例數據,你仍然會得到一個任意的順序,因爲每一行實際上包含了一個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)的字,因此ela將不包含在索引中,並且找不到。此外,通過stopword list排除一些常見詞(如the)(對於MyISAM和InnoDB,該停用詞列表的默認內容將顯着不同)。而且,全文索引越慢,查找結果越多。因此,搜索單個罕見單詞的速度非常快,而搜索幾個能夠返回大部分數據的關鍵字的組合(取決於您的表的大小)會變得非常緩慢。

附註:title LIKE '%la fontaine e%'與查找單詞不同 - 它會找到例如'Isabella Fontaine est'。並且您的match against-部分也將包含結果,因爲它包含單詞Fontaine。雖然這隻適用於搜索超過2個單詞,否則,title LIKE '%la fontaine%'將找到'Isabella Fontainebleau',其中不包含單詞lafontaine。我不確定這是否是您想要或期望的行爲。

+0

現在查詢成爲 SELECT標題 FROM隊 WHERE MATCH(title,title_fr,meta_tags,summary,seo_keyword,seo_description)反對('(+ la + fontaine + eau)(la fontaine eau)'BOOLEAN MODE) 或標題LIKE'%la fontaine eau%' ORDER BY MATCH(title)AGAINST('(+ la + fontaine + eau)(la fontaine eau)'布爾模式)DESC; 但第一行是 - 封丹淡倒Chien等聊天鮮清除Dogit設計 和慾望行從第二到第三 - 拉封丹香水倒聊天等CHIENS維加 - 拉封丹淡Edelvia首頁11L - La fontaineàeau Edelvia Home 11Llivréeàdomicile –

+0

如果我正確理解您的後續行爲:如果您搜索「la fontaine eau」,單詞「la」(也許,如果您使用MyISAM,單詞「eau 「)(默認情況下)被忽略,因爲它比3或4短(我提到在限制部分中,你可能錯過了它;它還包括配置設置的鏈接)。如果您希望它對全文評分有任何影響,則必須更改配置選項*和*,然後重新構建索引。如果那不是你的問題,你必須更多地澄清它,因爲那時我還不明白。 – Solarflare

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

+0

如果我正確理解你的後續行動:如果你搜索「la fontaine eau」,那麼單詞「la」(也許,如果你使用MyISAM,單詞「eau」)是(默認情況下)忽略,因爲它是短於3或4(我提到在限制部分中,您可能錯過了它;它還包括指向配置設置的鏈接)。如果您希望它對全文評分有任何影響,則必須更改配置選項,然後重新構建索引。如果那不是你的問題,你必須更多地澄清它,因爲那時我還不明白。 – Solarflare