免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12643 | 回复: 15
打印 上一主题 下一主题

[原创成果] MySQL FullText (全文检索) 中文支持计划(200609) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-09 13:27 |只看该作者 |倒序浏览
计划临时网址: http://php.twomice.net/mysql_ft/
-----------------------------------------------------------------------
最新情况
【2006年09月09日】
针对 MyISAM fulltext (全文检索) 定制的带有词典分词能力及多字节字符支持(特别是中文)第一个版本发布.



概述介绍
MySQL 从 3.23 的某个小版本开始就已经支持在 MyISAM 表中建立全文索引的列. 但一直不支持多字节字符集(如中文), 更不可能具备分词能力了. 经过对单字节字符集的试用, 感觉效果挺好. 凭借着兴趣及应用的需要, 加上之前发布的简易分词系统, 决定以 MySQL-4.0.26 为基础, 自己动手加入多字节字符集的检索与简易的词典分词. 在不影响MySQL的系统结构及其他功能的前提下, 解决MySQL目前对中文全文检索无法正确支持的缺陷并进而优化MySQL对中文检索处理的性能.

关于什么是分词、何谓全文检索以及为什么要这样做, 请自行 Google 或借助其它资料先了解一下.

由于时间和手头没有比较好的测试库, 临时组建了一个约 200MB , 7.6万行的数据表进行了简易测试. 建立

顺便提一下, 有一个叫作海量的分词技术公司, 很早就做过 mysql-chinese 的 hack, 不过迟迟没有按照 GNU 精神及时发布源码, 所以才决定自己来作.


安装使用

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

  1. 从本地 下载 获取源码包, 格式为: mysql-4.0.6h**.tgz
    wget http://php.twomice.net/mysql_ft/mysql-4.0.26h1.tgz

  2. 解压编译安装:
    tar xvzf mysql-4.0.26h1.tgz
    cd mysql-4.0.26h1/
    ./configure --prefix=/usr/local --with-charset=gb2312 --with-extra-charsets=all --enable-hightman-mbft
    make
    make install

  3. 拷入词库文件 (可自行定制, 格式参照源码目录下的: README.hightman_mbft 说明吧)
    cp -f support-files/wordlist-gbk.txt $PREFIX/share/mysql/
    cp -f support-files/stopwords-gbk.txt $PREFIX/share/mysql/
   
  4. 修改 /etc/my.cnf 在 [mysqld] 位置内加入:

ft_wordlist_charset = gbk
ft_wordlist_file    = /home/soft/mysql/share/mysql/wordlist-gbk.txt
ft_stopword_file    = /home/soft/mysql/share/mysql/stopwords-gbk.txt
ft_min_word_len     = 2

  说明: ft_wordlist_charset 表示词典的字符集, 目前支持良好的有(UTF-8, gbk, gb2312, big5)
        ft_wordlist_file    是词表文件, 每行包括一个词及其词频(用若干制表符或空格分开,消岐专用)
        ft_stopword_file    表示过滤掉不索引的词表, 一行一个.
        ft_min_word_len     加入索引的词的最小长度, 缺省是 4, 为了支持中文单字故改为 2

  5. 重启 mysqld 服务器
    $PREFIX/share/mysql/mysql.server stop
    $PREFIX/share/mysql/mysql.server start

  6. 建表测试, 参见页面底部的测试命令或翻查 MySQL 手册吧.
  
本地下载
· [20060909] - 发布第一个版本, 内测完毕. 本地直接下载: mysql-4.0.26.h1.tgz (MD5: ffa39dfc9ab9cbff953035f2c084734



前瞻计划
* 在 SELECT 句法中加入 SEGMENT(str) 函数返回切好的词 (空格隔开??)
* 对于带有 MATCH() 从句或条件的 SELECT 句法可以使用 MATCH_POS() 返回第一次出现关键词的位置??
* 欢迎有兴趣的能人力士加入一起完善, 或计划提交给 mysql 总部?? (只是 mysql 发展太快了, 由于某些原因目前本人还在用 mysql 4.0)



其它说明
本软件秉承GNU(通用公共许可证)精神释出, 旨在抛砖引玉, 互相学习促进.
hack 部分的代码全部由本人(即 hightman)独立完成, 未经同意请勿修改代码包括但不限于商业应用、分支发布等. 本改进软件包不包含任何恶意代码, 由于本人水平及精力有限, Bug及错误之处在所难免, 由此升级修改引起的数据丢失等后果本人不承担任何责任.
关于本软件的bug报告、疑问以及建议或改进优化代码请联系我. (MSN: MingL_Mar@msn.com 或加 QQ群: 17708754)

对源码有兴趣者请自行 grep 与 HAVE_HIGHTMAN_MBFT 相关的部分代码 主要集中在以下文件:
  sql/mysqld.cc
  sql/set_var.cc
  include/ft_global.h
  myisam/ft_wordlist.c(新增)
  myisam/ft_stopwords.c
  myisam/ft_parser.c
  myisam/ftdefs.h
  myisam/ft_static.c
  
测试情况(略)

论坛徽章:
0
2 [报告]
发表于 2006-09-09 18:46 |只看该作者
现在发布第二次修订版本, 增加函数 SEGMENT(str) 用于 select 句法中... 直接返回分好的语汇(空格分开)
    这样的改法有点偏离初衷, 因为改动了它的语法 但没有想到更好的作法, 故暂时就这样了.

    原计划开发 MATCH_POS() 函数, 现已放弃, 只需配合 SEGMENT() + LOCATE() 很容易实现


  1. mysql> SELECT SEGMENT("hello,你好我是一个中国人。英语叫chinese");
  2. +----------------------------------------------------+
  3. | segment("hello,你好我是一个中国人。英语叫chinese") |
  4. +----------------------------------------------------+
  5. | 你好 我是 个中 国人 英语 叫 chinese                |
  6. +----------------------------------------------------+
  7. 1 row in set (0.00 sec)

  8. mysql> SELECT title, SEGMENT(title) from articles limit 4,4;
  9. +-------------------+-------------------+
  10. | title             | SEGMENT(title)    |
  11. +-------------------+-------------------+
  12. | MySQL vs. YourSQL | MySQL YourSQL     |
  13. | MySQL Security    | MySQL Security    |
  14. | 中国测试          | 中国 测试         |
  15. | 疯猜测中国测试    | 疯 猜测 中国 测试 |
  16. +-------------------+-------------------+
  17. 4 rows in set (0.00 sec)
复制代码

论坛徽章:
0
3 [报告]
发表于 2006-09-09 20:35 |只看该作者
建议把中文分词的词汇表发给mysql开发小组

论坛徽章:
0
4 [报告]
发表于 2007-05-16 12:03 |只看该作者
这么好的东西怎么没有人要啊?还是。。。

论坛徽章:
0
5 [报告]
发表于 2007-05-17 15:18 |只看该作者
支持hightman——开源中文搜索里程碑式的人物。

论坛徽章:
0
6 [报告]
发表于 2007-06-19 15:27 |只看该作者
支持,给我的公司网站很大帮助,辛苦了

论坛徽章:
0
7 [报告]
发表于 2007-06-24 05:28 |只看该作者
我总觉得任何基于字典的分词方法都可能漏词。还是做所有单个和2个连续中文字的索引比较合适,可是这样一来又会造成索引太大,这个问题一直困扰我。

论坛徽章:
0
8 [报告]
发表于 2007-06-29 18:29 |只看该作者
最好能在新版的MYSQL进行修改

论坛徽章:
0
9 [报告]
发表于 2007-09-30 19:48 |只看该作者
对马大牛简直崇拜的五体投地!呵呵

昨天试图在win编译您发布的mysql 5.1全文搜索插件,可是没有成功,mysql本身是编译成功了,但插件却只是得到了个lib文件,没法加载。不知道您有什么赐教呢

现在用了一个兄弟编译的win平台的您的4.0.27版本,很不错的说

论坛徽章:
0
10 [报告]
发表于 2007-10-01 13:44 |只看该作者
请问:
“hello,你好我是一个中国人。英语叫chinese”
这句话,用 “好我”去检索,能够检索到吗?
我发现现在所有的可以比较方便搞到的全文检索系统,都因为要分词而造成很多字不能检索到
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP