Mysql
Mysql InnoDB Full-Text Search IN BOOLEAN MODE 按相關性遞減的順序對行進行排序
在Boolean Full-Text Searches的官方文件中:
布爾全文搜尋具有以下特徵:
- 它們不會自動按照相關性遞減的順序對行進行排序。
但是,在執行全文搜尋時
IN BOOLEAN MODE
(mysql v8.0.23),它們按相關性按相關性遞減的順序排序,而不必使用ORDER BY score
SELECT product_category_id, MATCH(product.barcode, product.brand_name, product.generic_name) AGAINST('paracetamol*' IN BOOLEAN MODE) as score FROM product WHERE MATCH(product.barcode, product.brand_name, product.generic_name) AGAINST('paracetamol*' IN BOOLEAN MODE);
結果:
+---------------------+--------------------+ | product_category_id | score | +---------------------+--------------------+ | 97 | 3.4546611309051514 | | 91 | 3.4546611309051514 | | 91 | 3.4546611309051514 | | 91 | 3.4546611309051514 | | 123 | 3.4546611309051514 | | 123 | 3.4546611309051514 | | 91 | 3.4546611309051514 | | 91 | 1.7273305654525757 | | 97 | 1.7273305654525757 | | 97 | 1.7273305654525757 |
我在這裡錯過了什麼?
(一個猜想)
即使沒有
ORDER BY
. 但是,這通常是實現的產物,而不是保證的順序。曾經是
GROUP BY
自動對結果進行排序,就好像有匹配一樣ORDER BY
。然而,作為保證的存在阻礙了優化器。有了適當的INDEX
,這樣的分組將繼續有序。但對於其他情況,優化器寧願使用記憶體中的雜湊表;這基本上保證了某種隨機順序;此外,它使獲得訂單成為一項額外的工作。所以,我想,該手冊為未來的優化打開了大門。
規則:如果您想要特定的訂單,請指定
ORDER BY
. 如果優化器發現程式碼可以(或可以)保證訂單而不需要做任何額外的工作,它就會這樣做。PS,在過去,您可以
GROUP BY's
通過說ORDER BY NULL
. (笨拙的?)