众所周知,最近在开发娱乐应用:可能媒用 结尾有体验链接
背景
开发项目时候用到的资源比较多,所有分了多个表,包括聊天话术表,菜单表,表情表等等。聊天话术功能本来就能搜索,但是其他功能都没有搜索功能,导致只能娱乐完全没有实用性可言,然后全站搜索功能应运而生了。
能看见这篇文章想必有些常识性问题就不用多介绍了 比如什么是全站搜索,应用场景有那是,有什么好处等等
废话到此为止
总共实现了两种方案
方案1(个人感觉不好用)
创建新表,该表功能定义就是做聚合使用,使用计划任务集合所有所有表中需要被搜索的字段
比如:有五张表 每张表都有不同的字段需要被搜索到 表一name 表二type 表三key 等
使用计划任务 定期同步 这些需要被搜索的地段到一个新表中,并且记录 该数据来自于那个表id值多少等
查询功能这里就多介绍了,正常联表查询就行
缺点:可能会形成操做堆积,聚合表过大优化难度高,高耦合,灵活度不高做特殊需求时数据操作难度大(我的全站就比较奇葩当时写到崩溃)
方案2(方案一hold不住搞出来的)
估计搜索词直接搜索各个表的数据然后将数据聚合,简单粗暴
但是坑也很多
传统分页没法搞(:pageIndex,pageSize)
解决:
用数据索引值代替页数,索引值为数组 有种表数据就有几个索引
每页数量 每张表都查询出足够的数量省的数量不够还有再查询补数据
如果不特殊处理可能数据乱序
这里所有数据的排序保持一致就行了(比如用创建时间排序)
第一种方案代码手抖给删了下面直接贴第二种方案的
async getData() { //整理参数 const event = { pageSize: this.ctx.event.pageSize || 10, skip: this.ctx.event.skip || [0, 0, 0, 0, 0], keywords: this.ctx.event.keywords } //表查询 const pAll = [ this.service.emoji.getData({ pageSize: event.pageSize * 3, skip: event.skip[0], keywords: event.keywords }), //github图片 this.service.library.getDataforMenu({ pageSize: event.pageSize * 3, type: 'img', skip: event.skip[1], keywords: event.keywords }), //library类型图片 this.service.msg.getData({ pageSize: event.pageSize, skip: event.skip[2], keywords: event.keywords }), //聊天数据 this.service.library.getDataforMenu({ pageSize: event.pageSize, type: 'text', skip: event.skip[3], keywords: event.keywords }), //library类型文字 this.service.library.getData({ pageSize: event.pageSize, type: 'text', skip: event.skip[3], keywords: event.keywords }), //library精准文字 ] const runData = await Promise.all(pAll); runData[0].data = _.chunk(runData[0].data, 3); runData[1].data = _.chunk(runData[1].data.map(item => { return { url: item.content } }), 3); //查询到的矩阵数据处理 _.xxx函数库 简单讲下做了点儿什么 //矩阵数据竖排分割,二维数据转一纬数据并去除空数据,截取参数要求数量的数据,将数据随机排列 const data = _.shuffle(_.slice(_.flattenDepth(_.zip(...runData.map((item, index) => { return item.data.map(zitem => { return { data: zitem, comType: index } }) })),1).filter(item => item) , 0, event.pageSize)) return { code: 200, data: { data:data, skip: runData.map((item, index) => { let i = 0; data.forEach(item => { if (item.comType === index) { if(item.comType === 0 || item.comType === 1){ i += item.data.length }else{ i++ } } }) return i + (event.skip[index] || 0); }) }, msg: '成功' } }
讯享网
但愿看到这篇文章的朋友们,提供宝贵意见,不胜感激!!!
小程序扫码体验:


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/72240.html