Elasticsearch:_search 脚本中的计数查询

Elasticsearch: count query in _search script

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

我有一个索引 pages,其中包含有关页面的信息(idnametimeparent_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": {}
  }
}

我正在尝试使用此代码获取 child 计数,但它不起作用。

"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 中创建子 count-query 以在变量 child_count

中有一个真正的 child 计数

脚本不是这样工作的——你不能在那里使用 java DSL。 Painless contexts.

中没有 clientQueryBuilders 等概念

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

提示:当您 store them:

时,脚本可以重复使用
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
    }
  }
}