我正在研究一个需要从任意时间表中选择有效天数的系统。
我希望能够使用DateRanges列表作为我的搜索请求,但我不确定如何在弹性NEST中有效地实现这一点。
以下是我正在努力有效完成的一些示例代码。
// my list of date ranges
var dateQuery = new List<DateRangeQuery>();
// make query foreach day
foreach (var day in valid_days)
{
dateQuery.Add(new DateRangeQuery
{
Field = "Date",
GreaterThanOrEqualTo = day.Item1, // DateTime start of day tuple
LessThanOrEqualTo = day.Item2 // DateTime end of day tuple
});
}
// query by list of search request
var search = new SearchRequest
{
// how do i use a list of date time's here?
Query = dateQuery;
}
var example = _client.Search(search);
修改
使用此代码解决,感谢您的帮助!
注意:如果您不了解DSL语法,NEST API会非常混乱。
var dateQuery = new QueryContainer();
// make date range query from valid day list
foreach (var day in daylist)
{
// x = x || y
dateQuery = dateQuery || new DateRangeQuery
{
Field = "date",
GreaterThanOrEqualTo = day.Item1, // start of day
LessThanOrEqualTo = day.Item2 // end of day
};
}
// match by query
var search = _client.Search(
s => s.Query(
q => && q.Bool(b => b.Should(dateQuery)));
说到弹性,他们希望将来也能让C#开发者更简单地使用NEST API,所以请注意这个空间。
所有选择器在代码中感觉太过臃肿。
我用过了||运算符而不是|因为||如果你的表达式被评估并且匹配一个匹配就会有性能上的好处,它会更快地返回。
希望这可以帮助任何寻找它的人。
答案 0 :(得分:1)
我猜你需要对多个范围的查询使用必须的bool查询。像
这样的东西{
"query": {
"bool": {
"must": [
{
"range": {
"created_at": {
"gte": "2013-12-09T00:00:00.000Z"
}
}
},
{
"range": {
"happens_on": {
"lte": "2013-12-16T00:00:00.000Z"
}
}
}
]
}
}
}
在.Net客户端中,我认为您可以使用QueryContainer。请参阅此link,因为我不熟悉elasticsearch的.Net客户端。