摘要:一個SELECT查詢中的LIKE語句來執行這種查詢,盡管這種方法可行, 但對于全文查找而言,這是一種效率極端低下的方法,尤其在處理大量數據的時候。 上面這句話 我是在網上看到的,說得挺有道理的, mysql 本身提供了一種叫做全文搜索的技術...
一個SELECT查詢中的LIKE語句來執行這種查詢,盡管這種方法可行,
但對于全文查找而言,這是一種效率極端低下的方法,尤其在處理大量數據的時候。
上面這句話 我是在網上看到的,說得挺有道理的, mysql 本身提供了一種叫做全文搜索的技術,
全文搜索 比起 索引 我覺得更加全面, 索引只對某一個字段,然后在查詢時候使用 like 配合。
全文搜索它可以設置多個字段進行搜索,可以說是比起 select .... like 高級吧。
好了, 既然 全文搜索 有這樣的優點,下面我們來看看 是否真的如此。
下面做一個測試例子:
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) );
上面這是創建表的 mysql 語句, 其中最后一句 FULLTEXT (title,body)
就是為 title 和 body 創建一個 全文搜索,也就是 以后 方便搜索 標題 和
標題正文的內容。復制語句上去 就成功創建一張表了。
查看一下 全文搜索 是否被創建, 下面語句作用是:查看表的 主鍵, 索引, 全文搜索
show indexes from 表名
show indexes from articles;
+----------+------------+----------+--------------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+----------+------------+----------+--------------+-------------+
| articles | 0 | PRIMARY | 1 | id |
| articles | 1 | title | 1 | title |
| articles | 1 | title | 2 | body |
+----------+------------+----------+--------------+-------------+
3 rows in set (0.01 sec)
可以看到 成功創建了, Key_name名字叫做 title , 它的字段列名Column_name是 title 和 body
=========================================================
下面為 表 添加數據內容, 好讓我們進行測試。
INSERT INTO `articles` (`title`, `body`) VALUES ('aaaa qwerrt', '1111 '); INSERT INTO `articles` (`title`, `body`) VALUES ('bbbb', '2222 aaaa eeeee'); INSERT INTO `articles` (`title`, `body`) VALUES ('cccc', '3333 dadaafdqew'); INSERT INTO `articles` (`title`, `body`) VALUES ('dddd aaaa', '4444 '); INSERT INTO `articles` (`title`, `body`) VALUES ('eeee', '5555 abcde'); INSERT INTO `articles` (`title`, `body`) VALUES ('ffff', '6666 test');
select * from articles;
+----+-------------+-----------------+
| id | title | body |
+----+-------------+-----------------+
| 1 | aaaa qwerrt | 1111 |
| 2 | bbbb | 2222 aaaa eeeee |
| 3 | cccc | 3333 dadaafdqew |
| 4 | dddd aaaa | 4444 |
| 5 | eeee | 5555 abcde |
| 6 | ffff | 6666 test |
+----+-------------+-----------------+
6 rows in set
添加好數據庫, 下面我們就使用 全文搜索 提供的 查詢語句 進行測試。
=================================================
使用語句的模版如下:
SELECT 表字段 FROM 表名 WHERE MATCH (全文搜索表字段) AGAINST ('搜索字符串');
下面 搜索 title 和 body 包含 "aaaa" 這個字符串
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('aaaa');
+----+-------------+-----------------+
| id | title | body |
+----+-------------+-----------------+
| 1 | aaaa qwerrt | 1111 |
| 4 | dddd aaaa | 4444 |
| 2 | bbbb | 2222 aaaa eeeee |
+----+-------------+-----------------+
3 rows in set
MATCH 相當于要找的列, 而 AGAINST 就是要找的內容。
比起 like 有點不一樣
而且 match ... against 還提供很多 操作, 對數據 進一步過濾,
一般可以作為 比較精確的搜索,
例如下面的這個例子: 搜索title和body中包含 "aaaa"字符串 ,但是不能有 "dddd" 的結果。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+aaaa -dddd' IN BOOLEAN MODE);
+----+-------------+-----------------+
| id | title | body |
+----+-------------+-----------------+
| 1 | aaaa qwerrt | 1111 |
| 2 | bbbb | 2222 aaaa eeeee |
+----+-------------+-----------------+
2 rows in set
你會發現 可以看到 包含“dddd”這個結果被過濾掉了
fulltext 還提供了 更加多的邏輯搜索,也就是一些 模糊搜索 等等,要求更加高的
匹配字符搜索, 大家可以上 mysql 官方網站查看。
=============================================================
上面 建立全文搜索 是在 建立表的同時建立的, 如果你已經建好表了, 但是想加入
這個功能的話, 可以使用下面語句
alter table articles add fulltext index(title,body);
為了演示,我先把剛才的刪除掉
drop index title on articles;
再查看一下, 已經被刪除了。
show indexes from articles;
再為表添加 fulltext 上去
alter table articles add fulltext index(title,body);
這樣就通過修改現有的表來添加全文搜索功能。