在本教學中,您將學習如何執行MySQL布爾全文搜索。 此外,您將學習如何使用布爾運算符來組成非常複雜的搜索查詢。
MySQL簡介全文檢索
除了自然語言全文搜索,MySQL還支持一種叫作布爾全文搜索的全文搜索的附加形式。在布爾模式中,MySQL搜索詞而不是自然語言搜索中的概念。
MySQL允許您根據布爾模式下的非常複雜的查詢以及布爾運算符執行全文搜索。這就是為什麼布爾模式的全文搜索適合有經驗的用戶。
要在布爾模式下執行全文搜索,您可以在AGAINST
運算式中使用IN BOOLEAN MODE
修飾符。 以下示例說明如何搜索產品名稱中包含單詞Truck
的產品。
SELECT productName, productline
FROM products
WHERE MATCH(productName)
AGAINST('Truck' IN BOOLEAN MODE )
執行上面查詢語句,得到以下結果 -
mysql> SELECT productName, productline
FROM products
WHERE MATCH(productName)
AGAINST('Truck' IN BOOLEAN MODE );
+------------------------+------------------+
| productName | productline |
+------------------------+------------------+
| 1940 Ford Pickup Truck | Trucks and Buses |
| 1940s Ford truck | Trucks and Buses |
+------------------------+------------------+
2 rows in set
返回產品名稱包含Truck
的兩個產品。
要查找產品名稱包含單詞Truck
但不包含Pickup
的行的產品,可以使用排除布爾運算符( -
),該運算符返回不包括Pickup
關鍵字的結果,如以下查詢:
SELECT productName, productline
FROM products
WHERE MATCH(productName) AGAINST('Truck -Pickup' IN BOOLEAN MODE );
執行上面查詢語句,得到以下結果 -
mysql> SELECT productName, productline
FROM products
WHERE MATCH(productName) AGAINST('Truck -Pickup' IN BOOLEAN MODE );
+------------------+------------------+
| productName | productline |
+------------------+------------------+
| 1940s Ford truck | Trucks and Buses |
+------------------+------------------+
1 row in set
MySQL布爾全文搜索運算符
下表說明了全文搜索布爾運算符及其含義:
操作符 | 描述 |
---|---|
+ |
包括,這個詞必須存在。 |
- |
排除,這個詞不能存在。 |
> |
包括並增加排名值。 |
< |
包括並降低排名值。 |
() |
將單詞分組成子運算式(允許將其包括,排除,排序等作為一個組)。 |
~ |
否定一個詞的排名值。 |
* |
通配符,在結尾的單詞 |
“” |
定義一個短語(與單個單詞列表相反,整個短語匹配包含或排除)。 |
以下示例說明如何在搜索查詢中使用布爾全文運算符:
要搜索包含兩個詞中至少一個詞的行:mysql
或tutorial
,可使用:mysql tutorial
;
要搜索包含兩個單詞的行:mysql
或tutorial
,可使用:+mysql +tutorial
;
要搜索包含單詞“mysql
”的行,但為含有“tutorial
”的行排列較高的排名:可使用:+mysql tutorial
;
要搜索包含單詞“mysql
”而不是“tutorial
”的行,可使用:+mysql -tutorial
;
要搜索包含單詞“mysql
”的行,如果包含單詞“tutorial
”,則將行排列,可使用:+mysql ~tutorial
要搜索包含單詞“mysql
”和“tutorial
”,或“mysql
”和“training
”的行以任何順序排列,但將包含“mysql tutorial
”的行高於“mysql training
”。可使用:+mysql +(>tutorial <training)
要查找包含以“my
”開頭的單詞的行,例如“mysql
”,“myspace
”等,請使用以下命令:my*
。
MySQL布爾全文搜索主要功能
- MySQL不按照布爾全文搜索中相關性降低的順序自動排序行。
- 要執行布爾查詢,InnoDB表需要MATCH運算式的所有列具有
FULLTEXT
索引。 請注意,MyISAM表不需要這個,儘管搜索速度相當慢。 - MySQL在InnoDB表上的搜索查詢上不支持多個布爾運算符,例如
++mysql
。 如果這樣做,MySQL將返回錯誤。 但是,MyISAM的行為方式不一樣。它忽略其他運算符並使用最接近搜索詞的運算符,例如+ -mysql將成為-mysql
。 - InnoDB全文搜索不支持尾部加號(
+
)或減號(-
)號。 它只支持前加號或減號。 如果搜索字是mysql+
或mysql-
,MySQL將會報錯。 另外,以下帶有通配符的正加號或負號無效:+*
,+-
- 不適用
50%
閾值。順便說一下,50%
閾值意味著如果一個詞出現在超過50%
的行中,MySQL將在搜索結果中忽略它。
在本教學中,我們向您展示了如何使用許多有用的布爾運算符執行MySQL布爾全文搜索。