免费注册 查看新帖 |

Chinaunix

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

求助:关于全文索引的应用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-10 13:53 |只看该作者 |倒序浏览
10可用积分
有如下表,
| 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                       |
+-----------------------------+
| axycy@gmail.com |
| 0000000000@cox.net          |
| 00000000@00000.com          |
| 00000@163.com               |
| 000                         |
| 0000@hotmail.com            |
| 00073076@snow.edu  |
|                             |
| 000k100@gmail.com           |
| 001870@cmail.com         |
+-----------------------------+

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

方法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)

请大家帮忙。

[ 本帖最后由 r_a 于 2008-3-10 14:01 编辑 ]

最佳答案

查看完整内容

貌似全文搜索会忽略英文的标点符号,把@换成中文的@或者转义代码能绕过去,当然还是有种种不便

评分

参与人数 1可用积分 -2 信誉积分 -4 收起 理由
yueliangdao0608 -2 -4 发错版块

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-03-10 13:53 |只看该作者
貌似全文搜索会忽略英文的标点符号,
把@换成中文的@
或者转义代码
  1. &#x40
复制代码

能绕过去,当然还是有种种不便

评分

参与人数 1可用积分 +10 收起 理由
yueliangdao0608 + 10 我很赞同

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2008-03-10 14:41 |只看该作者
英文的全文索引只对空格分开的单词有效。因为你的email地址是没有空格的,你可以测试一下,加一个"test     @    test.com"记录,再用你的语句就可以看出来了。
中文的全文索引无效。
建议你放弃全文索引。

论坛徽章:
0
4 [报告]
发表于 2008-03-10 15:00 |只看该作者
谢谢2楼,于是进行测试。
mysql> insert into email values('test @ test.com');
Query OK, 1 row affected (0.00 sec)

mysql> repair table email quick;
+---------------+--------+----------+----------+
| Table         | Op     | Msg_type | Msg_text |
+---------------+--------+----------+----------+
| ue_wang.email | repair | status   | OK       |
+---------------+--------+----------+----------+
1 row in set (7.26 sec)

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

还是没有结果返回。但用其它字符测试正常
mysql> select * from email where match(email) against ('q') ;
+----------------------+
| email                |
+----------------------+
| ethankalel4444@q.com |
| Lincsterbuys@q.com   |
| q@q40.us             |
| q@g.it               |
| sesshoumaru@q.com    |
| tmccrary@q.com       |
| cosmic5@q.com        |
| branflakes@q.com     |
| bencamberg@q.com     |
| q@hotmail.com        |

个人觉得,还是与系统的ft_stopword相关。
后来索性设ft_stopword='', 但仍然无效。
郁闷ing...

论坛徽章:
0
5 [报告]
发表于 2008-07-04 17:13 |只看该作者
最近做邮件地址的搜索,也碰到这个类似的问题,郁闷

论坛徽章:
0
6 [报告]
发表于 2008-07-04 20:07 |只看该作者
在入库前检查比较好吧   这样做fulltext没效果吧  如果有这样的呢  sde@sdf@d.com  合法还是非法?
12. make it a habit to REVERSE() email addresses, so you can easily search domains (this will help avoid wildcards at the start of LIKE queries if you want to find everyone whose e-mail is in a certain domain)

论坛徽章:
0
7 [报告]
发表于 2008-07-05 00:28 |只看该作者
你最小分词单位是1啊。
对于单位长度是太小的。
布尔模式有时候也是找不到的。
select * from email where match(email) against ('+@' in boolean mode);

论坛徽章:
0
8 [报告]
发表于 2008-07-05 12:06 |只看该作者
原帖由 yueliangdao0608 于 2008-7-5 00:28 发表
你最小分词单位是1啊。
对于单位长度是太小的。
布尔模式有时候也是找不到的。
select * from email where match(email) against ('+@' in boolean mode);



如楼上所言,用布尔模式测试,但仍没有结果返回。

mysql> select * from email where match(email) against ('+@' in boolean mode);
Empty set (0.06 sec)

论坛徽章:
0
9 [报告]
发表于 2008-07-19 16:35 |只看该作者
不知楼主修改后重建fulltext索引了没有?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP