问题描述
我有一个索引 pages
,其中包含有关页面的信息(id
、name
、time
、parent_page_id
、child_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
中获得真正的子计数
解决方法
脚本不是这样工作的——你不能在那里使用 java DSL。 Painless contexts 中没有 client
或 QueryBuilders
等概念。
因此,您需要在之前获取计数,然后再使用脚本更新文档。
提示:当您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
}
}
}