• 从零开始搭建搜索推荐系统(五十二)ElasticSearch搜索利器


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

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



    一、小姐姐的到来

    (上文提到,小帅将搜索1.0 like版本升级到1.1 全文索引版本后,搜索页面终于不再卡顿,正想放松一下的时候,却被腹黑男泼了一盆冷水…)

    小帅:“你在说啥?”

    江华:“呵呵,你看,曹操不就来了嘛。”

    (这时候,行三小姐姐扭着小碎步正朝着小帅工位走来…小帅一下子眼睛就亮了)

    行三小姐姐:“小帅哥哥,这个搜索页面挺好用的,就是能不能加一些限定条件呢?例如我只想搜某个店铺或者某个分类下面的xx。还有就是同类xx能不能去重只返回一个?对了,展示的信息再丰富一些,例如图片、视频、标签这些。”

    小帅:“no婆布林,包在我身上!”(膨胀表情)

    行三小姐姐:“谢谢你哟,还是小帅哥哥厉害!那我等着你的好消息啦。”(笔芯表情)


    江华:“喂,麻烦擦一下你的哈喇子,都快淹掉工位了。”(无语表情)

    小帅:“真香…我感觉我又可以了!”(深吸一口气)

    老胡:“…”

    江华:“…”

    (小帅噼里啪啦一顿乱敲,打算用十分钟弄个1.2 限定去重优化版本,然鹅。。。)

    二、新的麻烦

    小帅:“老胡,老胡,江湖救急,行三小姐姐提的需求,让我同类的商品只返回一个,这玩意儿(搜索+折叠)在数据库好像实现不了,如果在返回的结果去重,分页大小就不一致,怎么办呢?我已经在小姐姐面前承诺了,呜呜呜…”

    江华:“活该,我都说你高兴太早了吧!夸你两句都快飞上天了。”

    老胡:“莫慌,先分析一下对方的诉求以及未来一段时间的演变趋势,然后再结合当前系统现状,再评估看看。”

    (于是,小帅静下心来,认真分析了需求和演变趋势,发现当前DB架构已经满足不了需求的迭代了。。。)
    在这里插入图片描述

    三、新的架构

    小帅:“以后行服肯定会提更多的过滤条件,过滤语句会很复杂,而且检索数据和详情数据要分库分表,分表后如果join查询,会变得更加复杂,脑壳痛!老胡老胡,怎么办呢?”

    老胡:“不错,看来你已经意识到当前架构已经满足不了需求的迭代演进了,可以换个新架构来实现。在实际架构选型需要考虑ROI,也就是投入产出比,包括人力、资源环境、技术栈等因素。考虑到你当前的业务比较简单,而且看着你的需求跟elasticsearch提供的特性很契合,所以你可以考虑用elasticsearch作为检索引擎,mysql作为你数据存储引擎,结合使用。”

    小帅:“哦哦,好啊,我试试!”
    在这里插入图片描述
    (于是,小帅噼里啪啦一顿乱敲,利用elasticsearch做数据过滤和去重,返回唯一键,然后用这些唯一键去数据库里查详情,检索与数据存储分离,充分利用各自特性,搜索系统2.0 elasticsearch版本出来了)

    主要技能点

    1、利用docker快速搭建ES环境。
    《搭建大型分布式服务(八)Docker搭建开发环境安装ES》

    2、利用封装的ETL工具,将数据从db里迁移到elasticsearch。
    《搭建大型分布式服务(三十四)十分钟搭SpringBoot积木 - 数据重放DB数据转kafka消息》
    《搭建大型分布式服务(三十二)十分钟搭Springboot积木 - 完成Kafka消息转存到ES》

    3、利用脚手架使用springboot集成es客户端。
    《搭建大型分布式服务(十八)Maven自定义项目脚手架》
    《搭建大型分布式服务(九)Springboot整合ES和RestHighlevelClient》

    4、利用elasticsearch的wildcard特性,实现模糊匹配,利用collapse特性,实现折叠功能。

    GET skus/_search
    {
        "from":0,
        "size":10,
    	"query": {
    	   "bool": {
    	     "must": [
    	       {
    	         "wildcard": { // 模糊匹配,类似sql中的like查询
    	           "skuNameChinese.raw": {
    	             "value": "*牛奶*"
    	           }
    	         }
    	       }
    	     ],
    	     "filter": { // 必要过滤,可以过滤多个条件
    	       "term": {
    	         "delFlag": "0"
    	       }
    	     }
    	   }
    	 },
        "_source":false, // 只返回唯一键,不返回数据字段,数据字段可以通过唯一键去db查询出来
        "sort":[
            {
                "id":{
                    "order":"asc"
                }
            }
        ],
        "collapse":{ // 指定折叠字段如productSpuId,并设置size=0,表示不适用内层inner_hits数据
            "field":"productSpuId",
            "inner_hits":{
                "name":"productSpuId",
                "ignore_unmapped":true,
                "from":0,
                "size":0,
                "version":false,
                "seq_no_primary_term":false,
                "explain":false,
                "track_scores":false
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    四、好景不长

    小帅:“搞定,总算可以给小姐姐交差了,不然噼里啪啦打脸了!es还真的强大!”

    江华:“es强不强小姐姐不知道,你是鶸估计大家都知道了。”

    小帅:“滚。。。”

    江华:“你看,写bug了吧,行服的人又找过来了。”

    (行服小姐姐拿着笔记本扭着小碎步向小帅工位走来)

    行三小姐姐:“小帅哥哥,为什么我搜不出数据,辛苦帮我看看哈。”(指着屏幕说)

    小帅:“不应该呀,我看看。”(凑近一看)

    小帅:“原来你是这样搜的啊,我想想办法,你回去稍等下哈,我解决了跟你说声。”(愁眉苦脸表情)

    行三小姐姐:“辛苦你啦,等你好消息哦!”

    是怎样的搜索让小帅变成苦瓜脸呢?

    未完待续…

  • 相关阅读:
    为什么在2024年应该使用AVIF而不是JPEG、WebP、PNG和GIF
    springboot+宴会预定平台 毕业设计-附源码231718
    基于Python实现的五子棋游戏设计(alpha-beta剪枝技术)
    效率回归,工具库之美「GitHub 热点速览」
    Pycharm将python程序打包为exe文件
    java项目-第99期基于spring+springmvc+hibernate的在线问卷答题系统-计算机毕业设计
    计算机毕业设计之微信小程序美容理发店预约系统app
    textarea自动高度 笔记221106
    【密评】商用密码应用安全性评估从业人员考核题库(十二)
    python学习笔记(9)—— 虚拟环境和包
  • 原文地址:https://blog.csdn.net/hanyi_/article/details/126298638