有如下表,
| 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)
阅读(801) | 评论(0) | 转发(0) |