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


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

    (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

    (于是乎,小帅一顿乱敲,搜索系统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
    
    • 1
    • 2
    • 3

    2、为字段增加全文索引

    alter table t_product add fulltext index fdx_title(title);
    
    • 1

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

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

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

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

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

    未完待续…

  • 相关阅读:
    C语言文件操作
    人体微生物是如何进行分布的
    DecorView和android.R.id.content的关系
    响应式数据
    10月30日,深圳见!51camera与您相约机器视觉展
    陈志泊主编《数据库原理及应用教程第4版微课版》的实验题目参考答案实验4
    深入理解 Android 模块化里的资源冲突
    PHP之美团餐饮系统,订单推送,订单同步,订单消息回调
    java计算机毕业设计项目任务管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    spark学习总结
  • 原文地址:https://blog.csdn.net/hanyi_/article/details/126068751