2015-11-02 120 views
0

我试图做一个查询来生成一个情节。我的数据指标如下:是否可以在父聚合定义的字段上执行elasticsearch嵌套统计信息聚合?

"mappings": { 
    "mydata": { 
     "properties": { 
      "type": { "type": "string", "index": "not_analyzed" }, 
      "stamp": { "type": "date", "format": "date_hour_minute_second_millis" }, 
      "data": { "type": "object" } 
     } 
    } 

根据类型,数据字段将包含不同的对象,例如,

temperature_data = { 
    "type": "temperature", 
    "stamp": "2015-11-01T15:25:19.123", 
    "data": {"temperature": 23.4, "variance": 0.0} 
} 
humidity_data = { 
    "type": "humidity", 
    "stamp": "2015-11-01T15:26:21.063", 
    "data": {"humidity": 75.1, "variance": 0.0} 
} 

我试图聚集在根据其类型水桶数据,然后执行日期直方图以获取每个读数的统计数据(温度,湿度)。我的问题是如何设置字段上的统计AGGS,因为它与类型的变化("type": "temperature"领域是data.temperature为例):

query = { 
    "size": 0, 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [ 
         {"range" : { 
          "stamp" : { 
           "gt" : start_stamp, 
           "lt" : end_stamp 
          } 
         }} 
        ] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "pathes": { 
      "terms": { 
       "field": "type" 
      }, 
      "aggs": { 
       "points": { 
        "date_histogram": { 
         "field": "stamp", 
         "interval": interval 
        }, 
        "aggs": { 
         "point_stats": { 
          "stats": { 
           "field": "data."+field??? 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

* UPDATE *

至于建议我添加了一个data-type.groovy文件到config/scripts /,该文件包含以下内容:

return doc['data.temperature'].value 

Elasticsearc h是能够编译脚本:

[2015-11-02 19:50:32,651][INFO ][script] [Atum] compiling script file [/home/user/elasticsearch-1.7.0/config/scripts/data-type.groovy] 

我更新了查询加载脚本文件:

query = { 
    "size": 0, 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [ 
         {"range" : { 
          "stamp" : { 
           "gt" : start_stamp, 
           "lt" : end_stamp 
          } 
         }} 
        ] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "pathes": { 
      "terms": { 
       "field": "type" 
      }, 
      "aggs": { 
       "points": { 
        "date_histogram": { 
         "field": "stamp", 
         "interval": interval 
        }, 
        "aggs": { 
         "point_stats": { 
          "stats": { 
           "script": {"file": "data-type"} 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

当我运行查询我得到以下输出:

{u'status': 400, u'error': u'SearchPhaseExecutionException[Failed to execute phase [query], ... Parse Failure [Unexpected token START_OBJECT in [point_stats].]]; }]'} 

数据库中只有温度数据,如果我更改“script”:{“file”:“data-type”}为“field”:“data.temperature”,查询起作用。

回答

0

其中一种方法是将humiditytemperature字段重命名为相同的内容,如value,因此您可以简单地在该字段上进行汇总,而且您很棒。你已经知道它是什么样的价值,因为你知道它从type字段。

"aggs": { 
    "pathes": { 
     "terms": { 
      "field": "type" 
     }, 
     "aggs": { 
      "points": { 
       "date_histogram": { 
        "field": "stamp", 
        "interval": interval 
       }, 
       "aggs": { 
        "point_stats": { 
         "stats": { 
          "field": "data.value" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

第二个选择是使用script但是这会是少高性能和如果你要添加更多的数据类型(压力等)

"aggs": { 
    "pathes": { 
     "terms": { 
      "field": "type" 
     }, 
     "aggs": { 
      "points": { 
       "date_histogram": { 
        "field": "stamp", 
        "interval": interval 
       }, 
       "aggs": { 
        "point_stats": { 
         "stats": { 
          "script": "return doc.type.value == 'temperature' ? doc['data.temperature'].value : doc['data.humidity'].value" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

注意少可扩展此你需要的第二个选项enable dynamic scripting

+0

感谢你的回答,我试图避免使用相同的名称来保存实际标量值的字段,因为不同的传感器会有不同的结构,som可能甚至没有标量值。我会研究这两个选项,但我会尽量避开自定义脚本! –

+0

哦,我明白了。您仍然可以使用不同的字段名称,但创建另一个标量值(适用于此),您可以将其用于聚合。 – Val

+0

您可以使用脚本文件而不是使用内嵌脚本吗? –