最近有一个关于ES的排序问题,想问下dl们:
目前我的排序是用es的painless的自定义排序去做的,但是我在脚本return的时候加了一个double类型的数,接口性能从平均500ms,慢到了1s~2s,非常奇怪,想问问dl们有没有什么解决方案
操作前的脚本:
double total = doc['score1'].value;
long m=params.m
total /= Math.log(m);
total+=doc['score2'].value;
return Math.rint(total*10000)/10000;
操作后的脚本
double total = doc['score1'].value;
long m=params.m
total /= Math.log(m);
total+=doc['score2'].value+doc['score3'].value;
#这里就多了一个score3 是double类型的,score1也是double, score2是long
return Math.rint(total*10000)/10000;
查了很多也没有发现是哪里的问题,qq各位dl帮忙分析下
有可能是添加了double类型的数导致排序变慢。导致执行时间延长。
可以尝试
将排序逻辑移动到应用程序代码中,避免使用painless脚本。
调整您的脚本以减少处理的数据量。例如,您可以尝试仅将需要排序的字段传递到脚本中,并在脚本中仅对这些字段进行操作。另外,您还可以尝试使用其他类型的排序,如基于文档评分的排序(如ES的默认排序方式)或者函数得分等。
参考GPT: 应该是引入了新的字段导致的。计算量的增加。你试下只有doc['score3'].value;会怎么样
对于ES的painless自定义排序性能下降问题,可能是由于以下原因:
复杂的排序算法:当自定义排序算法变得太复杂时,会导致ES在执行排序操作时的性能下降。因此,应该尽量简化自定义排序算法来提高性能。
大规模数据集:如果需要对大规模数据集进行排序操作,则可能需要更多的计算资源来处理排序操作,这可能导致ES的性能下降。
服务器配置不足:较小的服务器资源可能无法处理复杂的排序操作或大规模数据集,这也会导致ES的性能下降。
为了解决这些问题,可以考虑以下解决方案:
简化排序算法:尽量使用较简单的排序算法,以提高ES的性能。
优化服务器配置:增加服务器资源和配置,以提高ES的性能。
减少数据集大小:对数据集进行筛选或划分,以减少排序所需的计算量。
调整ES的配置:通过调整ES的配置参数,可以提高ES的性能。例如,增加堆大小或缓存大小等。
总之,要解决ES的painless自定义排序性能下降问题,需要综合考虑多个因素,并采取相应的措施来改善性能。
不知道你这个问题是否已经解决, 如果还没有解决的话:上文我们所分析的数组是常态数组 , 一维数组 , 接下来我们分析动态数组
动态数组(也称为可增数组、可变长数组、动态表、数组表)是一种可随机存取且可自动调整大小的线性数据结构,能够添加或删除元素。
实现动态数组的一个简单方法是,首先初始化固定大小的数组。一旦数组存储满了,创建一个1.5倍于原始数组大小的新数组(将旧数组数据复制进新数组)。同样,若数组中存储的元素个数小于数组大小的一半,则把数组大小减少一半。