elasticsearch 弹性搜索排序预处理
我在ES中有一个索引,除了其他字段外,还有收入金额和收入货币字段。收入以不同的货币存储。在运行时,所有货币都转换为美元并呈现 现在,我想支持对revenue_amount字段进行排序。问题是ES在转换为美元之前根据收入对结果进行排序,因此顶部返回的收入可能不是转换为美元之后的最高收入 我想知道,在排序之前,ES是否可能调用用户定义的函数来更改字段值,然后应用排序?大概是这样的:
elasticsearch 弹性搜索排序预处理,
elasticsearch,lucene,
elasticsearch,Lucene,我在ES中有一个索引,除了其他字段外,还有收入金额和收入货币字段。收入以不同的货币存储。在运行时,所有货币都转换为美元并呈现 现在,我想支持对revenue_amount字段进行排序。问题是ES在转换为美元之前根据收入对结果进行排序,因此顶部返回的收入可能不是转换为美元之后的最高收入 我想知道,在排序之前,ES是否可能调用用户定义的函数来更改字段值,然后应用排序?大概是这样的: { "query": { "function_score": { "query": {
{
"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
}
}
]
}
}
}
转换后的收入=转换后的收入(收入)
因此,排序将应用于已转换的收入,而不是收入
我知道我可以在指数时间转换货币,但这需要在每次利率更新时刷新指数,因此如果可能,我希望避免这种情况。实现这一点的方法有两种:一种是使用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"
}
}
}
由于我们上面的脚本非常简单(即,将一个字段乘以某个因子),最简单的方法是使用,如下所示:
{
"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
}
}
]
}
}
}
如果您在elasticsearch中启用了脚本,您可以使用感谢您的回答。在我的例子中,因子不是静态的,而是取决于存储在ES中的基础revenue_currency字段。如何调用我的函数并将其传递到相应的收入\货币字段?i、 e“factor”:换算率(单据收入\货币.值)能否显示
收入\货币
字段的样本值?我的印象是,您不想将汇率存储在您的文档中,以便在汇率发生变化时不必对其重新编制索引(这是有道理的)。比方说,我的收入存储在三种不同的货币中,美元、欧元和澳元。在运行时,我将它们全部转换为美元。我有一个查找表,它告诉我从美元到欧元和澳元的转换率。因此,在转换任何收入字段之前,我需要检查相应的收入\货币字段以了解转换率。是的,货币汇率没有编制索引,但货币代码编制了索引。
{
"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
}
}
}
]
}
}
}