小编典典

Elasticsearch按动态价格排序

elasticsearch

这是场景:

想象一下,注册用户使用创建了一个新实体,price: 1 | currency: EUR而其他注册用户创建了一个新实体,price: 1 | currency: USD依此类推…

我想要做的是根据记录价格对记录进行排序,具体取决于前端用户选择的货币(欧元或美元)。

我无法编制索引,例如price_eurprice_usd,因为费率每小时都会变化,但是如果可能的话,更新10000条记录价格的最佳方法是什么?

1-以下是我的建议,它可行,但是我认为这可能是更好的方法,有什么建议吗?

2-如果没有,哪种性能更好?

3-ES有一些魔力可以发挥和使用,例如price_in_eur

功能评分

{
    "query": {
        "function_score": {
            "functions": [
                {
                    "script_score": {
                        // 1 EUR = 0.74452 USD
                        "script": "('EUR' == _source.currency ? doc['boat.price'].value : doc['boat.price'].value * 0.744520)"
                     }
                }
            ],
            "query": {
                "filtered": {
                    "query": { "match_all":{} }
                }
            }
        } 
    },
    "sort": { "_score": { "order": "desc" }}
}

排序脚本

{
    "fields": ["_source"],
    "query": { "match_all": {} },  
    "sort": {
        "_script": {
            // 1 EUR = 0.74452 USD
            "script": "('EUR' == _source.currency ? doc['boat.price'].value : doc['boat.price'].value * 0.744520)",
            "type" : "number",
            "order": "asc"

        }
    }
}

谢谢你的时间。


阅读 983

收藏
2020-06-22

共1个答案

小编典典

ES没有直接方法可以自动为您进行价格转换。您所做的方式是完成任务的正确方法。您应该进行功能评分查询,因为与基于单个脚本的排序相比,它会更好。如文档所述:

请注意,对于基于单个自定义脚本的排序,建议使用function_score查询代替,因为基于分数的排序更快。

使用功能分数查询会更好,因为对分数值进行排序会更快。

谢谢

2020-06-22