第一种最土的方法:使用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. Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  2. Alpha版本十天冲刺——Day 10

    站立式会议 最后一天,很高兴我们做出了跟预期差不多的版本,实现了基本功能,虽然还有一些bug,但是下一阶段我们会继续加油! 会议总结 队员 今天完成 遇到的问题 感想 鲍亮 功能细节更改 我的手机运行 ...

  3. 支持向量机SVM

    SVM(Support Vector Machine)有监督的机器学习方法,可以做分类也可以做回归.SVM把分类问题转化为寻找分类平面的问题,并通过最大化分类边界点距离分类平面的距离来实现分类. 有好 ...

  4. jstl 小总结 以及 jstl fn

    1.1.1 JSTL的使用 JSTL是JSP标准标签库.结合EL替换传统页面的<%%> * JSTL如果不会用.也是可以使用<%%>.但是一般在大公司使用JSTL.进入小公司. ...

  5. spring aop 环绕通知around和其他通知的区别

    前言: spring 的环绕通知和前置通知,后置通知有着很大的区别,主要有两个重要的区别: 1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知   是不能决定的,他们只 ...

  6. c# 不同窗体之间传值和调用

    1.子窗体事件刷新父窗体界面值 子窗体定义委托和事件 //声明一个委托 public delegate void DisplayUpdateDelegate(string str); //声明事件 p ...

  7. 单节点下多个Tomcat服务器并存的端口号配置

    一个服务器节点同时安装多个tomcat服务器时,如果仅仅修改访问端口号则会提示端口冲突启动失败,还需要修改另外端口号解决,一共需要修改3处地方,修改如下: 编辑配置文件:server.xml 1.首先 ...

  8. artdialog

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  9. Spring映射器、适配器、解析器

    1 springmvc的映射器和适配器 1.1springmvc的映射器 根据客户端请求的url,找到处理本次请求的handler(处理器),将url和controller关联起来 1.2spring ...

  10. C# 使用Log4Net记录程序日志

    在之前的博客中,写过使用系统内置的Trace类记录程序日志,具体请参考:C# 使用Trace记录程序日志.这篇博客将介绍如何使用Log4Net记录程序日志. 首先需要引用Log4Net.dll,我们可 ...