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

本文探讨了在MySQL中使用全文索引优化大型数据集模糊查找的问题,包括配置调整、编码方式改变及解决中文分词和模糊查找支持的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql 全文模糊查找 便捷解决方案
2013/6/14 by 半仙 alxw4616@Msn.com

目的: 项目需求实现模糊查找.
原则: 查询不能超过 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 布尔全文搜索(详细说明见:[url]http://dev.mysql.com/doc/refman/5.1/zh/functions.html#fulltext-search[/url]);

新的问题: 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. 当 字段长度不够被截断后,所存储的信息输出时会无法转码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值