全文索引——CONTAINS 语法代码

全文索引——CONTAINS 语法代码


发布时间:2010年7月26日 文章整理 爱促销 来源:开发者在线 点击次数:19

分页: 1
-
2010年7月26日 爱促销电脑网 开发频道

 

全文索引——CONTAINS 语法
我们通常 WHERE 子句中解决 CONTAINS 就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column 'search contents')

我们通过实例来学习 假设 表 students 其中 address 全文本检索
1. 查询住址 北京 学生
SELECT student_id student_name
FROM students
WHERE CONTAINS( address 'beijing' )
remark: beijing 一个单词 要用单引号括起来

2. 查询住址 河北省 学生
SELECT student_id student_name
FROM students
WHERE CONTAINS( address '"HEIBEI province"' )
remark: HEBEI province 一个词组 单引号里还要用双引号括起来

3. 查询住址 河北省或北京 学生
SELECT student_id student_name
FROM students
WHERE CONTAINS( address '"HEIBEI province" OR beijing' )
remark: 可以指定逻辑操作符(包括 AND AND NOT OR )

4. 查询 '南京路' 字样 地址
SELECT student_id student_name
FROM students
WHERE CONTAINS( address 'nanjing NEAR road' )
remark: 上面 查询将返回包含 'nanjing road' 'nanjing east road' 'nanjing west road' 等字样 地址
          A NEAR B 就表示条件: A 靠近 B

5. 查询以 '湖' 开头 地址
SELECT student_id student_name
FROM students
WHERE CONTAINS( address '"hu*"' )
remark: 上面 查询将返回包含 'hubei' 'hunan' 等字样 地址
          记住 * %

6. 类似加权 查询
SELECT student_id student_name
FROM students
WHERE CONTAINS( address 'ISABOUT (city weight (.8) county wright (.4))' )
remark: ISABOUT 这种查询 关键字 weight 指定了一个介于 0~1之间 类似系数(我 理解) 表示不同条件 不同 侧重

7. 单词 多态查询
SELECT student_id student_name
FROM students
WHERE CONTAINS( address 'FORMSOF (INFLECTIONAL street)' )
remark: 查询将返回包含 'street' 'streets'等字样 地址
         对于动词将返回它 不同 时态 如:dry 将返回 dry dried drying 等等

以上实例都解决英文 不解决中文 因为 查询方式中文不支持 而且我 计算机 英文系统

 

 

mysql having介绍

在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

SELECT SUM(population) FROM bbc

这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有
国家的总人口数。


通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值.
也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.

HAVING子句可以让我们筛选成组后的各组数据.
WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.
而 HAVING子句在聚合后对组记录进行筛选。

让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。

SQL实例:

一、显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region

先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中
的不同字段(一或多条记录)作运算。

二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000

在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,HAVING子句可以让我们筛选成组后的各组数据

 

三、mysql like 语句通配符
(一)MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。

_ 表示一个字符,而%表示0到任意个字符

如果你的查询语句含有%这种特殊字符那么/% 或者[%]都可以

起到转义符的作用

like '5[%]' 表示 5%

like '5%' 表示5后跟0多更多字符

like '[_]h'  表示-n

like '_n'  表示 an,bn,on(and so on)

like '[a-cdf]' 表示 a, b, c, d, or f

like '[-acdf]' 表示 - ,a, c, d, or f

like '[[]' 表示 [

like ']' 表示 ]

(二)实例说明:

在表PersonalMember中查找strloginname字段中含有"["的记录。


可用三条语句:
1、
select strloginname,* from PersonalMember where strloginname like '%[%' escape ''

2、(说明""与"/"均可与escape关键字结合作为转义符)
select strloginname,* from PersonalMember where strloginname like '%/[%' escape '/'

3、
select strloginname,* from dbo.PersonalMember where charindex('[',strloginname)>0
---------------------------
Microsoft Internet Explorer--------------------------

转载请注明本文地址:http://www.1366.me/xgjc/sjk_33_405.html

 

 

 

mysql> SELECT * FROM pet WHERE name LIKE "b%";

为了找出以“fy”结尾的名字:
mysql> SELECT * FROM pet WHERE name LIKE "%fy";

为了找出包含一个“w”的名字:
mysql> SELECT * FROM pet WHERE name LIKE "%w%";

为了找出包含正好5个字符的名字,使用“_”模式字符:
mysql> SELECT * FROM pet WHERE name LIKE "_____";

由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用

REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

扩展正则表达式的一些字符是:

“.”匹配任何单个的字符。
一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。
为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任
何数字。
“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”
匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。
正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,
“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。
如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的
结尾用“$”。
为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:

为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:
mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

既然如果一个正规表达式出现在值的任何地方,其模式匹配了,就不必再先前的查询中在模式的两
方面放置一个通配符以使得它匹配整个值,就像如果你使用了一个SQL模式那样。
为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在
两者之间:
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";

你也可以使用“{n}”“重复n次”操作符重写先前的查询:
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";

查找数字和其他的模糊查询语句
Select * from pet where name REGEXP "[^a-zA-Z].";

SELECT * FROM oneself WHERE name like '%'
like 是模糊查询的关键字。
% 是通配符,代表多个任意匹配,比如 '%人民' 就是搜索前半段是任意字符,结尾是人民的记录,类似的可以将 % 放在条件字段的任意位置。
_ 是单个字符的统配符,可以匹配单个任意字符。

PHP 不需要像你这样写,双引号中出现的变量将自动被解析。
$sql = "SELECT * FROM oneself WHERE name like '%{$colname_Recordset1}' LIMIT {$startRow_Recordset1}, {$maxRows_Recordset1}";
$Recordset1 = mysql_query($sql) or die(mysql_error());

{} 放在变量两边是直接指明这是个变量及该变量的名字,如果遇到数组类型的变量效果比较明显,不然可能会造成数组型变量名解析出错。

全文章搜索

CREATE TABLE `t3` (
`name` char(12) NOT NULL default '',
`name2` char(12) NOT NULL default '',
FULLTEXT KEY `name` (`name`,`name2`)
) TYPE=MyISAM;
 
#
# 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", "真的 不会吧");
 
mysql> SELECT * FROM t3;
+------+-------------+
¦ 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 ¦ 不会吧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 的全文索引对双字节处理的支持还不太好,
¦ 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)

转载请注明本文地址:http://www.1366.me/xgjc/sjk_33_404.html
更多 数据库

谁遇到过 mysql中 like 查询不准确的情况?


http://www.chinaunix.net 作者:rosetnt   发表于:2005-11-09 13:20:10
发表评论 】 【查看原文 】 【MySQL讨论区 】【关闭 】

[这个贴子最后由rosetnt在 2002/11/25 02:55pm 编辑]

select b_id,b_name,b_code,b_state,b_lend,b_click,b_intro
from book
where b_intro like '%余明%' order by b_code,b_state

我用的mysql版本是3.23.31 ,在mysql中执行这个sql,但查到的结果确不准确, b_intro 是 text 型的。

哪位知道是怎么回事,或怎么解决?



 huatong 回复于:2002-11-25 21:08:45

因为mysql的默认字符集不是中文的,可将b_intro的属性设成binary试试


 redfox 回复于:2002-11-26 00:20:07

遇到了,无法解决。


 rosetnt 回复于:2002-11-26 09:51:34

那怎么样来改变 mysql的默认字符集呢?  我用的是  win32 版的 


 rosetnt 回复于:2002-11-26 10:41:34

问题解决了~~  :em02:   

    改变成这个就可以    default-character-set = gb2312   :emn25: 


 redfox 回复于:2002-11-27 21:03:01

好的,我试试~


 redfox 回复于:2002-11-27 21:34:51

好用,gbk亦可。


 i叶大马猴 回复于:2002-11-28 02:31:12

那数据类型还要不要改???


 redfox 回复于:2002-11-29 16:00:23

不用改


 rosetnt 回复于:2002-12-05 10:32:44

redfox~   你用的mysql是WIN32版本的吗?  

   linux下的改变后没问题,但WIN32版的mysql当时在控制台改好用,但没有保留住,重起机器后,mysql通过NT的服务启动,又恢复到了默认拉丁文字符集,有办法让他保留住更改后的gb2312值吗?

   或者你知道哪有默认就是gb2312字符集的win32版mysql?   :emn8: 


 redfox 回复于:2002-12-05 10:47:37

windows版本修改my.ini


 rosetnt 回复于:2002-12-05 11:10:42

是吗? 等等, 说明白点, 是my.cnf 还是 my.ini    
  
我没看到有改这个参数的地方,能具体说明怎么改吗?


 rosetnt 回复于:2002-12-05 11:51:18

是my.cnf ,  我知道怎么改了  :)


 henanups 回复于:2002-12-07 15:05:19

我的3.23.53,试my.ini,在c:/winnt下
我的my.ini内容:
#This File was made using the WinMySQLAdmin 1.4 Tool
#2002-12-7 8:47:46

#Uncomment or Add only the keys that you know how works.
#Read the MySQL Manual for instructions

[mysqld]
#默认字符集:
default-character-set = gb2312
basedir=C:/Program Files/mysql
#bind-address=127.0.0.1
datadir=c:/Program Files/mysql/data
#language=c:/Program Files/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
#最大连接数:
set-variable=max_connections=500

[WinMySQLadmin]
Server=c:/Program Files/mysql/bin/mysqld-nt.exe
user=root
password=123



 redfox 回复于:2002-12-07 18:10:17

win下面是my.ini

unix下是my.cnf


 cndave 回复于:2002-12-09 15:19:09

在window系统下如果用my.cnf,那么把这个文件放在c:/下,如果用my.ini,那么放在c:/winnt下。


 飞越巅峰 回复于:2002-12-12 21:53:35

改为GBK后上传图片会出错,折中的办法
方法1:
  修改字段类型加binary关键字
  alter table <table name>; change <字段名>; <类型>; <字段名>; <类型>; binary

方法2:
  在SQL中使用binary关键字
  select b_id,b_name,b_code,b_state,b_lend,b_click,b_intro
  from book
  where b_intro like binary '%余明%' order by b_code,b_state



 redfox 回复于:2002-12-12 22:01:17

上传图片会出错?


 tiyi 回复于:2003-01-03 17:44:03

敢问各位使用的是什么版本的mysql ?


 faisun 回复于:2003-01-07 10:00:54

如果不改my.ini/my.inf,可不可以办到?

不是我的服务器,我改不了的。


 zhxp 回复于:2003-01-07 15:22:12

如果是使用PHP调用MySQL的话,可以在查询结果出来后进行判断(做个函数转化成双字节就可以了)。


 冷风 回复于:2003-03-20 09:10:19

改成gb2312编码后就不能上传文件了,谁知道为什么


 windlike 回复于:2003-05-07 16:48:34

zhxp 大哥说的

如果是使用PHP调用MySQL的话,可以在查询结果出来后进行判断(做个函数转化成双字节就可以了)。

具体怎样实现,谁知道呀?


 buaaytt 回复于:2003-05-18 10:31:48

这样会对通常的英文查询带来影响吗?


 buaaytt 回复于:2003-06-01 12:37:14

我是rh9,使用
find / -name my.cnf
居然没找到,那该怎么改啊?


 alexann_java 回复于:2004-04-07 12:23:57

首先要把那个中文字段改为binary,然后查询的时候使用mysql自带的一个函数
locate查询就可以了.
select b_id,b_name,b_code,b_state,b_lend,b_click,b_intro
from book
where locate('余明',b_intro) % 2 =1 order by b_code,b_state


 ysixin 回复于:2005-06-02 09:00:59

太好了
我终于解决了这样的问题


 cbs20 回复于:2005-11-09 13:20:10

修改 /etc/my.cnf
加入
default-character-set = gb2312
重新启动mysql

但是mysql 启动时提示

/usr/local/libexec/mysqld: File '/usr/local/share/mysql/charsets/gb2312.conf' not found (Errcode: 2)
/usr/local/libexec/mysqld: Character set 'gb2312' is not a compiled character set and is not specified in the '/usr/local/share/my
sql/charsets/Index' file

我看了一下'/usr/local/share/mysql/charsets ,确实没有gb2312.conf字符集
ll
total 136
-rw-r--r--  1 root  wheel   621 Jun 30 12:06 Index
-rw-r--r--  1 root  wheel  1758 Jun 30 12:06 README
-rw-r--r--  1 root  wheel  4386 Jun 30 12:06 cp1251.conf
-rw-r--r--  1 root  wheel  4399 Jun 30 12:06 cp1257.conf
-rw-r--r--  1 root  wheel  4385 Jun 30 12:06 croat.conf
-rw-r--r--  1 root  wheel  4386 Jun 30 12:06 danish.conf
-rw-r--r--  1 root  wheel  4384 Jun 30 12:06 dec8.conf
-rw-r--r--  1 root  wheel  4383 Jun 30 12:06 dos.conf
-rw-r--r--  1 root  wheel  4400 Jun 30 12:06 estonia.conf
-rw-r--r--  1 root  wheel  4387 Jun 30 12:06 german1.conf
-rw-r--r--  1 root  wheel  4385 Jun 30 12:06 greek.conf
-rw-r--r--  1 root  wheel  4386 Jun 30 12:06 hebrew.conf
-rw-r--r--  1 root  wheel  4383 Jun 30 12:06 hp8.conf
-rw-r--r--  1 root  wheel  4389 Jun 30 12:06 hungarian.conf
-rw-r--r--  1 root  wheel  4387 Jun 30 12:06 koi8_ru.conf
-rw-r--r--  1 root  wheel  4388 Jun 30 12:06 koi8_ukr.conf
-rw-r--r--  1 root  wheel  4386 Jun 30 12:06 latin1.conf
-rw-r--r--  1 root  wheel  4386 Jun 30 12:06 latin2.conf
-rw-r--r--  1 root  wheel  4545 Jun 30 12:06 latin5.conf
-rw-r--r--  1 root  wheel  4384 Jun 30 12:06 swe7.conf
-rw-r--r--  1 root  wheel  4384 Jun 30 12:06 usa7.conf
-rw-r--r--  1 root  wheel  4400 Jun 30 12:06 win1250.conf
-rw-r--r--  1 root  wheel  4618 Jun 30 12:06 win1251.conf
-rw-r--r--  1 root  wheel  4471 Jun 30 12:06 win1251ukr.conf

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值