mysql的全文搜索支持中文吗?

时间:2022-09-22 11:20:52
mysql的全文搜索支持中文吗?

我在4.0.22版、4.1.7版及5.0.5alpha版都测试过了,都不支持中文,不知道是不是我哪里出错了?
请大家指点,谢谢?


我的测试代码如下:

CREATE TABLE `articles` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `title` varchar(200) default NULL,
  `body` text,
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `title` (`title`,`body`)
) TYPE=MyISAM AUTO_INCREMENT=1;

INSERT INTO `articles` VALUES (1, 'MySQL Tutorial', 'DBMS stands for DataBase ...');
INSERT INTO `articles` VALUES (2, 'How To Use MySQL Efficiently', 'After you went through a ...');
INSERT INTO `articles` VALUES (3, 'Optimising MySQL', 'In this tutorial we will show ...');
INSERT INTO `articles` VALUES (4, '1001 MySQL Tricks', '1. Never run mysqld as root. 2. ...');
INSERT INTO `articles` VALUES (5, 'MySQL vs. YourSQL', 'In the following Database comparison ...');
INSERT INTO `articles` VALUES (6, 'MySQL Security DataBase', 'When configured properly, MySQL ...');
INSERT INTO `articles` VALUES (7, '中文信息', '这里含有 中文 信息');


运行下面查询语句后,可以得到正确的结果:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');

但如果下面这句搜索中文的查询语句后,却搜索不到任何内容。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文');


请问是我的问题还是mysql的全文搜索本身不支持中文?

25 个解决方案

#1



SELECT * FROM articles WHERE (title LIKE '%中文%' OR body LIKE '%中文%');

#2


手册中说是支持双字节字符的,应该是支持中文的。但是win32版本不能设置成gb2312或gbk的,所以就不太好办了。
我是用变通的方法做的——将中文转换成拼音

呵呵,不得已而为之吧

#3


xuzuning(唠叨) 老大:

我是在linux下与windows下都试过了.我也试着把字符改为gb2312也是不行呀?
将中文转换成拼音是什么意思? 能取个例子吗? 

hlddn(*的那片天) :
你那是全文搜索吗?

#4


顶一下

#5


你们不搜索到中文吗?我这里可以呢~

环境:WIN2K+MYSQL(1个月前的最新版本~~)+PHP5
能搜索到中文~~

无论是GB2312还是UTF8

#6


to surfchen(冲浪) 
是吗?请详细说说

#7


应该是你自己的问题。

哪有用一条记录做测试的?普通模式下,记录的返回有阀值限制的。如果你只有一条记录,那么改成 IN BOOLEAN MODE,忽略阀值限制。

双字节的情况下应该搜到是没有问题的,问题是经常会搜多了结果出来,原因想想就明白了。

多看在线手册。我记得fulltext 这一章的用户评论里有人提示过如何设置中文搜索的。

#8


刚才升级mysql到4.1.7,发现已经可以了。不过安装是采用“完全安装”的

#9


有点奇怪,我早上试了很多次就是查不了.下午试却可以查了.

但是还有个问题:

我用 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文');
是可以查到id为7的那条记录.

但是我在插入一条id为8的记录后,如下.
INSERT INTO `articles` VALUES (8, '中文信息', '这里含有中文信息');
(也就是中文这词前后没有留空格)

再用 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文'); 也只能查到id为7的记录,而id为8的记录却查不出来.

这又是为何呀?

#10


全文索引填充需要时间,不知道mysql里面有几种填充方式,是否自动填充?

#11


不是很明白,不过
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('这里'); 
可以得到两条记录

#12


哇,是呀是呀,xuzuning(唠叨) 老大.

我用SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('这里'); 也是得到这两条记录
而用SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文'); 却只能得到id为7的那条.

这是怎么一会事呀?

#13


SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文*' IN BOOLEAN MODE);


这样我这里可以找到两条,具体原理不是很明白,试了几个其他的词组,更是糊涂了

#14


原因是中文是双字节的。就是说两个字节。那么如果某一个字的其中一个字节和它前后的那个字节合起来相当于你搜索条件中给的那两个字节,就匹配上了。结果就会显得很怪异。

如果是直接保存中文原文,那么有效的解决办法首先是设定字段为GB2312或UTF-8,然后你要在MySQL的输入语言类别中指明编码,并且要在应用程序中(例如PHP)中也指明编码。

可以在PHP中测试“中”这个词的长度,如果你不指明编码或转换编码,那么你得到长度=2,试试就知道了。

通常的做法应该是另外设置索引字段,这个索引字段中对原文做分词处理,不仅解决了查的到查不到的问题,还解决了准确性的问题。分词的技术可以参考车东的文章

#15


当然,如果全文索引引擎是你自己写而不是直接用MySQL的,那你不需要做一个索引字段了

#16


ccton(ccton):
按你怎么做好象有点麻烦.

#17


不是麻烦,是现实啊。MySQL支持中文搜索,那也最多只是说支持搜索中文字符,不可能支持中文词汇搜索,这样你搜到的垃圾总是比较多(在数据库很大的时候)。要想变通一下,只有这么干,否则你只有自己扩充fulltext search分词技术(或者用的别的玩意代替Mysql自带的这个fulltext search)

想得到楼上说的拼音转换程序的话,回帖

#18


TO ccton(ccton)

我不清楚你说的指明编码是什么意思~~

一般在PHP程序,MYSQL查询中,所提交的数据以及所处的环境一般都是GB2312或UTF8 的,并不存在无编码情况~~~

能否给出一个例子?

#19


哪里哪里,默认全是 ISO-8859-1 

例如,在PHP中,要正确辨认中文的话,要使用多字节字符处理库把输入的文本进行编码转换(在配置里设,自动转换),参考 http://www.php.net/manual/zh/ref.mbstring.php

意思就是说你要告诉PHP, 输入的是什么编码类型的,输出的又应该是什么。

MySQL里一样需要这么干,不光是对表、字段进行编码设置。

#20


之所以在默认情况下看起来好象PHP能处理中文,其实它只是把中文字符看成两个(GB2312下)或多个(UTF-8下)英文字符而已(127以内的ASNI字符)。 

比如你写个页面,header个charset 为gb2312,页面里加个表单。保存为缺省格式。页面全英文吧,这样都一样。然后在表单中填写中文,提交给PHP。IE肯定能正确地编码发送,PHP那边就不行了。判断提交的文本长度,什么都明白了。

#21


其实你把这些全弄好了,也不过是在字符级别支持而已,现在大家都是要词汇搜索的了。分词。

#22


顶一下

#23


明白了一些东西,顶一下

#24


mysql确实是需要改进全文搜索功能.

#25


顶一下,看看还有没有哪位朋友提提好的建议.

#1



SELECT * FROM articles WHERE (title LIKE '%中文%' OR body LIKE '%中文%');

#2


手册中说是支持双字节字符的,应该是支持中文的。但是win32版本不能设置成gb2312或gbk的,所以就不太好办了。
我是用变通的方法做的——将中文转换成拼音

呵呵,不得已而为之吧

#3


xuzuning(唠叨) 老大:

我是在linux下与windows下都试过了.我也试着把字符改为gb2312也是不行呀?
将中文转换成拼音是什么意思? 能取个例子吗? 

hlddn(*的那片天) :
你那是全文搜索吗?

#4


顶一下

#5


你们不搜索到中文吗?我这里可以呢~

环境:WIN2K+MYSQL(1个月前的最新版本~~)+PHP5
能搜索到中文~~

无论是GB2312还是UTF8

#6


to surfchen(冲浪) 
是吗?请详细说说

#7


应该是你自己的问题。

哪有用一条记录做测试的?普通模式下,记录的返回有阀值限制的。如果你只有一条记录,那么改成 IN BOOLEAN MODE,忽略阀值限制。

双字节的情况下应该搜到是没有问题的,问题是经常会搜多了结果出来,原因想想就明白了。

多看在线手册。我记得fulltext 这一章的用户评论里有人提示过如何设置中文搜索的。

#8


刚才升级mysql到4.1.7,发现已经可以了。不过安装是采用“完全安装”的

#9


有点奇怪,我早上试了很多次就是查不了.下午试却可以查了.

但是还有个问题:

我用 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文');
是可以查到id为7的那条记录.

但是我在插入一条id为8的记录后,如下.
INSERT INTO `articles` VALUES (8, '中文信息', '这里含有中文信息');
(也就是中文这词前后没有留空格)

再用 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文'); 也只能查到id为7的记录,而id为8的记录却查不出来.

这又是为何呀?

#10


全文索引填充需要时间,不知道mysql里面有几种填充方式,是否自动填充?

#11


不是很明白,不过
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('这里'); 
可以得到两条记录

#12


哇,是呀是呀,xuzuning(唠叨) 老大.

我用SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('这里'); 也是得到这两条记录
而用SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文'); 却只能得到id为7的那条.

这是怎么一会事呀?

#13


SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文*' IN BOOLEAN MODE);


这样我这里可以找到两条,具体原理不是很明白,试了几个其他的词组,更是糊涂了

#14


原因是中文是双字节的。就是说两个字节。那么如果某一个字的其中一个字节和它前后的那个字节合起来相当于你搜索条件中给的那两个字节,就匹配上了。结果就会显得很怪异。

如果是直接保存中文原文,那么有效的解决办法首先是设定字段为GB2312或UTF-8,然后你要在MySQL的输入语言类别中指明编码,并且要在应用程序中(例如PHP)中也指明编码。

可以在PHP中测试“中”这个词的长度,如果你不指明编码或转换编码,那么你得到长度=2,试试就知道了。

通常的做法应该是另外设置索引字段,这个索引字段中对原文做分词处理,不仅解决了查的到查不到的问题,还解决了准确性的问题。分词的技术可以参考车东的文章

#15


当然,如果全文索引引擎是你自己写而不是直接用MySQL的,那你不需要做一个索引字段了

#16


ccton(ccton):
按你怎么做好象有点麻烦.

#17


不是麻烦,是现实啊。MySQL支持中文搜索,那也最多只是说支持搜索中文字符,不可能支持中文词汇搜索,这样你搜到的垃圾总是比较多(在数据库很大的时候)。要想变通一下,只有这么干,否则你只有自己扩充fulltext search分词技术(或者用的别的玩意代替Mysql自带的这个fulltext search)

想得到楼上说的拼音转换程序的话,回帖

#18


TO ccton(ccton)

我不清楚你说的指明编码是什么意思~~

一般在PHP程序,MYSQL查询中,所提交的数据以及所处的环境一般都是GB2312或UTF8 的,并不存在无编码情况~~~

能否给出一个例子?

#19


哪里哪里,默认全是 ISO-8859-1 

例如,在PHP中,要正确辨认中文的话,要使用多字节字符处理库把输入的文本进行编码转换(在配置里设,自动转换),参考 http://www.php.net/manual/zh/ref.mbstring.php

意思就是说你要告诉PHP, 输入的是什么编码类型的,输出的又应该是什么。

MySQL里一样需要这么干,不光是对表、字段进行编码设置。

#20


之所以在默认情况下看起来好象PHP能处理中文,其实它只是把中文字符看成两个(GB2312下)或多个(UTF-8下)英文字符而已(127以内的ASNI字符)。 

比如你写个页面,header个charset 为gb2312,页面里加个表单。保存为缺省格式。页面全英文吧,这样都一样。然后在表单中填写中文,提交给PHP。IE肯定能正确地编码发送,PHP那边就不行了。判断提交的文本长度,什么都明白了。

#21


其实你把这些全弄好了,也不过是在字符级别支持而已,现在大家都是要词汇搜索的了。分词。

#22


顶一下

#23


明白了一些东西,顶一下

#24


mysql确实是需要改进全文搜索功能.

#25


顶一下,看看还有没有哪位朋友提提好的建议.