gpt4 book ai didi

elasticsearch - 在ElasticSearch 6中使用过滤器按嵌套对象聚合

转载 作者:行者123 更新时间:2023-12-03 00:52:39 25 4
gpt4 key购买 nike

我有一组文档代表ElasticSearsh 6中的属性单位。每个属性都有嵌套的每周费率数组:

{
"name" : "Completely Awesome Cabin"
"rates" : [
{
"start": "2018-06-09T00:00:00",
"end": "2018-06-16T00:00:00",
"weeklyRate": 100.0,
},
{
"start": "2018-06-16T00:00:00",
"end": "2018-06-23T00:00:00",
"weeklyRate": 200.0,
}
...
]
...
}

我正在通过几个选项(包括日期)进行一些过滤。我需要添加聚合,以便在通过过滤器的所有单位之间为我提供最小和最大每周费用。我想这应该是带有过滤器的嵌套聚合。我怎样才能做到这一点?

最佳答案

这是在NEST 6.1.0上运行的完整示例

private static void Main()
{
var index = "default";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings = new ConnectionSettings(pool)
.DefaultIndex(index);

var client = new ElasticClient(connectionSettings);

if (client.IndexExists(index).Exists)
client.DeleteIndex(index);

client.CreateIndex(index, c => c
.Mappings(m => m
.Map<MyDocument>(mm => mm
.AutoMap()
.Properties(p => p
.Nested<Rate>(n => n
.AutoMap()
.Name(nn => nn.Rates)
)
)
)
)
);

client.Bulk(b => b
.IndexMany(new[] {
new MyDocument
{
Name = "doc 1",
Rates = new []
{
new Rate
{
Start = new DateTime(2018, 6, 9),
End = new DateTime(2018, 6, 16),
WeeklyRate = 100
},
new Rate
{
Start = new DateTime(2018, 6, 16),
End = new DateTime(2018, 6, 23),
WeeklyRate = 200
}
}
},
new MyDocument
{
Name = "doc 2",
Rates = new []
{
new Rate
{
Start = new DateTime(2018, 6, 9),
End = new DateTime(2018, 6, 16),
WeeklyRate = 120
},
new Rate
{
Start = new DateTime(2018, 6, 16),
End = new DateTime(2018, 6, 23),
WeeklyRate = 250
}
}
}
})
.Refresh(Refresh.WaitFor)
);

var searchResponse = client.Search<MyDocument>(s => s
// apply your filtering in .Query(...) e.g. applicable date range
.Query(q => q.MatchAll())
// don't return documents, just calculate aggregations
.Size(0)
.Aggregations(a => a
.Nested("nested_start_dates", n => n
.Path(f => f.Rates)
.Aggregations(aa => aa
.DateHistogram("start_dates", dh => dh
.Field(f => f.Rates.First().Start)
.Interval(DateInterval.Day)
.MinimumDocumentCount(1)
.Aggregations(aaa => aaa
.Min("min_rate", m => m
.Field(f => f.Rates.First().WeeklyRate)
)
.Max("max_rate", m => m
.Field(f => f.Rates.First().WeeklyRate)
)
)
)
)
)
)
);

var nested = searchResponse.Aggregations.Nested("nested_start_dates");

var startBuckets = nested.DateHistogram("start_dates").Buckets;

foreach(var start in startBuckets)
{
var min = start.Min("min_rate").Value;
var max = start.Max("max_rate").Value;

Console.WriteLine($"{start.KeyAsString} - min: {min}, max: {max}");
}
}

public class MyDocument
{
public string Name {get;set;}

public IEnumerable<Rate> Rates {get;set;}
}

public class Rate
{
public DateTime Start {get;set;}

public DateTime End {get;set;}

public double WeeklyRate {get;set;}
}

将以下内容打印到控制台
2018-06-09T00:00:00.000Z - min: 100, max: 120
2018-06-16T00:00:00.000Z - min: 200, max: 250

您可能还对其他指标聚合(例如 Stats Agggregation)感兴趣

关于elasticsearch - 在ElasticSearch 6中使用过滤器按嵌套对象聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50771219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com