前言

其实全文检索在MySQL里面很早就支持了,只不过一直以来只支持英文。缘由是他从来都使用空格来作为分词的分隔符,而对于中文来讲,显然用空格就不合适,需要针对中文语义进行分词。这不,从MySQL 5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。

在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小,比如,

[mysqld]ngram_token_size=2

示例表结构:

CREATE TABLE articles (   id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,   titleVARCHAR(200),   body TEXT,   FULLTEXT (title,body) WITH PARSER ngram  ) ENGINE=InnoDBCHARACTER SET utf8mb4;
mysql> select * from articles\G***************************1. row ***************************  id: 1title: 数据库管理 body: 在本教程中我将向你展示如何管理数据库***************************2. row ***************************  id: 2title: 数据库应用开发 body: 学习开发数据库应用程序***************************3. row ***************************  id: 3title: MySQL完全手册 body: 学习MySQL的一切***************************4. row ***************************  id: 4title: 数据库与事务处理 body: 系统的学习数据库的事务概论***************************5. row ***************************  id: 5title: NoSQL精髓 body: 学习了解各种非结构化数据库***************************6. row ***************************  id: 6title: SQL 语言详解 body: 详细了解如果使用各种SQL6 rows inset (0.00 sec)
mysql> SETGLOBAL innodb_ft_aux_table="new_feature/articles";Query OK, 0 rows affected (0.00 sec)
mysql> SELECT *FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20,10;+------+--------------+-------------+-----------+--------+----------+| WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID| POSITION |+------+--------------+-------------+-----------+--------+----------+| 中我 |   2 |   2 |   1 |  2 |  28 || 习m |   4 |   4 |   1 |  4 |  21 || 习了 |   6 |   6 |   1 |  6 |  16 || 习开 |   3 |   3 |   1 |  3 |  25 || 习数 |   5 |   5 |   1 |  5 |  37 || 了解 |   6 |   7 |   2 |  6 |  19 || 了解 |   6 |   7 |   2 |  7 |  23 || 事务 |   5 |   5 |   1 |  5 |  12 || 事务 |   5 |   5 |   1 |  5 |  40 || 何管 |   2 |   2 |   1 |  2 |  52 |+------+--------------+-------------+-----------+--------+----------+10 rows in set (0.00 sec)

接下来,我来进行一系列检索示范,使用方法和原来英文检索一致。

一、自然语言模式下检索:

1、得到符合条件的个数,

mysql>SELECT COUNT(*) FROM articles-> WHERE MATCH (title,body) AGAINST ('数据库' IN NATURALLANGUAGE MODE);+----------+| COUNT(*) |+----------+|  4 |+----------+1 row in set (0.05 sec)
 mysql>SELECT id, MATCH (title,body) AGAINST ('数据库' IN NATURAL LANGUAGE MODE) AS score FROM articles;+----+----------------------+| id| score    |+----+----------------------+| 1 | 0.12403252720832825 || 2 | 0.12403252720832825 || 3 |     0 || 4 | 0.12403252720832825 || 5 | 0.062016263604164124|| 6 |     0 |+----+----------------------+6rows in set (0.00 sec)

1、匹配既有管理又有数据库的记录,

mysql> SELECT * FROM articles WHERE MATCH (title,body)  ->  AGAINST ('+数据库 +管理' IN BOOLEAN MODE);+----+------------+--------------------------------------+| id| title  | body         |+----+------------+--------------------------------------+| 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库  |+----+------------+--------------------------------------+1 rowin set (0.00 sec)
mysql> SELECT * FROM articles WHERE MATCH (title,body)  ->  AGAINST ('+数据库 -管理' IN BOOLEAN MODE);+----+------------------+----------------------------+| id| title    | body      |+----+------------------+----------------------------+| 2 | 数据库应用开发  | 学习开发数据库应用程序   || 4 | 数据库与事务处理 | 系统的学习数据库的事务概论  || 5 | NoSQL 精髓  | 学习了解各种非结构化数据库  |+----+------------------+----------------------------+3 rows in set (0.00 sec)
mysql> SELECT * FROM articles WHERE MATCH (title,body)  ->  AGAINST ('>数据库 +MySQL' INBOOLEAN MODE);+----+---------------+-----------------+| id| title   | body   |+----+---------------+-----------------+| 3 | MySQL完全手册 |学习MySQL的一切 |+----+---------------+-----------------+1 rowin set (0.00 sec)
mysql> SELECT * FROM articles  ->  WHERE MATCH (title,body)  ->  AGAINST ('数据库' WITH QUERY EXPANSION);+----+------------------+--------------------------------------+| id| title   | body         |+----+------------------+--------------------------------------+| 1 | 数据库管理  | 在本教程中我将向你展示如何管理数据库  || 4 | 数据库与事务处理 | 系统的学习数据库的事务概论    || 2 | 数据库应用开发  | 学习开发数据库应用程序     || 5 | NoSQL 精髓  | 学习了解各种非结构化数据库    || 6 | SQL 语言详解  | 详细了解如果使用各种SQL     || 3 | MySQL完全手册  | 学习MySQL的一切      |+----+------------------+--------------------------------------+6 rows in set (0.01 sec)

总结

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  3. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  4. android从服务器下载文件(php+apache+win7+MySql)
  5. 【有图】android通过jdbc连接mysql(附文件)
  6. Android深度好文锦集
  7. android 通过php 连接 mysql
  8. android通过php连接mysql数据库!!!!
  9. 关于Android连接远程数据库(mysql、oracle)

随机推荐

  1. 详解php中的几种常见排序方法(附代码)
  2. PHP递归算法的应用(含示例)
  3. PHP实例计算经纬坐标间的距离
  4. 处理PHP strtotime的BUG
  5. php array_filter函数的使用(详解)
  6. 如何用PHP获取当前页面完整URL地址
  7. 区别PHP中new self() 和 new static()
  8. php round函数的实际应用(附示例)
  9. PHP自定义函数xmlToArray的实例解析
  10. 在php 中使用PDO MySQL的扩展