第一种最土的方法:使用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. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...

  2. 【Go入门教程1】Go 安装,GOROOT,GOPATH,Go工作空间

    Go安装 Windows 安装 访问Golang Code下载页,32 位请选择名称中包含 windows-386 的 msi 安装包,64 位请选择名称中包含 windows-amd64 的.下载好 ...

  3. .NET导入导出Excel方法总结

    最近,应项目的需求,需要实现Excel的导入导出功能,对于Web架构的Excel导入导出功能,比较传统的实现方式是: 1)导入Excel:将Excel文件上传到服务器的某一文件夹下,然后在服务端完成E ...

  4. iOS上架ipa上传问题那些事

    iOS上架ipa上传问题那些事 原文: http://www.jianshu.com/p/1e22543285c2 字数513 阅读312 评论0 喜欢1 通过xcode直接打包上传,不会提示你的ip ...

  5. BZOJ 4576: [Usaco2016 Open]262144

    Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...

  6. 【HNOI2008】Cards BZOJ 1004

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目 前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张 ...

  7. c# 正则表达式用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:41529 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  8. SpringMVC基本配置

    1 springmvc 框架 1.1  回顾mvc结构 1.2springmvc的介绍 是一个基于mvc的web层框架,使用spring的一个子项目 在使用springmvc的时候,不用单独和spri ...

  9. 【leetcode】Triangle (#120)

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  10. rhel5.8安装oracle 10g ASM

    1.所有的配置和文件系统一样 2.规划: 加了8块小盘,ASM为了实验使用asmlib驱动(rhel6不再支持asmlib驱动),裸设备的2种方法(rowdevice和udev) 三块盘使用asmli ...