分类目录归档:数据库

以 MySQL 为主的 database

MySQL-4.0.x FT 使用与演示

[b][size=3]在线演示实例参考:[/size][/b]

1. [url=http://www.hightman.cn/demo/s.php?q=%D6%D0%CE%C4]http://www.hightman.cn/demo/s.php?q=%D6%D0%CE%C4[/url] (BBS文章标题全文检索)
2. [url=http://www.hightman.cn/demo/s.php?source]http://www.hightman.cn/demo/s.php?source[/url] (实现的源代码, 可参考实现方式)
3. [url=http://www.dot66.net]http://www.dot66.net[/url] (一百五十万条原BBS精华区数据全文检索)

[size=3][b]命令行查看版本和分词函数[/b][/size]

[size=2]Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.[/size]
[size=2]mysql>[color=red] select version();[/color]
+————+
| version() |
+————+
| 4.0.27-hi4 |
+————+
1 row in set (0.00 sec)[/size]
[size=2]mysql> [color=red]SELECT SEGMENT(‘我是一个中学生’);[/color]
+—————————+
| SEGMENT(‘我是一个中学生’) |
+—————————+
| 我是 一个 中学生 |
+—————————+
1 row in set (0.00 sec)
mysql> [/size][size=2][color=red]SELECT SEGMENT(‘MySQL-4.0.27-hi4 完整安装包发布及安装说明(推荐)’) AS test;
[/color]+———————————————–+
| test |
+———————————————–+
| MySQL 27 hi4 完整 安装 包 发布 安装 说明 推荐 |
+———————————————–+
1 row in set (0.00 sec)[/size]
[size=2]mysql> use dot66[/size]
[size=2]mysql> [/size][size=2][color=red]SELECT SEGMENT(title) AS seg FROM 66_gem LIMIT 3 OFFSET 200;
[/color]+————————————-+
| seg |
+————————————-+
| 转录 cuprum 申请 聊 管 又来 一个 呵 |
| 公告 原 聊天 室 管理员 reaper 离任 |
| ttd 任期 不详 2001 07 05 |
+————————————-+
3 rows in set (0.00 sec)[/size]

[b][size=3]实际操作指令[/size][/b](请关注红色部分,该数据表约 7.6万行, 200MB(含索引) )

[size=2]mysql> explain bbs_posts;
+——–+——————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——–+——————+——+—–+———+—————-+
| id | int(11) | | PRI | NULL | auto_increment |
| board | varchar(32) | YES | | NULL | |
| chrono | int(10) unsigned | YES | | NULL | |
| owner | varchar(100) | YES | | NULL | |
| nick | varchar(100) | YES | | NULL | |
| title | varchar(255) | YES | MUL | NULL | |
| body | text | YES | MUL | NULL | |
+——–+——————+——+—–+———+—————-+
7 rows in set (0.00 sec)

mysql> alter table bbs_posts add fulltext(title);
Query OK, 76697 rows affected (6.45 sec)
Records: 76697 Duplicates: 0 Warnings: 0

mysql> alter table bbs_posts add fulltext(body);
Query OK, 76697 rows affected (2 min 0.36 sec)
Records: 76697 Duplicates: 0 Warnings: 0

mysql> SELECT COUNT(*) FROM bbs_posts WHERE MATCH(title) AGAINST (‘明月’);
+———-+
| COUNT(*) |
+———-+
| 237 |
+———-+
1 row in set (0.00 sec)

mysql> SELECT id,board,title FROM bbs_posts WHERE MATCH(title) AGAINST (‘明月’) LIMIT 230, 7;
+——-+———+—————————————————+
| id | board | title |
+——-+———+—————————————————+
| 14350 | Ad | [明月水轩聊天室] 正室开通。全新构架,绝对的速度。 |
| 75940 | saja | [转录] [公告] 明月水轩BBS 换上新版本,并开通web |
| 72960 | Dear66 | [通告]从现在开始,蓄意谋杀明月银行者将被严惩。 |
| 65545 | Meeting | 准备写一支程序作为明月会员权利执行程序 |
| 72692 | Dear66 | Re: 明月怎么赚钱?大家研究研究 |
| 72691 | Dear66 | 明月怎么赚钱?大家研究研究 |
| 32725 | Forgive | 88 to all 88 to 明月~~~~~~~~~~ |
+——-+———+—————————————————+
7 rows in set (0.00 sec)

mysql> SELECT COUNT(*) FROM bbs_posts WHERE title LIKE ‘%明月%’;
+———-+
| COUNT(*) |
+———-+
| 239 |
+———-+
1 row in set (0.28 sec)

mysql> SELECT id,board,title FROM bbs_posts WHERE title LIKE ‘%明月%’ LIMIT 230, 7;
+——-+———–+————————————————-+
| id | board | title |
+——-+———–+————————————————-+
| 75207 | OnlyCream | 非人生活※重回明月 |
| 75210 | OnlyCream | 伤离别※再爱明月※有缘的话 |
| 75213 | OnlyCream | 在明月的一年多 |
| 75223 | OnlyCream | windme在明月的日子 |
| 75940 | saja | [转录] [公告] 明月水轩BBS 换上新版本,并开通web |
| 75949 | saja | 感觉明月又繁荣起来了 |
| 76405 | saja | 我爱明月 |
+——-+———–+————————————————-+
7 rows in set (0.28 sec)

mysql> SELECT id,board,title FROM bbs_posts WHERE MATCH(title) AGAINST (‘我爱你’);
+——-+————+—————————————+
| id | board | title |
+——-+————+—————————————+
| 13799 | Asciiart | 我爱你 |
| 73461 | sysop | 我爱你 |
| 16274 | test | 我爱你,Darling |
| 44857 | Ghost | 别让我爱你 |
| 44858 | Ghost | 别让我爱你 |
| 40494 | fyy | 妹妹我爱你 |
| 16273 | test | 我爱你 打鼓机 |
| 43813 | Ghost | 响三次,我爱你(一) |
| 33087 | issa | [骗m]就当我爱你 |
| 54954 | tw.Joke | 妈妈‥对不起,我爱你 |
| 45149 | tw.Joke | 坚强点,亲爱的,我爱你……….. |
| 64215 | tw.php | 我爱你 有几个字 |
| 64216 | tw.php | Re: 我爱你 有几个字 |
| 64218 | tw.php | Re: 我爱你 有几个字 |
| 43817 | Ghost | 响三下,我爱你!(五) |
| 43816 | Ghost | 响三下,我爱你!(四) |
| 43815 | Ghost | 响三次,我爱你(三) |
| 43814 | Ghost | 响三次,我爱你(二) |
| 43171 | HowLove | 要怎麽告诉你…我爱你 |
| 43174 | HowLove | 要如何告诉你–我爱你2 |
| 46244 | tw.Joke | [转贴] 每个星座对於 “我爱你” 的定义 |
| 38331 | Humor | [幽默笑话]他妈的,我爱你!(第一集) |
| 38687 | Humor | [幽默笑话]《方丈与沙弥》之“我爱你!” |
| 30548 | justforu | [投稿]萧亚轩∮我爱你那麽多 ★ A |
| 30524 | justforu | [投稿]萧亚轩&我爱你那麽多 ★ A |
| 38647 | Humor | [幽默笑话]我爱你,就想和你上床 |
| 64692 | HeartStory | 明月明月我爱你 |
+——-+————+—————————————+
27 rows in set (0.00 sec)

mysql> SELECT id,board,title FROM bbs_posts WHERE MATCH(title) AGAINST (‘+我爱你 +三次’ IN BOOLEAN MODE);
+——-+——-+———————-+
| id | board | title |
+——-+——-+———————-+
| 43813 | Ghost | 响三次,我爱你(一) |
| 43814 | Ghost | 响三次,我爱你(二) |
| 43815 | Ghost | 响三次,我爱你(三) |
+——-+——-+———————-+
3 rows in set (0.00 sec)

mysql> SELECT id,board,title FROM bbs_posts WHERE MATCH(title) AGAINST (‘+我爱你 -响’ IN BOOLEAN MODE);
+——-+————+—————————————+
| id | board | title |
+——-+————+—————————————+
| 13799 | Asciiart | 我爱你 |
| 16273 | test | 我爱你 打鼓机 |
| 16274 | test | 我爱你,Darling |
| 30524 | justforu | [投稿]萧亚轩&我爱你那麽多 ★ A |
| 30548 | justforu | [投稿]萧亚轩∮我爱你那麽多 ★ A |
| 33087 | issa | [骗m]就当我爱你 |
| 38331 | Humor | [幽默笑话]他妈的,我爱你!(第一集) |
| 38647 | Humor | [幽默笑话]我爱你,就想和你上床 |
| 38687 | Humor | [幽默笑话]《方丈与沙弥》之“我爱你!” |
| 40494 | fyy | 妹妹我爱你 |
| 43171 | HowLove | 要怎麽告诉你…我爱你 |
| 43174 | HowLove | 要如何告诉你–我爱你2 |
| 44857 | Ghost | 别让我爱你 |
| 44858 | Ghost | 别让我爱你 |
| 45149 | tw.Joke | 坚强点,亲爱的,我爱你……….. |
| 46244 | tw.Joke | [转贴] 每个星座对於 “我爱你” 的定义 |
| 54954 | tw.Joke | 妈妈‥对不起,我爱你 |
| 64215 | tw.php | 我爱你 有几个字 |
| 64216 | tw.php | Re: 我爱你 有几个字 |
| 64218 | tw.php | Re: 我爱你 有几个字 |
| 64692 | HeartStory | 明月明月我爱你 |
| 73461 | sysop | 我爱你 |
+——-+————+—————————————+
22 rows in set (0.00 sec)

mysql> SELECT COUNT(*) FROM bbs_posts WHERE MATCH(body) AGAINST (‘我爱你’);
+———-+
| COUNT(*) |
+———-+
| 376 |
+———-+
1 row in set (0.01 sec)

mysql> SELECT COUNT(*) FROM bbs_posts WHERE body LIKE ‘%我爱你%’;
+———-+
| COUNT(*) |
+———-+
| 391 |
+———-+
1 row in set (4.20 sec)[/size]

MySQL-4.0.27-hi4 完整安装包发布及安装说明(推荐)

[b][size=4]下载和综述[/size][/b]
[b][size=4][/size][/b]
这是一个完整的安装包,下载后直接进行安装即可,无需其它打补丁更新 autoconf 的操作,这是基于 MySQL-4.0.27 的修改,[color=darkorange][b]强烈推荐使用!![/b][color=#333333] (共12MB , MD5: 1db4b0327a2551833760773f8e5e6815)[/color][/color]

本站下载地址:[url=http://www.hightman.cn/down/mysql-4.0.27-hi4.tgz][size=2]http://www.hightman.cn/down/mysql-4.0.27-hi4.tgz[/size][/url]

[b][size=4]安装说明[/size][/b]

1. 本软件包目前只支持从源码方式编译安装, 这里假定您已经拥有这方面的知识基础

2. 从远程下载获取源码包, 格式为: mysql-4.0.27-hi*.tgz
[code]
wget http://www.hightman.cn/down/mysql-4.0.27-hi4.tgz
[/code]

3. 解压编译安装:
[code]
tar xvzf mysql-4.0.27-hi4.tgz
cd mysql-4.0.27-hi4/
./configure –prefix=/usr/local –with-charset=gb2312 –with-extra-charsets=all –enable-hightman-mbft
make
make install
[/code]

4. 拷入词库文件 (可自行定制,格式参照源码目录下的: README.hightman_mbft 说明吧)其中的 $PREFIX 为编译时 configure 指定的参数 –prefix ,请勿照抄:
[code]
cp -f support-files/wordlist-gbk.txt $PREFIX/share/mysql/
cp -f support-files/stopwords-gbk.txt $PREFIX/share/mysql/
[/code]

5. 修改 /etc/my.cnf 在 [mysqld] 位置内加入以下几行:
[code]
ft_wordlist_charset = gbk
ft_wordlist_file = $PREFIX/share/mysql/wordlist-gbk.txt
ft_stopword_file = $PREFIX/share/mysql/stopwords-gbk.txt
ft_min_word_len = 2
ft_nlq_match_percent = 80
ft_nlq_match_maxnum = 5000
[/code]

6. 选项说明:
ft_wordlist_charset
表示词典的字符集, 目前支持良好的有(UTF-8, gbk, gb2312, big5, EUC_CN, EUC_TW …)

ft_wordlist_file
是词表文件, 每行包括一个词及其词频(用若干制表符或空格分开,消岐专用)

ft_stopword_file
表示过滤掉不索引的词表, 一行一个.

ft_min_word_len
加入索引的词的最小长度, 缺省是 4, 为了支持中文单字故改为 2

ft_nlq_match_percent
表示检索结果的匹配度, 原先 mysql 默认只要匹配查询词其中一个即满足条件返回, 我加了一个参数来控制, 100 表示要匹配所有词才返回, 默认是 50即匹配一半, 以免干扰结果太多

ft_nlq_match_maxnum
经过大量测试当一次检索返回的结果集过大时严重影响性能,此参数可调节每个关键词最多只匹配几个记录即不再往下匹配,其实一次返回太多记录也没有意义,对用户来说起不到“检索”筛选的作用了。

7. 重启 mysqld 服务器
[code]
$PREFIX/share/mysql/mysql.server stop
$PREFIX/share/mysql/mysql.server start
[/code]

[size=4][b]测试及演示[/b][/size]

请参照另外的贴子或文章进行

MySQL ft 补丁的授权声明

本软件补丁包秉承GNU(通用公共许可证)精神释出。

这部分代码(支持中文等多字节字符集全文检索、分词)全部由本人(即 hightman)独立完成,本人保留一切权利。

[b]未经同意严禁修改、移植代码、商业用途、分支发布等。[/b][b]若您采用本软件包架站或作相关的公益研讨交流服务, 希望您可以告诉我, 并尽可能保留一个到本站的链接及相关说明。[/b]

本改进软件包不包含任何恶意代码,由于本人水平及精力有限, Bug及错误之处可能会存在。由此升级修改引起的数据丢失等后果本人不承担任何责任。关于本软件的bug报告、疑问以及建议或改进优化代码请直接在[url=http://www.hightman.cn/bbs/index.php]论坛[/url]中汇报或联络。

关于我的 MySQL_ft 补丁

MySQL 是一个在 web 中应用极为广泛的优秀开源数据库。大约从 3.23 的某个小版本开始就已经支持在 MyISAM 表中建立全文索引(Fulltext)的字段。由于 CJK(中日韩)字符集及其句法的特殊性(词与词之间没有像英文一样的明显间隔),MySQL 一直没有针对多字节的宽字符集作出应有的支持,也没有任何分词能力。

作为 PHP 等 Web Script 的绝佳搭档,已经被广泛应用到各个角落,对于它的检索绝对是令绝大多数开发者头痛的大事,勉强用 SELECT … WHERE … LIKE %…% 的方式效率极差,基本上要扫描全表进行字符串匹配。此外,像中文这样的特殊语言也存在严重的问题,词才是语素单位,而不是字也不是句子。

我也在一段时间内受限于 MySQL 的检索限制,而不得不寻求其它解决方案,但都不太尽人意。后来在 MySQL 中对单字节字符集数据表进行全文检索字段的试用,感觉效果还是非常不错的。凭着自身的兴趣,在之前发布的简易分词系统基础上下定决心要修改 MySQL 的源码,让它真正直接支持中文全文检索。

由于一直在使用 MySQL 4.0.x 版本,也相当稳定和实用,便没有再跟随大部队密切升级,故直接以 MySQL-4.0.27 为基础修改,进展顺利,经过数天的努力,第一个雏形版本于 2006.09.7 发布并测试。得到许多朋友的支持和鼓励,使我更加有信心把它做得更好。后来经朋友力求也做了一个支持 5.1.12 的分词插件,由于自己平时也不使用,故无后续支持。

[color=#f70909][b]Notice:[/b] [color=black]本改进包的旨在不影响 MySQL 的系统结构及其他功能的前提下,解决 MySQL 目前对中文全文检索无法正确支持的缺陷并优化 MySQL 对中文检索处理的性能。(目前本软件包支持根据词典进行简易的正向最大匹配分词、支持包括UTF-8、GBK、BIG5、EUC_TW … 在内的字符集)[/color]该功能仅作用于 [b]MyISAM[/b] 引擎的表,除此之外均不支持。[/color]