mysql 全文模糊查找 便捷解决方案

mysql 全文模糊查找 便捷解决方案
2013/6/14 by 半仙 [email protected]

目的: 项目需求实现模糊查找.
原则: 查询不能超过 1秒.

问题: 目标表中有超过1千万条记录. 使用like '%str%' 进行模糊查询无法达到性能需求.
解决方案: 使用mysql全文索引.
1.全文索引 : MySQL支持全文索引和搜索功能。MySQL中的全文索引类型FULLTEXT的索引。  FULLTEXT 索引仅可用于 MyISAM 表;他们可以从CHAR、 VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或 CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引, 其速度比把资料输入现有FULLTEXT索引的速度更为快。
2.语法     :  select * from test where match(content) against('"iphone"' IN BOOLEAN MODE)
IN BOOLEAN MODE  布尔全文搜索(详细说明见: http://dev.mysql.com/doc/refman/5.1/zh/functions.html#fulltext-search);

新的问题: 1. 在mysql 中全文索引 不支持中文分词.
2. 在使用全文索引时 不支持模糊查找.
//table
id content
1 iphone
2 iphone5
3 wphone5
select * from test where match(content) against('"iphone"' IN BOOLEAN MODE)
//只能得到
1 iphone
//不能模糊找到
2 iphone5
3 wphone5

解决方案:
1.微调MySQL全文搜索 : 修改my.cnf () (linux下使用 whereis my.cnf 查找该文件 )
[mysqld]
# 不使用停止词
ft_stopword_file = ''
# 最少单词 为1个字的英文
ft_min_word_len = 1

重启mysql(linux:service mysql restart)
重建索引 REPAIR TABLE tableName QUICK (tableName 表名)
2. 入库时使用 unicode 编码 将所有字符编码
// 将 phone 编码 >> \u0070\u0068\u006f\u006e\u0065
//table
id content
1 \u0069\u0070\u0068\u006f\u006e\u0065
2 \u0069\u0070\u0068\u006f\u006e\u0065\u0035
3 \u0077\u0070\u0068\u006f\u006e\u0065\u0035

select * from test where match(content) against('"\\u0070\\u0068\\u006f\\u006e\\u0065"' IN BOOLEAN MODE)
输出
1 \u0069\u0070\u0068\u006f\u006e\u0065
2 \u0069\u0070\u0068\u006f\u006e\u0065\u0035
3 \u0077\u0070\u0068\u006f\u006e\u0065\u0035
再次 解决 即可得到想要的结果
1 iphone
2 iphone5
3 wphone5

最终问题:
1. 数据在入库时 相当示扩容了6位.
2. 当 字段长度不够被截断后,所存储的信息输出时会无法转码

你可能感兴趣的:(mysql)