本地数据库存储在腾讯云的MySQL中,包括2类数据:
第三方数据源
第三方数据源需要和本地数据库es检索的结果混排后展示给页面显示。
热门搜索词主要来源用户搜索,目前场景比较简单,每天定时任务统计N天前的用户搜词词频,按搜索频次降序排序,存储到MySQL或者redis中。
但这种方法可能存在问题,热搜词没有时间权重衰减, 例如:一个关键词10天前搜索了101次,昨天搜索了100次,10天前的词还能继续排在昨天的热词前面吗? 因此需要设计一个热词衰减权重,搜索时间越长热度权重应该相应的衰减。
联想搜索需要在用户输入关键词时,联想用户可能想要搜索的词,该功能需要解决2个问题:
关联词来源可以通过用户搜索关键词记录来提取。
技术选择可以根据业务和当前的系统环境来判断:
我们的需求里面需要将不同类型的文档转换为纯文本,这里有几个开源的实现方案:
我结合自身业务的情况,选了上面4种之外的方法,我们文档存储在,直接调用`腾讯云API转html 或者text文档:文档转 HTML
如果没有使用腾讯云我这边推荐使用`FsCrawler, 可参考我之前的博文。
同步工具开源方案目前最活跃的应该是阿里巴巴开源的c ,可以看官网的原理介绍
注意:
另外你的第三方数据源没有存储在es数据库中,不能直接给出文档评分的,可以考虑以下混排方案:
由于要对2个数据源进行混排,要支持搜索跳页比较困难,因此在功能实现上目前只能支持上下翻页来实现
前端需要保存每一页es 和 api 两个数据源的偏移量:EsOffset 和 ApiOffset,可以使用对象数组保存, 翻页计算公式如下:
当前页码计算公式:
上一页:将当前页码减1 : , 获取上一页页面缓存的上一页 EsOffset 和 ApiOffset
下一页: , , 获取下一页的EsOffset 和 ApiOffset
注意:查询到第一页时,可清空页面分页缓存数组对象,重新存储。
查询首页,假设没页显示20条数据
请求参数:EsOffset = 0,ApiOffset=0, PageSize=20
返回结果:
前端需要需要页面需要保存当前第一页页面的 和 , ,页面缓存数据:
继续查询下一页
请求参数:
返回结果:
前端继续缓存当前分页数据:
查询上一页
请求参数:当前页码减1
返回结果:与第一页一致
如果是查询第一数据,清空缓存数组,重新缓存当前分页数据。
搜索权限需要满足根据用户权限过滤部分无权限的文档,以下是召回前处理和召回后处理权限的方案对比。
根据我的需求和场景,对性能要求较高,我们使用召回前过滤。如果希望简化查询过程,页可以考虑使用召回后过滤。
下面是在文档的权限格式,包含文档有权限的用户ID和部门ID
我们在设计索引mapping时
查询权限过滤参数:
通过收集用户搜索关键词存储在MySQL,每日定时任务统计热词和联想词来实现热门搜索榜和搜索联想词。
通过收集用户搜索词来统计热搜词, 其中热搜词的热度通过统计搜词词频来统计,统计包括热度周期,T+n 天的搜词次数排序,可以设计一个热度公式。
初始热度权重: w (默认1)
单位时间词频: c :(时间单位可以是 分钟、小时、天等,例如:以天为单位统计)
统计时间段数:T:(例如:连续统计30天关键词搜索频次)
单位时间热度: w / T(每个单位时间热度权重)
距离当前时间单位: n (例如计算最近30天,昨天的单位为:0)
一个词热度计算公式:
hot = [(T - 0)* c0 + (T - 1) * c1 + (T-2) * c2 + … + (T-n) * cn] * (w / T)
我们以按天统计,统计30天为例,每天的访问词频从近到远为: c0, c1, c2, … cn ( n 从0到29), 热度默认权重:1,时间段 T = 30(最近30天)
hot = [(30 - 0) * c0 + (30 -1) * c1 + (30-2)*c2 + … + (30 - 29) * c29] * 1 / 30
=> (30 * c0 + 29 * c1 + 28 * c2 + …+ c29) / 30
化简后可以得到热度公式:
每天定时任务统计用户搜索词,使用公式根据近30天的热度值,按从大到小排序top n;
将top n 结果存储到中,方便后续人工干预。
思考:同义词合并逻辑,类似词的搜索建议合并成一个词条,避免相似词太多。
搜索联想词,使用了es的数据类型, 提供了一个叫做 的功能,它是一个基于前缀的自动完成建议器,可以用来实现关键词联想。当你输入一个词的前缀时,它就可以提供一些可能的完成建议。
每日统计用户近3个月搜索词,排序前top n 个词;
将top n 写入es。(n >= 1000)。
文档质量优化:
排序优先级配置:支持不同来源数据设置不同权重。
搜索词库完善,补充分词器搜索词库:可以通过热门搜索词表和日常维护;
搜索词自动补全(completion类型)?
搜索词同义替换,输入错别字时能给出正确词的结果?
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:975644476@qq.com
本文链接:http://www.gawce.com/tnews/966.html