这是一个场景:
假设一个注册用户使用price: 1 | currency: EUR
创建了一个新实体,其他注册用户使用price: 1 | currency: USD
创建了一个新实体,以此类推......
我尝试做的是根据前端用户选择的货币(欧元或美元)按价格对记录进行排序。
我不能索引,例如price_eur
或price_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"
}
}
}
谢谢你的时间。
2条答案
按热度按时间iswrvxsc1#
ES无法直接为您自动进行价格转换。您所做的是完成任务的正确方法。您应该使用函数得分查询,因为它比基于单个脚本的排序更好。正如docs所述:
请注意,对于基于单个自定义脚本的排序,建议使用function_score查询,因为基于分数的排序速度更快。
使用函数分数查询会更好,因为对分数值排序更快。
谢谢
pgpifvop2#
您可以逐页读取每种货币的价格。然后合并页面以返回正确一致的结果。
下面是一些详细信息:https://medium.com/@johnniet19/search-and-sort-nft-by-usd-price-81927305f0a