我正在尝试在查询中传递 id 数组,并希望以数组中 id 的相同顺序获取结果。我的数组中的元素数量因每个查询而异。我看到以下带有硬编码 id 的查询有效。但是我怎样才能让它与每个请求都会改变的数组一起工作。
我从其他回复中找到了以下查询,这与我的要求类似,但我的参数中的元素未修复。如何按顺序给数组的每个元素打分,以保持原始顺序。
{
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """for (int i = 0; i < params.scoring.length; i++) { if(doc['providerid'].value == params.scoring[i]['providerid']) return params.scoring[i]['score']; } return 0;""",
"params": {
"scoring": [
{
"providerid": 2000048977,
"score": 1
},
{
"providerid": 2000092892,
"score": 2
},
{
"providerid": 2000141299,
"score": 3
},
{
"providerid": 2000148861,
"score": 4
}
]
}
},
"order": "asc"
}
},
"query": {
"terms": {
"providerid": [
2000048977,
2000092892,
2000141299,
2000148861
]
}
}
}
任何指示将不胜感激。非常感谢。
您可以使用无痛排序脚本,例如
"def index = 0, indexMap = new HashMap();" +
"for (String str: params.ids) {" +
" shaIndexMap.put(str, index++);" +
"}" +
"if (doc[params.fieldName].size() == 0) {" +
" return Integer.MAX_VALUE;" +
"}" +
"for (int i = 0; i < doc[params.fieldName].length; ++i) {" +
" if (indexMap.containsKey(doc[params.fieldName][i])) {" +
" return shaIndexMap[doc[params.fieldName][i]];" +
" }" +
"}" +
"return Integer.MAX_VALUE;";
params.ids = ids you pass in the query
params.fieldName = field name of ES field (providerid)