ElasticSearch按动态价格排序

sbtkgmzw  于 2023-03-12  发布在  ElasticSearch
关注(0)|答案(2)|浏览(195)

这是一个场景:
假设一个注册用户使用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"

        }
    }
}

谢谢你的时间。

iswrvxsc

iswrvxsc1#

ES无法直接为您自动进行价格转换。您所做的是完成任务的正确方法。您应该使用函数得分查询,因为它比基于单个脚本的排序更好。正如docs所述:
请注意,对于基于单个自定义脚本的排序,建议使用function_score查询,因为基于分数的排序速度更快。
使用函数分数查询会更好,因为对分数值排序更快。
谢谢

pgpifvop

pgpifvop2#

您可以逐页读取每种货币的价格。然后合并页面以返回正确一致的结果。

下面是一些详细信息:https://medium.com/@johnniet19/search-and-sort-nft-by-usd-price-81927305f0a

相关问题