你有两种方法来实现这一点:一种是使用script-based sorting 就像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 相乘时,它会为您提供美元参考货币的金额。
不过,基于脚本的排序不是很高效,建议使用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
}
}
}
]
}
}
}