第一种最土的方法:使用like语句第二种用全文索引

有两种方法,第一种最土的方法:使用like语句第二种听涛哥说用全文索引,就在网上搜一下: 如何在MySQL中获得更好的全文搜索结果

mysql针对这一问题提供了一种基于内建的全文查找方式的解决方案。在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索,因为MySQL使用自然  语言来智能地对结果评级,以去掉不相关的项目。  这篇文章将向您讲述在MySQL中如何进行全文搜索。

在进行数据库查询时,有完整查询和模糊查询之分。  SELECT 字段 FROM 表 WHERE 某字段 Like 条件  其中关于条件,SQL提供了四种匹配模式:  1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。  比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'  将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。  另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件  SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'  若使用 SELECT * FROM [user] WHERE u_name LIKE '%三%猫%'  虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。  2,_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:  比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'  只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;  再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';  只找出“三脚猫”这样name为三个字且第一个字是“三”的;  3,[ ]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。  比如 SELECT * FROM [user] WHERE u_name LIKE '[张李王]三'  将找出“张三”、“李三”、“王三”(而不是“张李王三”);  如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”  SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'  将找出“老1”、“老2”、„„、“老9”;  4,[^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。  比如 SELECT * FROM [user] WHERE u_name LIKE '[^张李王]三'  将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;  SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';

wk_ad_begin({pid : 21});wk_ad_after(21, function(){$('.ad-hidden').hide();}, function(){$('.ad-hidden').show();});

将排除“老1”到“老4”,寻找“老5”、“老6”、„„  5,查询内容包含通配符时  由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:  function sqlencode(str)  str=replace(str,"[","[[]") '此句一定要在最前  str=replace(str,"_","[_]")  str=replace(str,"%","[%]")  sqlencode=str  end function  在查询前将待查字符串先经该函数处理即可。   1、设置基本表格  从创建例子表格开始,使用以下的SQL命令:  mysql> CREATE TABLE reviews (id INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT, data TEXT);  以上命令创建了一个简单的音乐专集资料库(主要是整段的文字),然后向这个表格中添加一些记录:  mysql> INSERT INTO `reviews` (`id`, `data`) VALUES  (1, 'Gingerboy has a new single out called Throwing Rocks. It\'s great!');  mysql> INSERT INTO `reviews` (`id`, `data`) VALUES  (2, 'Hello all, I really like the new Madonna single.  One of the hottest tracks currently playing...I\'ve been listening to it all day');  mysql> INSERT INTO `reviews` (`id`, `data`)  VALUES (3, 'Have you heard the new band Hotter Than Hell?  They have five members and they burn their instruments when they play in concerts.  These guys totally rock! Like, awesome, dude!');  验证数据的正确录入:  mysql> SELECT * FROM reviews;  +----+--------------------------------------------+  id data  +----+--------------------------------------------+  1 Gingerboy has a new single out called ...   2 Hello all, I really like the new Madon ...  3 Have you heard the new band Hotter Than...  +----+--------------------------------------------+  3 rows in set (0.00 sec)  2、定义全文搜索字段  接下来,定义您要作为全文搜索索引的字段  mysql> ALTER TABLE reviews ADD FULLTEXT INDEX (data);  Query OK, 3 rows affected (0.21 sec)  Records: 3 Duplicates: 0 Warnings: 0  使用SHOW INDEXES命令来检查索引已经被添加了:

mysql> SHOW INDEXES FROM reviews;  +---------+---------------+--------+------+------------+---------+  Table Column_name Packed Null Index_type Comment  ----------+---------------+--------+------+------------+---------+  reviews id NULL BTREE  reviews data NULL YES FULLTEXT  +---------+---------------+--------+------+------------+---------+  3、运行全文搜索  当您拥有了数据和索引,就可以使用MySQL的全文搜索了,最简单的全文搜索方式是带有MATCH...AGAINST语句的SELECT查询,以下是一个简单的例子,可以来查找含有单词“single”的记录:  mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('single');+----+  id  +----+  1  2  +----+  2 rows in set (0.00 sec)  在此,MATCH()将作为参数传递给它的字段中的文字与传递给AGAINST()的参数进行比较,如果有匹配的,那就按照正常的方式返回。注意您可以传递不止一个字段用MATCH()来查看­-只需用逗号来分割字段列表。  当MySQL收到了一个全文搜索的请求,它就在内部对每个记录进行评分,不匹配的记录得分为零,而“更相关”的记录会得到比“不太相关”的记录相对更高的分数。相关性是由MySQL的一系列区分标准来决定的,查看MySQL的用户手册可以得到更多的信息。  想看到每个记录的评分如何,只需要返回MATCH()方法作为结果集的一部分,如下所示:  mysql> SELECT id, MATCH (data) AGAINST ('rock') FROM reviews;   +----+-------------------------------+  id MATCH (data) AGAINST ('rock')  +----+-------------------------------+  1 0  2 0  3 1.3862514533815  +----+-------------------------------+  3 rows in set (0.00 sec)  4、使用逻辑搜索修饰符(Boolean search modifiers)  您还可以使用逻辑搜索修饰符来进行更精确的搜索,这通过在AGAINST语句中添加特殊的IN BOOLEAN MODE修饰符来实现,在以下的例子中,将查找含有单词“single”但是没有“Madonna”的记录:  mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('+single -madonna' IN BOOLEAN MODE);  +----+  id  +----+

1  +----+  1 row in set (0.00 sec)  这一搜索特性通常用于搜索单词片断(而不是完整的词语),这可以通过在IN BOOLEAN MODE语句中的*(星号)操作符来实现,以下的例子展示了如何查找单词中含有“hot”的记录:  mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('hot*' IN BOOLEAN MODE);+----+  id  +----+  3  2  +----+  2 rows in set (0.00 sec)  您还可以使用这种方法来查找至少一个传递到AGAINST的参数中,以下的例子查找了至少包含单词“hell”和“rocks”中的一个的记录:  mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('hell rocks' IN BOOLEAN MODE);  +----+  id  +----+  1  3  +----+  3 rows in set (0.00 sec)  以上的这些例子演示了相对于传统的SELECT...LIKE语句,进行全文搜索的更有效的方法,当您下一次需要编写MySQL数据库搜索界面的时候,您可以尝试这一方法。 最终发现使用不了,原因是只有MyISAM引擎才支持全文索引,晕。好吧,还是用like进行搜索。。。  详细出处参考:http://www.jb51.net/article/31904.htm

MySQL模糊查询的更多相关文章

  1. MySQL模糊查询:LIKE模式和REGEXP模式

    MySQL模糊查询提供了两种模式:LIKE模式和REGEXP模式. LIKE模式 LIKE模式是使用的LIKE 或 NOT LIKE 比较运算符进行模糊查询. SELECT 字段 FROM 表 WHE ...

  2. mysql模糊查询like/REGEXP

    原文:mysql模糊查询like/REGEXP 增删改查是mysql最基本的功能,而其中查是最频繁的操作,模糊查找是查询中非常常见的操作,于是模糊查找成了必修课. like模式 like意思是长得像, ...

  3. mysql模糊查询 like/REGEXP

    原文:mysql模糊查询like/REGEXP 增删改查是mysql最基本的功能,而其中查是最频繁的操作,模糊查找是查询中非常常见的操作,于是模糊查找成了必修课. like模式 like意思是长得像, ...

  4. Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办--转自http://www.jb51.net/article/88236.htm

    这篇文章主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下   项目开发中,在做Mybatis动态查询时,遇到了 ...

  5. mysql: 模糊查询 feild like keyword or feild like keyword , concat(feild1,feild2,feild3) like keyword

    mysql: 模糊查询 feild like '%keyword%' or feild like'% keyword%' , 或者 concat(feild1,feild2,feild3) like ...

  6. MYSQL 模糊查询

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  7. 关于Mysql模糊查询的优化-全文检索和Like的使用

    表A:CREATE TABLE `tableA` (`id` int(11) NOT NULL auto_increment,`content` varchar(256) default NULL,P ...

  8. mysql模糊查询1,11,111用逗号(其他符号)拼接的相似字符串

    mysql进行模糊查询时,基本都是LIKE "%sss%",有时候这种查询时准确的,但是有种情况这种查询会出现很大问题. 看一下下面这张表 如果想查询字段test包含1的数据,一般 ...

  9. MySQL模糊查询中通配符的转义

    sql中经常用like进行模糊查询,而模糊查询就要用到百分号“%”,下划线“_”这些通配符,其中“%”匹配任意多个字符,“_”匹配单个字符.如果我们想要模糊查询带有通配符的字符串,如“60%”,“us ...

随机推荐

  1. 【bzoj1725】[USACO2006 Nov]Corn Fields牧场的安排

    题目描述 Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土 ...

  2. iOS开发——高级篇——远程音频、视频播放

    一.远程音频播放(<AVFoundation/AVFoundation.h>) #import <AVFoundation/AVFoundation.h> /** 播放器 */ ...

  3. json和pickle

    Pickle序列化 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 python的pic ...

  4. what's cloud computing? IaaS

    Cloud computing has changed the ITC industry. Companies like Amazon, Google and Microsoft have built ...

  5. 超级详细Tcpdump 的用法

    1.抓取回环网口的包:tcpdump -i lo 2.防止包截断:tcpdump -s0 3.以数字显示主机及端口:tcpdump -n 第一种是关于类型的关键字,主要包括host,net,port, ...

  6. Linux From Scratch - Version 7.7-systemd (中文)

    Linux From Scratch - Version 7.7-systemd: https://linux.cn/lfs/LFS-BOOK-7.7-systemd/index.html

  7. nginx配置文件或目录404和403

    对于Nginx web目录下的文件,如果不想用户访问那么可以配置返回404或者403状态,默认情况下对于目录来说,如果目录下没有默认文档,那么默认返回是403,也就是不允许查看目录列表,但是如果知道静 ...

  8. poj1001_Exponentiation_java高精度

    Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 162918   Accepted: 39554 ...

  9. LVS集群之DR模式 实现

    ps:做 dr 模式 之前,先把之前做过的操作清空掉 1.ipvsadm -ln 查看规则 2.ipvsadm -C 清空规则 3.ipvsadm -ln 确认 4.iptables -t nat - ...

  10. 关于awk的逗号问题

    对于awk逗号的问题,我昨天看的一本书有提过: <Linux就是这个范儿>挺好的书,大家可以看看~~~~ 测试过,总结如下(不知道总结有没有错,欢迎大家吐槽,欢迎大家吐槽,吐槽,吐槽... ...