Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246892
  • 博文数量: 61
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-14 15:18
文章分类

全部博文(61)

文章存档

2011年(4)

2010年(5)

2009年(10)

2008年(42)

我的朋友

分类: Mysql/postgreSQL

2008-03-10 16:08:29

有如下表,
| email | CREATE TABLE `email` (
  `email` varchar(250) character set latin1 collate latin1_bin NOT NULL default '',
  FULLTEXT KEY `idx_email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

表中含有不规范的邮件地址如下:

mysql> select * from email limit 10;
+-----------------------------+
| email                       |
+-----------------------------+
| |
|           |
|           |
|                |
| 000                         |
|             |
|   |
|                             |
|            |
|          |
+-----------------------------+

查询要求:返回正确的邮件地址。即含@字符。

方法1: 使用条件like '%@%'
方法2:使用全文索引
修改相关变量如下:
mysql> show variables like 'ft%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| |
| ft_max_word_len          | 84             |
| ft_min_word_len          | 1              |
| ft_query_expansion_limit | 20             |
| ft_stopword_file         | (built-in)     |

但是没有正确结果返回。
mysql> select * from email where match(email) against ('@');
Empty set (0.00 sec)

官方文档中提示
若要覆盖默认停止字,则可设置 ft_stopword_file 系统变量。 (见5.3.3节,“服务器系统变量”)。变量值应为包含停止字的文件路径名,  或是用来截止禁用词过滤的空字符串。在改变了这个变量的值或禁用词文件的内容后,  重建你的 FULLTEXT索引。

于是修改为:
mysql> show variables like 'ft%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| ft_boolean_syntax        | + -><()~*:""&|                 |
| ft_max_word_len          | 84                             |
| ft_min_word_len          | 1                              |
| ft_query_expansion_limit | 20                             |
| ft_stopword_file         | /usr/local/mysql/stopword_file |

但测试发现,仍未生效。

mysql> select * from email where match(email) against ("@");
Empty set (0.00 sec)

mysql> select * from email where match(email) against ('@' in boolean mode);
Empty set (0.01 sec)
 
全文索引至今还不支持中文,只有一些第三方的产品可供参考:
国内已有的MySQL中文全文索引解决方案有三个:
1.海量科技的,
2.hightman开发的,
3.插件  (for mysql 5.1 only)
 
 
 
 
阅读(768) | 评论(0) | 转发(0) |
0

上一篇:忘记root password

下一篇:Strong Mysql Scripts

给主人留下些什么吧!~~