gpt4 book ai didi

elasticsearch - 使用无痛脚本编写嵌套文档上的聚合

转载 作者:行者123 更新时间:2023-12-02 23:53:45 24 4
gpt4 key购买 nike

使用 flex 搜索6.2
因此,我具有一个深层嵌套的文档结构,该结构具有所有适当的映射(嵌套,文本,关键字等)。示例文件如下:

{
"type": "Certain Type",
"lineItems": [
{
"lineValue": 10,
"events": [
{
"name": "CREATED",
"timeStamp": "TIME VALUE"
},
{
"name": "ENDED",
"timeStamp": "TIME VALUE"
}
]
}
]
}

我想做的是找出所有行从“创建”到“结束”所需的平均时间。

我创建了以下查询
GET /_search
{
"size": 0,
"query": {
"match": {
"type": "Certain Type"
}
},
"aggs": {
"avg time": {
"nested": {
"path": "lineItems.events"
},
"aggs": {
"avg time": {
"avg": {
"script": {
"lang": "painless",
"source": """
long timeDiff = 0;
long fromTime = 0;
long toTime = 0;
if(doc['lineItems.events.name.keyword'] == "CREATED"){
fromTime = doc['lineItems.events.timeValue'].value.getMillis();
}
else if(doc['lineItems.events.name.keyword'] == "ENDED"){
toTime = doc['lineItems.events.timeValue'].value.getMillis();
}
timeDiff = toTime-fromTime;
return (timeDiff)
"""
}
}
}
}
}
}
}

结果是我得到0作为聚合结果,这是错误的。

有什么办法可以做到这一点?

最佳答案

在嵌套对象脚本中使用doc [不起作用,因为嵌套是用于 flex 搜索的新文档。

请改用params._source(https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html)。请注意,如果您有很多文档,或者需要大量查询,则对源的访问确实很慢,请考虑在主文档上添加此字段。

我认为所有值都存在,如果需要的话,如果要进行健壮性测试,则应该添加。

long toTime = 0; 
long fromTime = 0;
timeDiff = params['_source']['ENDED']
fromTime = params['_source']['CREATED']
return (toTime - fromTime);

关于elasticsearch - 使用无痛脚本编写嵌套文档上的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55352602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com