您现在的位置是:首页 > 程序 > mysql网站首页mysql

mysql全文检索 match() against

  • 袁志蒙
  • 2017-05-24 12:32:11
  • 3307 次阅读
一个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);


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


TAG: MySQL

文章评论 (0)

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


Top