mysql全文检索 match() against

袁志蒙 次浏览

摘要:一个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);


这样就通过修改现有的表来添加全文搜索功能。


随机新闻

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~