Elasticsearch:在 _search 脚本中计数查询

问题描述

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

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

我可以使用包含此页面 parent_page_idid 的文档数量更新字段 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 中没有 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
    }
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...