文档章节

mysql_全文搜索+match against_已迁移

辣条拌鱼翅
 辣条拌鱼翅
发布于 2015/08/27 08:11
字数 1157
阅读 60
收藏 4


一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,

但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。

-------------------
上面这句话 我是在网上看到的, 说得挺有道理的, mysql 本身提供了一种叫做全文搜索的技术吧,

不过这好像从后来的版本才有的, 比较旧的版本不支持,不过那是很早期的版本了,

现在大家使用的版本 应该都支持的。我现在使用 mysql6.0.4 来演示

全文搜索 比起 索引 我觉得更加全面, 索引只对某一个字段,然后在查询时候使用 like 配合。

全文搜索它可以设置多个字段进行搜索,可以说是比起 select .... like 高级吧。

好了, 既然 全文搜索 有这样的优点,下面我们来看看 是否真的如此。

下面提供的测试例子,是 mysql 手册上面的一个例子

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 表名

mysql> 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

    ('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 ...');

mysql> select * from articles;
+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...             |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  3 | Optimizing MySQL      | In this tutorial we will show ...        |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
+----+-----------------------+------------------------------------------+
6 rows in set (0.00 sec)

添加好数据库, 下面我们就使用 全文搜索 提供的 查询语句 进行测试。

=================================================

使用语句的模版如下:

SELECT 表字段 FROM 表名 WHERE MATCH (全文搜索表字段) AGAINST ('搜索字符串');

下面 搜索 title 和 body 包含 database 这个字符串

 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 相当于要找的列, 而  AGAINST 就是要找的内容。

比起 like 有点不一样

而且 match ... against 还提供很多 操作, 对数据 进一步过滤,

一般可以作为 比较精确的搜索,

例如下面的这个例子: 搜索title和body中包含 MySQL ,但是不能有 YourSQL 的结果。

 SELECT * FROM articles WHERE MATCH (title,body)

    AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

------------------

|  5 | MySQL vs. YourSQL     | In the following database comparison ... |

你会发现 可以看到 这个结果被过滤掉了

fulltext 还提供了 更加多的逻辑搜索,也就是一些 模糊搜索 等等,要求更加高的
匹配字符搜索, 大家可以上 mysql 官方网站查看。

=============================================================

上面 建立全文搜索 是在 建立表的同时建立的, 如果你已经建好表了, 但是想加入
这个功能的话, 可以使用下面语句

mysql> alter table articles add fulltext index(title,body);

--------------------

为了演示,我先把刚才的删除掉

mysql> drop index title on articles;

再查看一下, 已经被删除了。
mysql> show indexes from articles;

再为表添加 fulltext 上去
mysql> alter table articles add fulltext index(title,body);

看到了吧, 这样就通过修改现有的表来添加全文搜索功能, 希望这个教程可以帮你
日后使用到这个搜索功能。

例子1: 链接地址

百度: 链接地址

本文转载自:http://shanmao.me/webback/sql/mysql-quan-wen-sou-suo-match

共有 人打赏支持
辣条拌鱼翅
粉丝 25
博文 268
码字总数 73301
作品 0
朝阳
程序员
MySQL全文索引Match Against与Like比较

1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引。对于FULLTEXT索引的内容可以使用MATCH()…AGAINST语法进行查询。 为了在InnoDB驱动的表...

3kqing
2016/06/27
251
0
基于mysql全文索引的深入理解

前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24。 Q:全文索引适用于什么场合? A:全文索引是目前实现大数据搜索的关键技术。 至于更详细的介绍请自行百度,本文不再阐述。 ----...

pureboys
2014/12/29
0
0
mysql全文索引加and条件问题

我有一个表,主要字段是content title tags,我给这3个字段加了全文索引,当我用sql搜索他们时候没有问题,可以出来结果,但是我要搜索某人下面的带有关键词的时候,结果就变成了0条记录,难道全文索...

徐智渊
2013/03/15
361
2
MySQL数据库索引

索引在数据库开发中有非常重要的作用,通过在表字段中建立索引可以优化查询,确保数据的唯一性,并且可以对任何全文索引字段中大量文本的搜索进行优化。在MySQL中主要有四类索引:主键索引、...

全栈coder
2017/02/26
0
0
中文全文检索

中文全文检索MySQL不支持中文全文检索,因为中文一句话是连着写的,不像英文单词间有空格分隔。解决办法就是中文分词(关于中文分词请参阅其它文章),如果你的MySQL是安装在Windows平台上的,...

史帝文
2016/12/27
14
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
21
5
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部