全站搜索功能开发

众所周知,最近在开发娱乐应用:可能媒用  结尾有体验链接

背景

开发项目时候用到的资源比较多,所有分了多个表,包括聊天话术表,菜单表,表情表等等。聊天话术功能本来就能搜索,但是其他功能都没有搜索功能,导致只能娱乐完全没有实用性可言,然后全站搜索功能应运而生了。

能看见这篇文章想必有些常识性问题就不用多介绍了 比如什么是全站搜索,应用场景有那是,有什么好处等等

废话到此为止 

总共实现了两种方案

方案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: '成功'
		}
	}

但愿看到这篇文章的朋友们,提供宝贵意见,不胜感激!!!

小程序扫码体验:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Elasticsearch 是一种开源的全文搜索引擎,它可以帮助用户快速、准确地对网站中的所有内容进行搜索。作为一个全站搜索引擎,Elasticsearch 可以处理大量的数据,并提供高性能的搜索功能。它支持通过倒排索引技术来高效地搜索文本内容,并且可以实时更新索引以保持数据的实时性。使用 Elasticsearch 可以实现对网站内容的全文搜索,包括文章、博客、产品信息、用户评论等等。它提供了丰富的搜索功能,包括全文搜索、模糊匹配、聚合搜索、过滤器搜索等,能够帮助用户快速地找到他们感兴趣的内容。 利用 Elasticsearch 的全站搜索功能,用户可以轻松地在网站中进行全文搜索,无论是在桌面端还是移动端都能够得到良好的搜索体验。而且,Elasticsearch 还支持多语言搜索,可以处理不同语言的文本内容,并提供相关性排名功能,帮助用户找到最相关的搜索结果。另外,Elasticsearch 还可以通过配置不同的分片和复制策略来实现可伸缩性和高可用性,确保搜索服务的稳定性和可靠性。 总的来说,Elasticsearch 全站搜索功能强大而灵活,可以满足不同网站的搜索需求,帮助用户快速找到他们需要的信息,提升网站的用户体验,并且可以通过定制化的配置来满足不同场景的需求。因此,Elasticsearch 全站搜索成为了许多网站和应用的首选搜索引擎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值