elasticsearch 弹性搜索排序预处理,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch 弹性搜索排序预处理,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch 弹性搜索排序预处理

elasticsearch 弹性搜索排序预处理,elasticsearch,lucene,elasticsearch,Lucene,我在ES中有一个索引,除了其他字段外,还有收入金额和收入货币字段。收入以不同的货币存储。在运行时,所有货币都转换为美元并呈现 现在,我想支持对revenue_amount字段进行排序。问题是ES在转换为美元之前根据收入对结果进行排序,因此顶部返回的收入可能不是转换为美元之后的最高收入 我想知道,在排序之前,ES是否可能调用用户定义的函数来更改字段值,然后应用排序?大概是这样的: { "query": { "function_score": { "query": {

我在ES中有一个索引,除了其他字段外,还有收入金额和收入货币字段。收入以不同的货币存储。在运行时,所有货币都转换为美元并呈现

现在,我想支持对revenue_amount字段进行排序。问题是ES在转换为美元之前根据收入对结果进行排序,因此顶部返回的收入可能不是转换为美元之后的最高收入

我想知道,在排序之前,ES是否可能调用用户定义的函数来更改字段值,然后应用排序?大概是这样的:

{
  "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
            }
          }
        }
      ]
    }
  }
}