身安不如心安,屋宽不如心宽 。

请教一个计算平均差值的问题

Elasticsearch | 作者 EricTowns | 发布于2023年12月27日 | 阅读数:3413

我使用的ES版本是7.10.2
现在有一个物品索引Item,mappings中
一个字段是文档创建时间docCreateTime,类型是date
一个字段是打标时间点timeInstances,类型是nested,多值,子字段tag为keyword,子字段time为date
我想要计算doc中timeInstances.tag=recQuery时候的timeInstances.time和docCreateTime这两个时间的平均差值
各位大佬能帮忙看下这个聚合语句应该要怎么写吗?多谢多谢
doc的例子如下:
{
"docCreateTime": 1703646416356,
"timeInstances": [
{
"tag": "entityWord",
"time": 1703646451356
},
{
"tag": "recQuery",
"time": 1703558822000
}
]
}
已邀请:

Ombres

赞同来自: liaosy

试试可以采取其他形式?比如 先算平均值再减
假设recQuery在一个文档中唯一, docCreateTime 和 timeInstances.time的总数应该是一样的 。分别计算docCreateTime 和timeInstances.time的平均值效率更高
 
{
"query": {
"nested": {
"path": "timeInstances",
"query": {
"term": {
"timeInstances.tag": {
"value": "recQuery"
}
}
}
}
},
"aggs": {
"docCreateTime_avg":{
"avg": {
"field": "docCreateTime"
}
},
"timeInstance_nested": {
"nested": {
"path": "timeInstances"
},
"aggs": {
"recQuery_filter": {
"filter": {
"term": {
"timeInstances.tag": {
"value": "recQuery"
}
}
},
"aggs": {
"time_avg": {
"avg": {
"field": "timeInstances.time"
}
}
}
}
}
}
}
}

 

EricTowns

赞同来自:

我用下面的语句,报错A document doesn't have a value for a field! Use doc[<field>].size()==0 to check if a document is missing a field!,是在nested的上下文里面拿不到docCreateTime的值
{
"aggs": {
"nested_time_instances": {
"nested": { "path": "timeInstances" },
"aggs": {
"avg_time_difference": {
"avg": {
"script": {
"source": "doc['timeInstances.time'].getValue().getMillis()-doc['docCreateTime'].getValue().getMillis()"
}
}
}
}
}
}

God_lockin

赞同来自:

印象里ES 的取值方式不支持访问nested的,可以试试object或者直接把几个时间冗余在第一层

要回复问题请先登录注册