如何通过查询更新以在Elasticsearch 6.4中从排序查询创建递增排名

时间:2018-09-19 12:37:59

标签: elasticsearch elasticsearch-painless

我正在尝试使用update_by_query对排序搜索中的项目进行排名。是否可以在脚本中获取文档的当前“索引”?

例如

创建索引:

PUT test
{
    "mappings" : {
        "person" : {
            "properties" : {
                "score" : { "type" : "integer" },
                "rank" : { "type" : "integer" }
            }
        }
    }
}  

添加文档:

POST /test/person/1
{
  "score": 100,
  "rank": 0
}
POST /test/person/2
{
  "score": 200,
  "rank": 0
}

update_by_query

POST /test/_update_by_query
{
  "script": {
    "source": "ctx._source.rank=3", // how to get document "index" in sort here?
    "lang": "painless"
  },
  "sort": { "score": "desc" }
}

按升序排序的结果应为

得分:200,排名:1 得分:100,排名:2

1 个答案:

答案 0 :(得分:0)

好像您正在尝试更新单个文档。为此,_update API将是一个更合适的选择。例如:

POST test/_update/1
{
    "script" : {
        "source": "ctx._source.rank=params.rank",
        "lang": "painless",
        "params" : {
            "rank" : 4
        }
    }
}

在上述情况下,您可以看到提供给API的文档ID仅更新该文档。

相反,_update_by_query API对索引中的每个文档执行更新。因此,如果您需要基于脚本更新多个文档,那么您就可以这样做。

希望有帮助...