Elasticsearch按动态价格排序

时间:2014-08-03 15:19:20

标签: 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"

        }
    }
}

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

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

  

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

使用功能得分查询会更好,因为对得分值的排序更快。

由于