方法
方法1: 进行评分扩展,增加个默认字段,如果有直接从redis读取,redis保存key是文档id,对应的为相关数量
方法2: 一个document分主document和点击子doucument,点击子doucument每天晚上更新一次,通过主document和点击子doucument关联查询,针对结果评分。这样因为点击子doucument比较小,build起索引来也非常快
es处理方案:
stackoverflow上的讨论:
场景举例(从stackoverflow摘取):
搜索时候,被点击的数量,在文档上的停留时间,被搜索到的数量,最终影响到搜索的评分
处理方法综述:
1、采用 parent-child documents relationship模式,主文档放静态数据,子文档动态数据
2、动态统计的数据放到动态数据库,比如:mongo,每天定时更新到子文档中
优缺点:
动态文档相对较小,更新起来也比较快,缺点还是不实时
如何实现Solr自定义评分查询
参考文档:http://qindongliang.iteye.com/blog/2297814
实现策略
(1)在索引的时候把众多的业务评分计算提前计算好,存储成一个字段,然后查询的时候根据这个字段排名。
评价:比较简单暴力,适合加权固定,不经常改变评分因素的业务使用,查询性能最高 ,更新,改变,调试评分比较麻烦
(2)在索引的时候把众多的业务评分因子都索引成一个字段,在查询的时候动态获取各个字段评分计算后,加入总的评分从而影响最终的排名。
评价:对动态更改评分支持比较好,查询性能稍差
(3)对于业务的评分因素,动静分离,静态评分因子长期不变的,就全部计算完存储成一个字段,动态的也存储若干字段,最终的评分由静态业务评分+动态业务评分+相似度评分综合得出,从而影响最终的排名。
评价:合理规划评分因素,动静分离,算是业务与技术的一个折中
推荐lucence相关研究文章: