我正在使用composite聚合在同一级别上组合多个聚合。
对于日期字段;如果我使用date_histogram聚合,则可以以可读格式获得间隔,而terms该间隔以毫秒为单位返回值。
与此同时; 在内部sources,我只能使用formatproperty date_histogram。
例如:
{ "size": 0, "aggs": { "COLUMN": { "composite": { "sources": [ { "date_histogram": { "date_histogram": { "field": "Ship Date", "interval": "year", "format": "yyyy-MM-dd" } } }, { "terms": { "terms": { "field": "Ship Date" } } } ] } } } } 它将以毫秒为单位返回密钥terms,但必须以格式返回date_histogram。
{ "key": { "date_histogram": "2015-01-01", "terms": 1420149600000 }, "doc_count": 4 } 问题是我想获取字段值,没有间隔。
有什么办法可以获取composite格式内的日期字段值?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Elasticsearch中,使用composite
聚合时,确实会遇到你描述的问题,特别是当你需要以特定格式返回日期字段值时。对于你的需求,一个可行的解决方案是利用脚本字段(scripted fields)或者在查询结果后处理来达到目的。
在查询之前,你可以定义一个脚本字段,该字段将原始日期字段转换为你所需的格式。然后,在composite
聚合中使用这个脚本字段而不是原始日期字段。请注意,这种方法要求你在索引映射中预先定义脚本字段,或者如果允许的话,在运行时动态添加。
由于直接在composite
聚合内部实现可能受限,另一种方法是在获取到聚合结果后,对结果进行后处理,手动将毫秒时间戳转换为所需格式。这可以通过应用编程语言(如Python、Java等)中的日期处理函数轻松完成。
例如,如果你使用的是Python,可以这样做:
from datetime import datetime
# 假设result是从Elasticsearch获取的结果
result = {
"key": {
"date_histogram": "2015-01-01",
"terms": 1420149600000
},
"doc_count": 4
}
# 转换毫秒时间戳为可读日期格式
formatted_date = datetime.utcfromtimestamp(result["key"]["terms"] / 1000).strftime('%Y-%m-%d')
print(formatted_date)
另一个不太直接但可行的方法是先用date_histogram
或date_range
聚合按需分组,然后再用composite
聚合。这样,你可以在第一层获得格式化的日期,虽然这可能会改变你的聚合结构和结果的组织方式。
请根据你的具体需求和环境选择最合适的方法。如果数据量不是非常大,后处理可能是最简单快速的解决方案。如果性能和实时性是关键,考虑优化索引结构或使用脚本字段可能更合适。