全文索引需要特殊的查询语法。有没有索引都可以进行全文检索,但是存在索引时会提高匹配的速度。全文索引的索引通过特殊的结构存储以便于找到文档中包含搜索关键字对应的内容。在我们日常生活中,最常见的全文检索就是网络搜索引擎。虽然,网络搜索引擎的数据里十分庞大,并且通常也不会使用关系型数据库,但是原理是相似的。

全文索引支持通过基于字符(CHAR、VARCHAR 和 TEXT 类型的列)的检索,也可以支持自然语言模式(Natural Language Mode, 默认)和布尔模式 (Boolean Mode)。例如我们搜索“数据库引擎”的时候,内容中包括“数据库”、“引擎”和“数据库引擎”的内容都会检索出来。全文索引的实现有大量的限制,而且十分复杂。但是由于内置在MySQL服务端,而且对很多应用都能够满足要求,因此被广泛使用。

在MySQL5.6之前的版本中,只有 MyISAM 存储引擎支持全文索引。创建全文索引需要指定列标记为全文索引,如下面的 content 列。

CREATE TABLE t_news (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,content TEXT,author VARCHAR(32),title VARCHAR(128),  FULLTEXT (content)) ENGINE=InnoDB;
CREATE TABLE t_news (  id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,content TEXT,author VARCHAR(32),title VARCHAR(128),  FULLTEXT KEY idx(content) WITH PARSER ngram) ENGINE=InnoDB;
INSERT INTO `t_news` (`id`, `content`, `author`, `title`) VALUES ('1', '我有一个数据库和引擎', '岛上码农', '数据库引擎');
SELECT * FROM t_news WHERE MATCH (content) AGAINST ('数据 引擎' IN NATURAL LANGUAGE MODE)
INSERT INTO `t_news`(`id`, `content`, `author`, `title`) VALUES (2,'我有一个数据库','岛上码农','数据库')
SELECT *, MATCH (content) AGAINST ('数据 引擎' ) AS relevanceFROM t_news WHERE MATCH (content) AGAINST ('数据 引擎' ) ORDER BY relevance ASC

布尔模式可以做更多的控制,例如包括使用+号保留匹配结果和使用-号排除匹配结果,下面的就匹配了数据,而排除了包含引擎的数据。更多操作符可以参考 MySQL 的官方文档:全文索引操作符。

SELECT * FROM t_news WHERE MATCH (content) AGAINST ('+数据* -引擎' IN BOOLEAN MODE);

更多相关文章

  1. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  2. [android源码下载索引贴】微信+二维码那都不是事......
  3. android EditText使用指南
  4. android触控,先了解MotionEvent
  5. 系出名门 Android(安卓)系列文章索引
  6. 系出名门 Android(安卓)系列文章索引
  7. Android(安卓)Accounts Api使用指南
  8. 系出名门 Android(安卓)系列文章索引
  9. Android(安卓)RoboGuice 使用指南(13):RoboGuice 功能描述

随机推荐

  1. golang如何封装路由
  2. golang和python的区别
  3. golang和c的区别是什么?
  4. golang如何防止意外崩溃
  5. golang可以写安卓吗
  6. golang反射有啥用?
  7. golang如何定义一个二维数组
  8. Golang如何接收前端的参数
  9. golang判断是文件还是文件夹
  10. golang底层是c语言吗?