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

Mysql  /  houtizong 发布于 3年前   118
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. 当 字段长度不够被截断后,所存储的信息输出时会无法转码

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客