我在ES中有一个索引,除其他字段外,该索引还具有Revenue_amount和Revenue_currency字段。收入以不同的货币存储。在运行时,所有货币都将转换为USD并进行渲染。
现在,我想支持在Revenue_amount字段上进行排序。问题在于ES在转换为USD之前会根据收入对结果进行排序,因此返回顶部的收入可能不是转换为USD后的最高收入。
我想知道,是否有可能在排序之前,ES调用用户定义的函数来更改字段值,然后再应用排序?像这样:
Revenue_converted = convertToUSD(收益)
因此,排序将应用于收入转换后的收入,而不是收入。
我知道我可以在索引时转换货币,但是这需要在每次汇率更新时刷新索引,因此,如果可能的话,我想避免这种情况。
您有两种方法可以实现此目的:一种是通过使用基于脚本的排序(如keety所述):
{
"query" : {
.... <--- your query goes here
},
"sort" : {
"_script" : {
"script" : "doc.revenue_amount.value * usd_conversion_rate",
"type" : "number",
"params" : {
"usd_conversion_rate" : 0.4273 <--- the conversion rate to USD
},
"order" : "desc"
}
}
}
该usd_conversion_rate
因素是转化率美元。因此,例如,如果1美元价值2.34单位另一种货币,则usd_conversion_rate
系数为1 / 2.34
(或0.4273
)。乘以后,revenue_amount
您会得到美元参考货币的金额。
但是,基于脚本的排序不是很有效,建议使用a,function_score
以便可以按分数对结果进行排序。这使我们找到了实现您所需要的第二种方式,它就是这样。一种方法是使用script_score
函数,但这又涉及脚本。
{
"query": {
"function_score": {
"query": {},
"functions": [
{
"script_score": {
"script": "doc.revenue_amount.value * usd_conversion_rate",
"boost_mode": "replace",
"params": {
"usd_conversion_rate": 0.4273
}
}
}
]
}
}
}
由于我们上面的脚本非常简单(即,将某个字段乘以某个系数),因此最简单的方法将涉及使用field_value_factor
,它的内容如下:
{
"query": {
"function_score": {
"query": {
... <--- your query goes here
},
"functions": [
{
"field_value_factor": {
"field": "revenue_amount",
"boost_mode": "replace",
"factor": 0.4273 <--- insert the conversion rate here
}
}
]
}
}
}
更新
根据您的最新评论,看来适合您的选择script_score
毕竟是使用。这里的想法是在查询表中输入所有可用的货币汇率作为script_score
脚本的参数,然后根据该revenue_currency
字段的值使用适当的汇率。
{
"query": {
"function_score": {
"query": {},
"functions": [
{
"script_score": {
"script": "doc.revenue_amount.value * (doc.revenue_currency.value == 'EUR' ? EUR : (doc.revenue_currency.value == 'AUD' ? AUD : 1))",
"boost_mode": "replace",
"params": {
"EUR": 0.4945,
"AUD": 0.5623
}
}
}
]
}
}
}
一个痛苦而愚蠢的问题,我几乎羞于不敢问。在过去的4个小时里,我一直在寻找,测试了不同的算法,在纸上尝试了不少,但仍然无法正常工作。 我将为您提供项目实现的详细信息,但基本问题是:“如何处理在预排序二叉树中插入节点。 通过预排序BST,我的意思是所有节点都应该以这样的方式插入,即使用预排序遍历(例如用于打印)遍历树时,应该按升序打印节点。 我只需要一个简单的算法。我尝试了这里给出的一个简单的插入算法
问题内容: 用Python的方式搜索或操作排序序列是什么? 问题答案: 是标准库的一部分-您正在寻找这种东西吗?
假设我有三个指数:城市、博物馆和景点。 现在我正在查询一个术语的所有索引(),例如“维也纳” 作为结果,我得到: 维也纳:维也纳艺术博物馆 有没有办法优先考虑指数,这样我就可以得到第一个城市,而不是景点,最后是博物馆,就像这样: 维也纳 维也纳的Riesenrad 维也纳:维也纳艺术博物馆 维也纳:维也纳历史博物馆
主要内容:numpy.sort(),numpy.argsort(),numpy.lexsort(),numpy.nonzero(),numpy.where(),numpy.extract(),numpy.argmax(),numpy.argmin()NumPy 提供了多种排序函数, 这些排序函数可以实现不同的排序算法。 排序算法特征主要体现在以下四个方面:执行速度,最坏情况下的复杂度,所需的工作空间以及算法的稳定性。下表列举了三种排序算法: NumPy排序算法 种类 速度 最坏复杂度 工作空间
这个练习中我打算涉及到四个排序算法和一个搜索算法。排序算法是快速排序、堆排序、归并排序和基数排序。之后在你完成基数排序之后,我打算想你展示二分搜索。 然而,我是一个懒人,大多数C标准库都实现了堆排序、快速排序和归并排序算法,你可以直接使用它们: #include <lcthw/darray_algos.h> #include <stdlib.h> int DArray_qsort(DArray
我需要对以搜索词开头的搜索结果进行优先级排序。我用了“匹配短语前缀”。我用了“匹配短语前缀”。但它不起作用。 细节: > 质疑 结果