首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用elasticsearch-dsl创建运行时字段?

如何使用elasticsearch-dsl创建运行时字段?
EN

Stack Overflow用户
提问于 2022-11-25 21:47:19
回答 2查看 27关注 0票数 0

我已经成功地将python与elasticsearch (https://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#)和复合聚合一起使用了一段时间,但遇到了一个我无法解决的问题。我正在查询的数据是多个组织的资产数据,每个资产由一行组成。每行包含每个资产的两个日期(scan_date和时间戳),我需要搜索结果给出每个组织的最大(时间戳- scan_date),即最古老的"scan_age“。在SQL方面:

代码语言:javascript
复制
SELECT organization, MAX(timestamp - scan_date) as oldest_scan_age
FROM database
GROUP BY organization

elasticsearch库包含用于定义计算字段的函数script_fields(),但根据我所阅读(并尝试)的内容,我无法对脚本字段执行聚合。我需要的elasticsearch特性似乎是“运行时字段”,但是elasticsearch-dsl似乎没有提供我可以调用来指定运行时字段的函数。如果存在这样的函数,我可以调用它来定义一个名为"scan_age“的新字段,然后使用标准的复合聚合找到它的最大值。

如何使用elasticsearch-dsl执行此查询

请注意,(1)我已经知道如何使用通常与查询elasticsearch相关联的JSON语法来做到这一点。我要找的是如何在elasticsearch-dsl中实现它。(2)如果我能够编程地使用运行时字段来修改我的elasticsearch-dsl搜索对象,我很乐意创建自己的JSON来定义运行时字段。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-27 01:57:10

有一个向运行时字段添加支持的拉请求,如下所示:

https://github.com/elastic/elasticsearch-dsl-py/pull/1611/commits

您可以在映射中定义运行时字段,然后使用DSL运行常规聚合。

代码语言:javascript
复制
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

如果成功或者你需要更多的帮助,请告诉我

票数 0
EN

Stack Overflow用户

发布于 2022-11-29 12:39:39

在添加此特性之前,解决方法是调用extra(),传递定义运行时字段标准JSON的字典。这将将JSON添加到搜索对象(底部)。例如:

代码语言:javascript
复制
d = {
      "runtime_mappings": {
        "age": {
          "type": "long",
          "script": {
            "source": "emit(doc['@timestamp'].value - doc['host.last_seen_date'].value)"
          }
        }
      }
    }

search_obj = search_obj.extra(d)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74578081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档