我已经成功地将python与elasticsearch (https://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#)和复合聚合一起使用了一段时间,但遇到了一个我无法解决的问题。我正在查询的数据是多个组织的资产数据,每个资产由一行组成。每行包含每个资产的两个日期(scan_date和时间戳),我需要搜索结果给出每个组织的最大(时间戳- scan_date),即最古老的"scan_age“。在SQL方面:
SELECT organization, MAX(timestamp - scan_date) as oldest_scan_age
FROM database
GROUP BY organizationelasticsearch库包含用于定义计算字段的函数script_fields(),但根据我所阅读(并尝试)的内容,我无法对脚本字段执行聚合。我需要的elasticsearch特性似乎是“运行时字段”,但是elasticsearch-dsl似乎没有提供我可以调用来指定运行时字段的函数。如果存在这样的函数,我可以调用它来定义一个名为"scan_age“的新字段,然后使用标准的复合聚合找到它的最大值。
如何使用elasticsearch-dsl执行此查询
请注意,(1)我已经知道如何使用通常与查询elasticsearch相关联的JSON语法来做到这一点。我要找的是如何在elasticsearch-dsl中实现它。(2)如果我能够编程地使用运行时字段来修改我的elasticsearch-dsl搜索对象,我很乐意创建自己的JSON来定义运行时字段。
发布于 2022-11-27 01:57:10
有一个向运行时字段添加支持的拉请求,如下所示:
https://github.com/elastic/elasticsearch-dsl-py/pull/1611/commits
您可以在映射中定义运行时字段,然后使用DSL运行常规聚合。
PUT my-index-000001/
{
"mappings": {
"runtime": {
"oldest_scan_age": {
"type": "date",
"script": {
"source": "emit(your_field_logic)"
}
}
},
"properties": {
"@timestamp": {"type": "date"}
}
}
}有一个答案显示了如何使用date max:
https://stackoverflow.com/a/49890932/3112848
如果成功或者你需要更多的帮助,请告诉我
发布于 2022-11-29 12:39:39
在添加此特性之前,解决方法是调用extra(),传递定义运行时字段标准JSON的字典。这将将JSON添加到搜索对象(底部)。例如:
d = {
"runtime_mappings": {
"age": {
"type": "long",
"script": {
"source": "emit(doc['@timestamp'].value - doc['host.last_seen_date'].value)"
}
}
}
}
search_obj = search_obj.extra(d)https://stackoverflow.com/questions/74578081
复制相似问题