我正在尝试使用多个脚本对 Elastic 6.7 中的结果进行排序
不幸的是,我没有找到尝试很多组合的方法。
我不能只使用一个脚本来完成所有操作,因为过滤器和排序是动态的。
这是我的查询:
{
"query": {
"bool": {
"must": [],
"filter": []
}
},
"sort": {
"_script": [
{
"type": "number",
"order": "desc",
"script": {
"lang": "painless",
"source": "doc['status.keyword'].value == 'active' ? 1 : 0;"
}
},
{
"type": "number",
"order": "desc",
"script": {
"lang": "painless",
"source": "(doc['s_price'].value/doc['currency.usd_c'].value*params.cvs)",
"params": {
"cvs": 42.71
}
}
}
]
},
}
谢谢!!
POST /_update_by_query
{
"script": {
"source": "ctx._source.active += ctx._source['status.keyword'].value == 'active' ? 1 : 0;",
"lang": "painless"
},
"query": {
"match_all": {}
}
}
GET /_search
{
"query": {
"function_score": {
"query": {
"bool": {
"must": [],
"filter": []
}
},
"script_score" : {
"script": {
"source": "(doc['s_price'].value/doc['currency.usd_c'].value*params.cvs)",
"params": {
"cvs": 42.71
}
}
}
}
},
"sort": [{
"active": "desc"
},
{
"score": "desc"
}]
}
使用批量更新为其中一个查询添加字段active
。并使用function_score
查询来计算另一个值。先按active
排序,再按score
排序
使用多个脚本对运行时字段进行排序变得更加容易。如果您使用的是 ES 7.11 或更高版本,只需为每个脚本定义一个运行时字段,并使用这些字段对数据进行排序:
{
"query": {
"bool": {
"must": [],
"filter": []
}
},
"runtime_mappings": {
"active": {
"type": "long",
"script": {
"lang": "painless",
"source": "emit(doc['status.keyword'].value == 'active' ? 1 : 0);"
}
},
"price": {
"type": "long",
"script": {
"lang": "painless",
"source": "emit(doc['s_price'].value/doc['currency.usd_c'].value*params.cvs)",
"params": {
"cvs": 42.71
}
}
}
},
"sort": [
{
"active": {
"order": "desc"
}
},
{
"price": {
"order": "desc"
}
}
]
}
请注意,运行时字段中的脚本不能使用 return
来发出值,但您需要使用 emit
函数。