3

我正在尝试在弹性搜索中平均一个字段,

"aggs": {
      "avg_timedifference": {
         "avg": {
            "script" : "doc['@timestamp'].value"
         }
      }

这有效,

映射在哪里,

    {
            "_index" : "justchill",
            "_type" : "doc",
            "_id" : "cRP1bWEB6Z3gZHtPaXv1",
            "_score" : 1.0,
            "_source" : {

              "port" : 80,
              "bing.sss-ccc.tc.DOWNSTREAM_dropped.bong" : 33.0,
              "@timestamp" : "2018-02-07T01:50:55.000Z",
              "message" : "ccc.dna-ccc.tc.DOWNSTREAM_dropped.kkk 33 1517968255",
              "@version" : "1",
              "host" : "localhost"
            }
          },
          {
            "_index" : "justchill",
            "_type" : "doc",
            "_id" : "cRP1bWEB6Z3gZHtPaXv1",
            "_score" : 1.0,
            "_source" : {

              "port" : 80,
              "bong.sss-ccc.tc.DOWNSTREAM_dropped.bing" : 33.0,
              "@timestamp" : "2018-02-07T01:50:55.000Z",
              "message" : "ccc.dna-ccc.tc.DOWNSTREAM_dropped.kkk 33 1517968255",
              "@version" : "1",
              "host" : "localhost"
            }
          },

我想要做的是访问这里临时命名为 bing..bong 和 bong ..bing 的字段。该字段是动态映射的,有什么方法可以访问相同的吗?

4

1 回答 1

0

params._source您可以通过(原文如此)以 java-Map 的形式访问所有源。

这反过来又使您可以通过 - 方法查找存在的键keySet(),并且您可以找到字段的确切名称。

在您的示例中,您将获得类似于以下脚本的内容:

for (field in params._source.keySet()) {
  if (field.startsWith('bong')) {
    return doc[field+'.keyword']
  }
}
return 'No field found matching bong'

这只是一个基本设置;是否需要指定您想要的关键字取决于您,并且此解决方案将仅采用第一个匹配项。

请注意,如果您想查看多层字段,您不能只使用点来查看params._source. 如果你想,比如说,返回一个子字段连接下的主机下的所有字段,以及一个以 ip 开头的子字段,你会想要for (field in params._source['host']['connection'].keySet())

不幸的是,这种方法是否有效还取决于上下文。据我测试,它适用于聚合和脚本字段,但不适用于脚本查询。

最后,注意“参数”_source是一种自动参数,不需要在你的下面指定任何东西params

并且记录在案:我知道我迟到了,但我偶然发现了这个问题,答案可能对其他仍在寻找的人有用。

于 2019-09-17T13:15:56.250 回答