elasticsearch 通过按查询更新API更新第一个文档

sg2wtvxw  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(148)

我试图让ElasticsearchMongoDBfindOneAndUpdate方法所做的同样的事情,但是这似乎是不可能的。
用例是多个服务器和线程将查看特定的索引以完成下一个任务。
因此,我最好的办法是使用唯一ID更新“下一个”任务/文档,然后检索该文档。
此查询将为我提供下一个要检索的文档:

GET /test_index/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "next_id"
        }
      }
    }
  },
  "sort": {
    "next_update": {"order": "asc"}
  },
  "size": 1
}

但是我似乎不知道如何使用Update By Query API只更新一行,我一直在尝试这个查询,但是它更新了找到的每个文档:

POST /test_index/_update_by_query
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "next_id"
        }
      }
    }
  },
  "sort": {
    "next_update": {"order": "asc"}
  },
  "script": {
    "source": "ctx._source['next_update'] = params.next_id",
    "params": {
      "next_id": "xxxx"
    }
  }
}

我该如何解决这个问题?

xhv8bpkk

xhv8bpkk1#

您可以在_update_by_query中使用max_docs参数,并将值设置为1,以便仅对一个文档执行此操作。
您可以查看this文档。

POST /test_index/_update_by_query
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "next_id"
        }
      }
    }
  },
 "max_docs": 1,
  "sort": {
    "next_update": {"order": "asc"}
  },
  "script": {
    "source": "ctx._source['next_update'] = params.next_id",
    "params": {
      "next_id": "xxxx"
    }
  }
}

相关问题