加载中…
正文 字体大小:

MySQL 英文全文搜索和中文全文搜索 (FULLTEXT)

(2006-12-13 17:32:31)
分类: 搜索引擎
MySQL 英文全文搜索实现步骤:
 
先建立一个数据库,采用utf8编码
CREATE DATABASE search DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
 
建立一个表,并建立FULLTEXT索引
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
);
 
往表中插入一些数据
INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');
 
使用MATCH进行搜索
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
 
MATCH()函数对于一个字符串执行资料库内的自然语言搜索。一个资料库就是1套1个或2个包含在FULLTEXT内的列。搜索字符串作为对AGAINST()的参数而被给定。对于表中的每一行, MATCH() 返回一个相关值,即, 搜索字符串和 MATCH()表中指定列中该行文字之间的一个相似性度量。
 
在默认状态下, 搜索的执行方式为不区分大小写方式。然而,你可以通过对编入索引的列使用二进制排序方式执行区分大小写的全文搜索。
 
停止词
MySQL全文搜索有一些停止词,如:the, this, to等,像下面的这条语句将搜索不到东西:
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('the');
如果你一定要想搜索他们,你需要自定停止词,方法如下:
change your my.ini like this:
[mysqld]
ft_min_word_len=3
ft_stopword_file="C:\\MySQL\\stop.txt"
在MySQL5.0中,只能使用默认的或"IN BOOLEAN MODE" 的search_modifier.
在MySQL5.1中,可以使用"IN BOOLEAN MODE,IN NATURAL LANGUAGE MODE,IN NATURAL LANGUAL MODE WITH QUERY EXPANSION,WITH QUERY EXPANSION" 的search_modifier.
 
下面我们来看看MySQL的中文全文搜索
在上面的表中插入一些中文数据如下:
INSERT INTO articles (title,body) VALUES
('中华','中华人民共和国'),
('标题','你好,我是好人');
 
为确保你的客户端的编码设置正确,先使用like语句进行搜索
select * from articles where body like '%中华%';
这样应该能搜索到一条记录,否则请检查你的sql,尤其是编码。
 
然后使用全文搜索语句进行搜索
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('中华');
运行着条语句你看到什么呢?你没能找到任何一条记录。原因是MySQL不能对中文进行分词处理,诸如汉语和日语这样的表意语言没有自定界符,所以MySQL的FULLTEXT也就无能为力了。
 
是否MySQL的中文全文搜索就真的不能实现了呢,答案是否定的,不过你得付出一定的代价,提供一些解决思路供参考:
1. 将中文映射为汉语拼音,汉语拼音之间用空格分隔,这样每个拼音就相当于一个英文单词,就可以使用MySQL的全文搜索功能。
2. 进行中文分词处理,开发MySQL的全文检索分词插件。
 
中文分词可以采用“二元分词法”,“多层分词法”等,具体设计和实现我会在以后的开发中慢慢告诉大家。
 

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有