从零开始搭建搜索推荐系统(五十一)从一个模糊查找的需求开始

29 篇文章 3 订阅
3 篇文章 0 订阅

聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧!

(PS:本系列文章以幽默风趣风格为主,较真侠和杠精请绕道~)



一、需求起源

(某天,端着水杯的老胡路过时看见小帅在电脑前噼里啪啦折腾键盘。。。)

老胡:“小帅你干啥呢,怎么跟键盘过不去?”

小帅:“别提了,刚才行一的人让我从这堆数据里找出包含xxx的东西,完了后行二的人也找过来说给她找出xxx的东西,下班前给到,眼都花了。。。诶我的Control+F键怎么就不好使了。。。”

老胡:“。。。”

江华:“。。。差点当场QS,亏你还说自己是个程序员!”

老胡:“小帅,你这样可不行,明天行三,后天行四的人过来找你要数据,换三个键盘也搞不定啊。为啥不做个查找小功能,让行服的人要什么数据就查什么呢。”

小帅:“诶对哦,昨天从tony老师那里学了sql,好像里面就有个like模糊查找,我马上做一个!”

二、最初的设计

(小帅想了下,可以做个简单的前端界面,作为用户,然后发送请求到后端,后端拼接成sql语句,从db里查出数据,然后返回json数据给前端展示。)
在这里插入图片描述
主要技能点
1、利用脚手架快速搭建java工程
《搭建大型分布式服务(十八)Maven自定义项目脚手架》

2、测试环境搭建数据,并导入数据
《搭建大型分布式服务(四)Docker搭建开发环境安装Mysql》

3、使用mybatis作为orm框架,并使用高速数据库连接池hikari
《搭建大型分布式服务(五)Springboot整合mybatis》
《搭建大型分布式服务(六)SpringBoot整合数据库连接池hikari》

核心原理
利用SQL的like语法,拼上前端请求的keyword,在数据库上执行

select * from t_product where title like '%keyword%'

(于是乎,小帅一顿乱敲,搜索系统1.0 like版本出来了)

小帅:“哈哈哈,搞掂收工!终于不用换键盘啦,还是like给力!要查什么东西,让行服的人自个儿查去,我去接小檬下班啦!”

老胡:“。。。”(一副看傻子的表情)

江华:“。。。”(一副看傻子的表情)

三、新的麻烦

(可是,好景不长,当数据增长到几十万后,行服输入关键字后,等半天都没结果返回。。。)

小帅:“老胡老胡,江湖救急,这sql语句执行太慢了,前端所有请求都超时了,再不解决行服的人都要提刀过来啦!”

老胡:“别急,当数据增长到一定程度的时候,传统like语句容易出现性能瓶颈,这是正常现象。”

小帅:“那怎么办呢?”

江华:“都不知道你脑子整天想啥,前天讲sql的时候,tony不是说到全文索引嘛,换下试试?”

小帅:“哦哦,对哦,我马上改改!”

江华:“别忘了配置最小搜索长度。”

小帅:“好的,知道的!”

四、全文索引

MySQL has support for full-text indexing and searching:

  • A full-text index in MySQL is an index of type FULLTEXT.

  • Full-text indexes can be used only with InnoDB or MyISAM tables, and can be created only for CHAR, VARCHAR, or TEXT columns.

  • MySQL provides a built-in full-text ngram parser that supports Chinese, Japanese, and Korean (CJK), and an installable MeCab
    full-text parser plugin for Japanese. Parsing differences are outlined
    in Section 12.10.8, “ngram Full-Text Parser”, and Section 12.10.9,
    “MeCab Full-Text Parser Plugin”.

  • A FULLTEXT index definition can be given in the CREATE TABLE statement when a table is created, or added later using ALTER TABLE or
    CREATE INDEX.

  • For large data sets, it is much faster to load your data into a table that has no FULLTEXT index and then create the index after that,
    than to load data into a table that has an existing FULLTEXT index.

小帅利用mysql支持全文索引的特性,快速做了以下修改。

1、修改/etc/my.conf文件,增加以下参数并重启mysql镜像。

[mysqld]
innodb_ft_min_token_size = 1
ft_min_word_len = 1

2、为字段增加全文索引

alter table t_product add fulltext index fdx_title(title);

3、修改查询语句,和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字

select * from t_product where match(title) against('keyword');

于是,噼里啪啦一顿操作,小帅搞出1.1 全文索引版本。

小帅:“淦,好险,差点被行服的人砍了,页面查询总算不卡了!总算可以去潇洒了。”

江华:“呵呵,你高兴得太早了。”

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值