在 Elastic Search 中如何将分数应用于已传递的 Id 动态数组

问题描述 投票:0回答:1

我正在尝试在查询中传递 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
      ]
    }
  }
}


任何指示将不胜感激。非常感谢。

sorting elasticsearch search
1个回答
0
投票

您可以使用无痛排序脚本,例如

"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)
© www.soinside.com 2019 - 2024. All rights reserved.