首頁 > 資料庫 > mysql教程 > MySQL基礎教學10 — 函數之全文搜尋功能

MySQL基礎教學10 — 函數之全文搜尋功能

黄舟
發布: 2017-02-24 11:44:32
原創
1774 人瀏覽過

語法:

  •  MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])

。 MySQL中的全文索引類型FULLTEXT的索引。  FULLTEXT 索引只可用於 MyISAM表;他們可以從CHAR、 VARCHAR或TEXT欄位中作為CREATE TABLE語句的一部分建立,或是隨後使用ALTER TABLE 或 CREATE INDEX被加入。對於較大的資料集,將你的資料輸入一個沒有FULLTEXT索引的表中,然後建立索引, 其速度比把資料輸入現有FULLTEXT索引的速度更為快。

全文搜尋同MATCH()函數一起執行。

mysql> CREATE TABLE articles (    
->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,    
->   title VARCHAR(200),    
->   body TEXT,    
->   FULLTEXT (title,body)    
-> );Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO articles (title,body) VALUES    
-> ('MySQL Tutorial','DBMS stands for DataBase ...'),    
-> ('How To Use MySQL Well','After you went through a ...'),    
-> ('Optimizing MySQL','In this tutorial we will show ...'),    
-> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),    
-> ('MySQL vs. YourSQL','In the following database comparison ...'),    
-> ('MySQL Security','When configured properly, MySQL ...');Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles    
-> WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body          |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...            |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
登入後複製

MATCH()函數對於一個字串執行資料庫內的自然語言搜尋。一個資料庫就是1套1個或2個包含在FULLTEXT內的欄位。搜尋字串作為對AGAINST()的參數而被給定。對於表中的每一行, MATCH() 傳回相關值,即, 搜尋字串和 MATCH()表中指定該行文字之間的一個相似性測量列中。

在預設狀態下, 搜尋的執行方式為不區分大小寫方式。然而,你可以透過對編入索引的列使用二進位排序方式執行區分大小寫的全文搜尋。 例如,可以向一個使用latin1字元集的欄位給定latin1_bin 的排序方式,對於全文搜尋區分大小寫。

如上述所舉例子,當MATCH()被用在一個 WHERE 語句中時,相關值是非負浮點數。零相關的意思是沒有相似性。相關性的計算是基於該行中單字的數目, 該行中獨特子的數目,資料庫中單字的總數,以及包含特殊單字的文件(行)數目。

對於自然語言全文搜索,要求MATCH() 函數中命名的列和你的表中一些FULLTEXT索引中包含的列相同。對於前述問訊, 注意,MATCH()函數(題目及全文)中所命名的欄位和文章表的FULLTEXT索引中的欄位相同。若要分別搜尋題目和全文,應該對每個欄位建立FULLTEXT索引。

或也可以執行布林搜尋或使用查詢擴充進行搜尋。

上面的例子基本上顯示瞭如何使用返回行的相關性順序漸弱的MATCH()函數。而下面的例子則展示了怎樣明確地檢索相關值。回傳行的順序是不定的,原因是  SELECT 語句不包含 WHERE或ORDER BY 子句:

mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial')    
-> FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
|  1 |                        0.65545833110809 |
|  2 |                                       0 |
|  3 |                        0.66266459226608 |
|  4 |                                       0 |
|  5 |                                       0 |
|  6 |                                       0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)
登入後複製

下面的範例則較為複雜。詢問傳回相關值,同時將行依照相關性漸弱的順序排序。要達到這個結果,你應該兩次指定MATCH(): 一次在 SELECT 清單中而另一次在 WHERE子句中。這不會造成額外的內務操作,原因是MySQL 最佳化程式註意到兩個MATCH()呼叫是相同的,因此只會啟動一次全文搜尋程式碼。

mysql> SELECT id, body, MATCH (title,body) AGAINST    
-> ('Security implications of running MySQL as root') AS score    
-> FROM articles WHERE MATCH (title,body) AGAINST    
-> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
登入後複製

表中有2行(0.00 秒)

MySQL FULLTEXT 執行將任何單字字元原形 (字母、數字和底線部分)的序列視為一個單字。這個序列或許也包含單引號 ('),但在一行中不會超過一個。 這意味著 aaa'bbb 會被視為一個單字,而 aaa''bbb則被視為2個單字。位於單字前後的單引號會被FULLTEXT分析程式去掉; 'aaa'bbb' 會變成   aaa'bbb。

FULLTEXT分析程式會透過尋找某些分隔符號來確定單字的起始位置和結束位置,例如' ' (間隔符號)、 , (逗號)以及 . (句號)。假如單字沒有被分隔符號分開,(例如在中文裡 ), 則 FULLTEXT 分析程式不能確定一個字的起始位置和結束位置。為了能夠在這樣的語言中向FULLTEXT 索引添加單字或其它編入索引的術語,你必須對它們進行預處理,使其被一些諸如"之類的任意分隔符分隔開。

一些詞在全文搜尋會被忽略: