1

我正在尝试进行单个查询来更新 ES 索引中的一个字段值。

我有一个索引pages,其中包含有关页面的信息(id、、、、name等)timeparent_page_idchild_count

我可以parent_page_id使用具有此页面的文档数量id更新该字段parent_page_id

我可以使用默认的单个值更新字段,例如:

PUT HOST_ADDRESS/pages/_update_by_query
{
  "script": {
    "source": "def child_count = 0; ctx._source.child_count = child_count;",
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}

我正在尝试使用此代码来获取孩子的数量,但它不起作用。

"source": "def child_count = 0; client.prepareSearch('pages').setQuery(QueryBuilders.termQuery("parent_page_id", "ctx._source.id")).get().getTotal().getDocs().getCount(); ctx._source.child_count = child_count;",
    "lang": "painless"

我的问题是,我怎样才能script在变量中进行子计数查询以使真正的子计数child_count

4

1 回答 1

2

脚本不是这样工作的——你不能在那里使用 java DSL。Painless contexts 中没有clientor QueryBuildersetc的概念。

因此,在继续使用脚本更新文档之前,您需要获取计数。

提示:脚本在存储时可以重复使用:

POST HOST_ADDRESS/_scripts/update_child_count
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.child_count = params.child_count"
  }
}

然后通过以下方式申请id

PUT HOST_ADDRESS/pages/_update_by_query
{
  "script": {
    "id": "update_child_count",     <-- no need to write the Painless code again
    "params": {
      "child_count": 987
    }   
  },
  "query": {
    "term": {
      "parent_page_id": 123
    }
  }
}
于 2021-03-24T14:11:41.177 回答