Solr排序陷阱

简介: 假期梳理了之前在新浪博客的文档,将一些有用的内容搬到这里。本文是关于Solr排序陷阱。

背景

晚上,有同事咨询solr排序框架的事情。谈到混合排序的实现。依然不放过我昨天的建议:solr1.*4.*在排序框架上已经非常非常具有适应性、定制性、稳定性、先进性。没有必要整一个新的名词或者名称出来。不过,可以扩展solr的排序易用性和优化排序性能。


陷阱

讨论的对象: 因子A*文本得分 因子B*函数得分=文档得分。

目标:通过函数得分和文本得分的比例来调和最终命中的结果。solr直接提供的_val_ 是得分相加,并且没有显示“因子”的概念。


其实这里有陷阱。首先solr文本得分的归一化,和函数得分的归一化不一样,并且文本是语言方面的关联信息,而函数通常是业务方面的关联信息。实际测试发现,函数得分往往屏蔽了文本得分的影响。导致结果呈现另外一个极端,业务效果明显,而文本效果很糟糕。其实一个语言的就够复杂了,又融和一个业务的,并且要他们组合起来,把两种不同业务的东西通过单纯的数字组合起来。这不是拍脑袋的事情了。

其次,函数得分计算过程,往往与命中的文档的域值相关,这就涉及IO了。从而增加了排序阶段的IOCPU开销,当然cache能缓解部分压力,但是,依然存在cache击穿的风险。也就意味着,很容易在命中大的结果集时候,注定要发生超时。超时的排序,等于失败的排序,这样的排序没法上线。

第三,得分计算算法复杂度是线性的,但是,实际中,时间开销与命中文档规模、函数涉及的域多少是紧密相关的。假如命中10w,那么就多出了10w的函数得分计算开销。这就极大的影响了查询性能。并且,可能拖垮整个系统,导致整体响应时间变慢。进一步深入细说下,lucene索引结构和文本得分。

lucene搜索里面,文档得分是一档一分,也就是 document just。而不是全局得分corpus just。也就是说知道了doc 就知道了得分,而无需在命中结果集之后,再根据结果集的信息来计算得分。这样就可以做到得分计算,基于当前文档的“自封闭性”。而lucene索引结构,针对文本得分做了优化处理,tf itf 值在获取doc id的时候就已经知晓,无需额外的IO。这就是为何doc freq 联合编码的原因所在,获取了docid 同时获取了freq。而docfreq 通过term直接获取了的。


解法

那么这个文本与函数的融合,该如何处理?

回到问题的上一层,文本和函数的融合是出于什么,或者说需求是什么。

实践业务沟通中,原来需求是这样的:在文本搜索的时候,发现类似的文本太多了,我希望业务价值好的文档在文本得分接近的时候,尽可能的靠前点。这样既保持了文本的良好视觉、语义效果,又把业务期望凸显的文档展现了。两种方法可以解决:

方法1offline计算好得分,这样online开销降低,排序的时候sortby(score,desc,func desc);

方法2:两阶段排序 在文本相关性收集结果后,对topN执行函数排序。这样,可以实现文本相关度的筛选后,比较好的文档进一步参入函数排序。确保了结果近似最优,同时降低了函数排序部分IO开销,使得需求和实现的性能得到平衡。

目录
相关文章
|
4月前
|
算法 索引
一篇文章讲明白Lucene学习总结之九:Lucene的查询对象(2)
一篇文章讲明白Lucene学习总结之九:Lucene的查询对象(2)
19 0
|
5月前
|
存储 算法 关系型数据库
MySQL怎样处理排序⭐️如何优化需要排序的查询?
MySQL怎样处理排序⭐️如何优化需要排序的查询?
|
SQL 移动开发 BI
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
怎样对数据组合重新排列并去重的问题、通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。本篇文章主要介绍的两个方面,第一个方面曾经有好几个网友和同事问我,第二个问题真的是很多同行的通病,认为分析函数是万金油,一股脑用。
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
|
存储 数据采集 自然语言处理
lucene 索引流程详细分析|学习笔记
快速学习 lucene 索引流程详细分析
139 0
lucene 索引流程详细分析|学习笔记
|
Ubuntu Java 程序员
Elasticsearch聚合学习之五:排序结果不准的问题分析
Elasticsearch聚合后娶TopN的时候,经常会出现不准确的问题,今天就通过实战来分析这个问题
387 0
Elasticsearch聚合学习之五:排序结果不准的问题分析
|
SQL Java UED
ES中如何实现对查询结果的二次排序
ES中如何实现对查询结果的二次排序
457 0
|
存储 搜索推荐 Java
搜索引擎solr中string类型字段排序混乱问题
elasticsearch与solr作为目前市面上主流的搜索引擎可以满足绝大多数搜索场景,伴随着搜索而来的就是排序。下面记录一次solr中string类型字段排序混乱问题。
517 0
搜索引擎solr中string类型字段排序混乱问题
|
SQL 分布式计算 算法
Hive 中的四种排序详解,再也不会混淆用法了
排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用。
671 0
Hive 中的四种排序详解,再也不会混淆用法了
ORDER BY排序太简单?那是因为你还没用过这四大排序函数!
我们在写SQL代码时,只要有排序,首先想到的肯定是ORDER BY,以至于好多小伙伴觉得排序多简单啊。 今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()这四个好兄弟。
ORDER BY排序太简单?那是因为你还没用过这四大排序函数!
|
存储 自然语言处理 关系型数据库
Lucene的查询过程
Lucene的查询过程
189 0