这是我需要发送给ElasticSearch的查询:
{
"query": {
"match_all":{}
},
"sort": {
"_script": {
"type":"number",
"script": {
"inline":"statusMap[status] || 0",
"params": {
"statusMap": {
"CAN":5,
"COM":4,
"HLD":3,
"PEN":2,
"INP":1
}
}
},
"order":"desc"
}
}
}
其中
status
是字符串类型的字段。参数statusMap
的值可能因查询而异,并且我认为我可以通过按原样指定映射值来解决,因为这仍然是有效的JavaScript。然后我意识到脚本不是JS,而是Groovy。问题在于Groovy根本不喜欢
statusMap[status]
。这个JavaScript表达式在Groovy中是否等效?如果没有,有哪些替代方案?编辑
错误消息是
{
"error": {
"root_cause": [
{
"type": "script_exception",
"reason": "failed to run inline script [statusMap[status]] using lang [groovy]"
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "foo",
"node": "8AcXwANfSd-HF-nyMXHDLw",
"reason": {
"type": "script_exception",
"reason": "failed to run inline script [statusMap[status]] using lang [groovy]",
"caused_by": {
"type": "missing_property_exception",
"reason": "No such property: status for class: 5ea995c6862849ebdbc5e3d4126d81302185a798"
}
}
}
]
},
"status": 500
}
注意:将
statusMap[status]
更改为statusMap[doc.status.value]
会产生null_pointer_exception
错误消息。
最佳答案
关于elasticsearch - 在Groovy中动态访问JSON对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38592345/