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

HFeiLin 2004-11-29 10:20:29
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的全文搜索本身不支持中文?
...全文
679 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
HFeiLin 2004-12-06
  • 打赏
  • 举报
回复
顶一下,看看还有没有哪位朋友提提好的建议.
myblessu 2004-12-02
  • 打赏
  • 举报
回复
mysql确实是需要改进全文搜索功能.
spacet 2004-12-01
  • 打赏
  • 举报
回复
明白了一些东西,顶一下
ccton 2004-11-30
  • 打赏
  • 举报
回复
不是麻烦,是现实啊。MySQL支持中文搜索,那也最多只是说支持搜索中文字符,不可能支持中文词汇搜索,这样你搜到的垃圾总是比较多(在数据库很大的时候)。要想变通一下,只有这么干,否则你只有自己扩充fulltext search分词技术(或者用的别的玩意代替Mysql自带的这个fulltext search)

想得到楼上说的拼音转换程序的话,回帖
HFeiLin 2004-11-30
  • 打赏
  • 举报
回复
ccton(ccton):
按你怎么做好象有点麻烦.
hflsj 2004-11-30
  • 打赏
  • 举报
回复
顶一下
ccton 2004-11-30
  • 打赏
  • 举报
回复
其实你把这些全弄好了,也不过是在字符级别支持而已,现在大家都是要词汇搜索的了。分词。
ccton 2004-11-30
  • 打赏
  • 举报
回复
之所以在默认情况下看起来好象PHP能处理中文,其实它只是把中文字符看成两个(GB2312下)或多个(UTF-8下)英文字符而已(127以内的ASNI字符)。

比如你写个页面,header个charset 为gb2312,页面里加个表单。保存为缺省格式。页面全英文吧,这样都一样。然后在表单中填写中文,提交给PHP。IE肯定能正确地编码发送,PHP那边就不行了。判断提交的文本长度,什么都明白了。
ccton 2004-11-30
  • 打赏
  • 举报
回复
哪里哪里,默认全是 ISO-8859-1

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

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

MySQL里一样需要这么干,不光是对表、字段进行编码设置。
surfchen 2004-11-30
  • 打赏
  • 举报
回复
TO ccton(ccton)

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

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

能否给出一个例子?
hflsj 2004-11-29
  • 打赏
  • 举报
回复
顶一下
HFeiLin 2004-11-29
  • 打赏
  • 举报
回复
xuzuning(唠叨) 老大:

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

hlddn(西藏的那片天) :
你那是全文搜索吗?
xuzuning 2004-11-29
  • 打赏
  • 举报
回复
手册中说是支持双字节字符的,应该是支持中文的。但是win32版本不能设置成gb2312或gbk的,所以就不太好办了。
我是用变通的方法做的——将中文转换成拼音

呵呵,不得已而为之吧
hlddn 2004-11-29
  • 打赏
  • 举报
回复

SELECT * FROM articles WHERE (title LIKE '%中文%' OR body LIKE '%中文%');
ccton 2004-11-29
  • 打赏
  • 举报
回复
当然,如果全文索引引擎是你自己写而不是直接用MySQL的,那你不需要做一个索引字段了
ccton 2004-11-29
  • 打赏
  • 举报
回复
原因是中文是双字节的。就是说两个字节。那么如果某一个字的其中一个字节和它前后的那个字节合起来相当于你搜索条件中给的那两个字节,就匹配上了。结果就会显得很怪异。

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

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

通常的做法应该是另外设置索引字段,这个索引字段中对原文做分词处理,不仅解决了查的到查不到的问题,还解决了准确性的问题。分词的技术可以参考车东的文章
cloudchen 2004-11-29
  • 打赏
  • 举报
回复
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中文*' IN BOOLEAN MODE);


这样我这里可以找到两条,具体原理不是很明白,试了几个其他的词组,更是糊涂了
HFeiLin 2004-11-29
  • 打赏
  • 举报
回复
哇,是呀是呀,xuzuning(唠叨) 老大.

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

这是怎么一会事呀?
xuzuning 2004-11-29
  • 打赏
  • 举报
回复
不是很明白,不过
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('这里');
可以得到两条记录
cloudchen 2004-11-29
  • 打赏
  • 举报
回复
全文索引填充需要时间,不知道mysql里面有几种填充方式,是否自动填充?
加载更多回复(5)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧