【发布时间】:2017-04-06 11:09:39
【问题描述】:
在this question - get unique user within timespan 之后,我想过滤掉仅在给定时间跨度内出现的用户。
例如,仅在 2016 年访问过,但未在 2017 年访问过的用户列表。当我们仅使用过滤器 2016 时间跨度时,情况并非如此,因为用户也可能出现在 2017 中。所以,可能的尝试是设置[2016..2017 users] - [2017 users]。
我的试验是向 ES 发送 2 个查询([2016..2017 users] 和 [2017 users]),并在我的应用程序中使用 userList_20162017.Except(userList_2017) 过滤掉。
但我认为这似乎是非常低效的方法。我们只能通过 ElasticSearch NEST 查询来实现吗?
void Main()
{
var client = new ElasticClient(connectionSettings);
var twoYearsAgo = new DateTime(2016,1,1);
var yearAgo = new DateTime(2017,1,1);
// get 2016..2017 users
var searchResponse20162017 = client.Search<Visitor>(s => s
.Size(0)
.Query(q => q
.DateRange(c => c.Field(p => p.CreationDate)
.GreaterThan(twoYearsAgo)
.LessThan(DateeTime.UtcNow)
)
)
.Aggregations(a => a
.Terms("unique_users", c => c
.Field(f => f.OwnerUserId)
.Size(int.MaxValue)
)
)
);
// get 2017 users
var searchResponse2017 = client.Search<Visitor>(s => s
.Size(0)
.Query(q => q
.DateRange(c => c.Field(p => p.CreationDate)
.GreaterThan(yearAgo)
.LessThan(DateeTime.UtcNow)
)
)
.Aggregations(a => a
.Terms("unique_users", c => c
.Field(f => f.OwnerUserId)
.Size(int.MaxValue)
)
)
);
var uniqueUser20162017 = searchResponse20162017.Aggs.Terms("unique_users").Buckets.Select(b => b.KeyAsString).ToList();
var uniqueUser2017 = searchResponse2017.Aggs.Terms("unique_users").Buckets.Select(b => b.KeyAsString).ToList();
// Final result. seems so naïve and inefficient.
var uniqueUser2016Only = searchResponse20162017.Except(searchResponse2017);
}
【问题讨论】:
标签: c# elasticsearch nest