Elasticsearch script_score包含数组

时间:2014-05-18 19:38:14

标签: elasticsearch

我正在尝试使用script_score根据ID值的json更新分数。分数应将原始分数乘以params中列出的因子。

"script_score": {
    "params": {
      "ranking": {
        "1": "1.3403946161270142",
        "3": "1.3438195884227753"
       }
    },
    "script": "_score * ranking[doc['ID'].value]"
}

我收到以下错误:

nested: QueryParsingException[[index name] script_score the script could not be loaded]; nested: CompileException[[Error: unbalanced braces [ ... ]]\n[Near : {... _score * ranking[doc['ID'].value] ....}]\n                                         ^\n[Line: 1, Column: 29]]; }]"

如果我手动指定例如_score * ranking ['1']的ID,它可以正常工作。此外,如果我直接使用ID它可以工作,但如果我使用ID值作为索引则不行。我应该注意ID是一个整数。谁能帮我解决这个问题?此外,如果ID不在排名列表中,这将如何工作?它会把它当作得分='_得分'吗?

1 个答案:

答案 0 :(得分:1)

ranking param不是数组而是地图。用于ID字段的类型应与地图中用于键的类型匹配,并且提升应该是数字,而不是字符串。

这是一份文件:

{
  "ID" : "1"
}

这是更新的查询:

GET / test / _search

{
  "query": {
    "function_score": {
      "functions": [
        {
          "script_score": {
            "params": {
              "ranking": {
                "1": 1.3403946161270142,
                "3": 1.3438195884227753
              }
            },
            "script": "_score * ranking.get(_doc['ID'].value)"
          } 
        }
      ]
    }
  }
}

当前脚本不处理条目不在parama映射内的情况,导致NullPointerException的情况。

那就是说我认为这种提升方法不会扩展,因为你需要在你的参数中找到每个文档的一个条目,这是难以维护的。在每个文档中排名似乎更好,尽管每次要更改它时都需要更新它们。