首页 > 解决方案 > 无法在 Elasticsearch 对象语法中组合 2 个日期范围查询

问题描述

我想以一种通过“from”和“to”字段的精确值过滤文档的方式搜索文档。我使用传递给 bool 查询实例的 DateRangeQuery 对象。

此过滤器在仅过滤一个日期时工作正常,但当两个日期都处于活动状态时,它根本不返回任何文档。代码如下

  DateRangeQuery fromDateRangeQuery = new DateRangeQuery()
        {
            Name = "from_query",
            Field = "from",
            GreaterThanOrEqualTo = dateFrom,
            LessThanOrEqualTo = dateFrom,
        };
        queryContainers.Add(fromDateRangeQuery);

        DateRangeQuery ToDateRangeQuery = new DateRangeQuery()
        {
            Name = "to_query",
            Field = "to",
            GreaterThanOrEqualTo = dateTo,
            LessThanOrEqualTo = dateTo,
        };
        queryContainers.Add(ToDateRangeQuery);
        //more terms filters not related to the 2 fields 
        var searchRequest = new SearchRequest("0___aggregate_");
        searchRequest.SearchType = SearchType.QueryThenFetch;
        searchRequest.From = 0;
        searchRequest.Size = 10000;
        searchRequest.Query = boolQuery;

        var searchResponse = Get().SearchAsync<AggregationHolder>(searchRequest);
        searchResponse.Wait(60000);

        var status = searchResponse.Result;

dateFrom 和 dateTo 都是常规的日期时间对象。我做错了什么,为什么我不能结合这两个过滤器?

标签: c#elasticsearchnest

解决方案


也许,问题是您的日期格式。你能像下面这样试试吗?

ElasticClient elasticClient = new ElasticClient(new ConnectionSettings(
    new Uri(connString))
    .RequestTimeout(TimeSpan.FromMinutes(5))
    .DefaultIndex(defaultIndexName)
);
DateRangeQuery queryFrom = new DateRangeQuery()
{
    Name = "from_query",
    Field = "from",
    GreaterThanOrEqualTo = "05/12/2020 01:03:15",
    LessThanOrEqualTo = "05/12/2020 01:03:16",
    Format = "dd/MM/yyyy HH:mm:ss"
};
DateRangeQuery queryTo = new DateRangeQuery()
{
    Name = "to_query",
    Field = "to",
    GreaterThanOrEqualTo = "05/12/2020 11:20:32",
    LessThanOrEqualTo = "05/12/2020 11:20:33",
    Format = "dd/MM/yyyy HH:mm:ss"
};
QueryContainer queryMain = queryFrom & queryTo;

ISearchResponse<AggregationHolder> searchResponse = elasticClient.Search<AggregationHolder>(s => s
    .RequestConfiguration(r => r.DisableDirectStreaming())
    .From(0)
    .Size(100)
    .Query(q2 => q2
        .Bool(b => b
        .Should(queryMain))
    )
);

推荐阅读