【问题标题】:Elasticsearch sort by dynamic priceElasticsearch 按动态价格排序
【发布时间】:2014-08-04 01:15:35
【问题描述】:

这是场景:

假设注册用户使用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"

        }
    }
}

感谢您的宝贵时间。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

    使用函数分数查询会更好,因为按分数值排序更快。

    谢谢

    【讨论】:

    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多