在弹性搜索中按日期范围列表搜索

时间:2018-05-03 10:40:39

标签: c# elasticsearch

我正在研究一个需要从任意时间表中选择有效天数的系统。

我希望能够使用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,所以请注意这个空间。

所有选择器在代码中感觉太过臃肿。

我用过了||运算符而不是|因为||如果你的表达式被评估并且匹配一个匹配就会有性能上的好处,它会更快地返回。

希望这可以帮助任何寻找它的人。

1 个答案:

答案 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客户端。