MySQL模糊查询全文索引
全文索引
---------------------------------------------------------------
# MySQL-Front Dump 2.5
#
# Host: localhost Database: test
# --------------------------------------------------------
# Server version 4.0.12-nt-log
---------------------------------------------------------------
# MySQL-Front Dump 2.5
#
# Host: localhost Database: test
# --------------------------------------------------------
# Server version 4.0.12-nt-log
#
# Table structure for table 't3'
#
CREATE TABLE `t3` (
`name` char(12) NOT NULL default '',
`name2` char(12) NOT NULL default '',
FULLTEXT KEY `name` (`name`,`name2`)
) TYPE=MyISAM;
`name` char(12) NOT NULL default '',
`name2` char(12) NOT NULL default '',
FULLTEXT KEY `name` (`name`,`name2`)
) TYPE=MyISAM;
#
# Dumping data for table 't3'
#
# Dumping data for table 't3'
#
INSERT INTO `t3` (`name`, `name2`) VALUES("1", "安换岚缮");
INSERT INTO `t3` (`name`, `name2`) VALUES("2", "不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("3", "不会吧1");
INSERT INTO `t3` (`name`, `name2`) VALUES("4", "不会吧 1");
INSERT INTO `t3` (`name`, `name2`) VALUES("5", "真的不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("6", "真的 不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("2", "不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("3", "不会吧1");
INSERT INTO `t3` (`name`, `name2`) VALUES("4", "不会吧 1");
INSERT INTO `t3` (`name`, `name2`) VALUES("5", "真的不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("6", "真的 不会吧");
mysql> SELECT * FROM t3;
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 1 ¦ 安换岚缮 ¦
¦ 2 ¦ 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 5 ¦ 真的不会吧 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
6 rows in set (0.01 sec)
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 1 ¦ 安换岚缮 ¦
¦ 2 ¦ 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 5 ¦ 真的不会吧 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
6 rows in set (0.01 sec)
# 查找词 "不会吧"
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧'IN BOOLEAN MODE);
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧'IN BOOLEAN MODE);
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
3 rows in set (0.00 sec)
# 查找以词 "不会吧" 开头的任意词句
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧*' IN BOOLEAN MODE);
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 6 ¦ 真的 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
+------+-------------+
4 rows in set (0.01 sec)
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧*' IN BOOLEAN MODE);
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 6 ¦ 真的 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
+------+-------------+
4 rows in set (0.01 sec)
# 查找以词 "不会吧" 开头的任意词句 并 去除词 "真的"
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('+不会吧* -真的' IN BOOLEAN MODE);
+------+----------+
¦ name ¦ name2 ¦
+------+----------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 3 ¦ 不会吧1 ¦
+------+----------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('+不会吧* -真的' IN BOOLEAN MODE);
+------+----------+
¦ name ¦ name2 ¦
+------+----------+
¦ 2 ¦ 不会吧 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 3 ¦ 不会吧1 ¦
+------+----------+
3 rows in set (0.00 sec)
在上例中,
我们可以看出 MySQL 的全文索引对双字节处理的支持还不太好,
¦ 5 ¦ 真的不会吧 ¦
这一行记录始终未能查询出来,
这是因为在西文中词是以一个空格为分隔的,
:(
希望在将来的版本中
MySQL 对此能有所改进
而用正则表达式也是会有问题的,
# 查找词 "不会吧"
mysql> SELECT * FROM t3 WHERE name2 REGEXP "不会吧";
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 1 ¦ 安换岚缮 ¦
¦ 2 ¦ 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
¦ 4 ¦ 不会吧 1 ¦
¦ 5 ¦ 真的不会吧 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
6 rows in set (0.00 sec)
# 查找以词 "不会吧" 开头的
mysql> SELECT * FROM t3 WHERE name2 REGEXP "^不会吧";
+------+----------+
¦ name ¦ name2 ¦
+------+----------+
¦ 2 ¦ 不会吧 ¦
¦ 3 ¦ 不会吧1 ¦
¦ 4 ¦ 不会吧 1 ¦
+------+----------+
3 rows in set (0.00 sec)
# 查找以词 "不会吧" 结束的
mysql> SELECT * FROM t3 WHERE name2 REGEXP "不会吧$";
+------+-------------+
¦ name ¦ name2 ¦
+------+-------------+
¦ 2 ¦ 不会吧 ¦
¦ 5 ¦ 真的不会吧 ¦
¦ 6 ¦ 真的 不会吧 ¦
+------+-------------+
3 rows in set (0.00 sec)