摘要:一个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);
这样就通过修改现有的表来添加全文搜索功能。