第一种最土的方法:使用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. cf126b(kmp好题)

    http://codeforces.com/contest/126/problem/B #include<bits/stdc++.h> using namespace std; const ...

  2. 【安卓】安卓res文件夹下的资源文件与R.java文件里面类的对应关系

    对于drawable.layout.menu文件夹下的每一个文件都分别会在R.java文件里面生成drawable.layout.menu类的一个常量,类名就是文件夹的名字,常量的名字就是文件名字. ...

  3. 用Bitbucket搭建博客初探

    本博客是搭建在GitHub上的静态博客,但是由于GitHub免费账户不能创建私有仓库,导致有些东西不想放在GitHub上. 前两天,在免费资源部落上发现了Bitbucket,它和GitHub类似,也是 ...

  4. DirectAccess

    DirectAccess Direct Access 称为直接访问,它是Windows 7(企业版或者更高级版本)和Windows Server 2008 R2中的一项新功能.凭借这个功能,外网的用户 ...

  5. opencv二值化处理

    #include "stdafx.h"//对一张图片进行二值化处理 IplImage *pSrclmg =NULL;//载入的图片IplImage *pDeclmg =NULL;/ ...

  6. Xtrabackup 安装使用

    一 简介:      Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品.它能对Inno ...

  7. (转)CDN——到底用还是不用?

    用CDN的七个理由 浏览器从服务器上下载css.js和图片等文件时都要和服务器连接,而大部分浏览器对同一个域名用于下载文件的并发连接数限制在4个,这意味着如果要下载第五个文件就必须等前四个文件中有一个 ...

  8. 响应式字体(js控制)

    window.onload=function(x){if ('addEventListener' in document) {document.addEventListener('DOMContent ...

  9. UnrealEd3视图导航

    本博客使用的版本:2010-08   [更多其他的UE3版本]     [最新的UE3版本 -- 2015-02]  [unreal engine wiki]   注:dx11被加入2011-03月版 ...

  10. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...