c# - 使用NEST API进行日期范围搜索以进行 Elasticsearch ,返回不适当的结果

标签 c# elasticsearch nest

我正在尝试在使用NEST API的 flex 搜索中使用日期范围搜索。

我知道ES在与Nlog集成时将时间戳存储在UTC中。
但是,我需要在此@timestamp字段中进行日期范围搜索。

我写了以下查询:

从日期搜索:

qcd.DateRange(r => r
                    .Field(f => f.timestamp)
                    .GreaterThanOrEquals(searchFromDateTime)
                    .TimeZone("+02:00")
                );

迄今为止的搜索:
qcd.DateRange(r => r
                        .Field(f => f.timestamp)
                        .LessThanOrEquals(searchToDateTime)
                        .TimeZone("+02:00")
                    );

这是查询的其余部分:
searchResponse = (SearchResponse<SearchEventDto>)client.Search<SearchEventDto>(s => s
                    .Index("logstash-*")
                    .Type("logevent")
                    .Query(q => qcd)
                );

SearchFromDateTime或SearchToDateTime是C#日期。

显然,查询中存在问题,因为它没有考虑时差。

例如,由于我是欧洲中部时间,因此如果我提供28.06.2019 14:48作为``搜索起始日期'',则应从28.06.2019 12:48开始搜索。或者,在“搜索到”日期中也应如此。

任何想法,我怎么能做到这一点?

最佳答案

我已经为您准备了一个有效的示例,也许您可​​以在您的情况下找到问题。如果不是,请使用您希望在查询中找到的样本文档来更新问题。

class Program
{
    public class Document  
    {
        public int Id { get; set; }
        public DateTime Timestamp { get; set; }
    } 

    static async Task Main(string[] args)
    {
        var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
        var connectionSettings = new ConnectionSettings(pool);
        connectionSettings.DefaultIndex("documents");

        //only for debbuging purpose, don't use in production
        connectionSettings.DisableDirectStreaming();
        connectionSettings.PrettyJson();

        var client = new ElasticClient(connectionSettings);

        await client.Indices.DeleteAsync("documents");
        await client.Indices.CreateAsync("documents");

        var response = await client.IndexAsync(
            new Document {Id = 1, Timestamp = new DateTime(2010, 01, 01, 10, 0, 0)}, descriptor => descriptor);

        var searchResponse = await client.SearchAsync<Document>(s => s
            .Query(q => q
                .Bool(b => b
                    //I'm using date range in filter context as I don't want elasticsearch
                    //to calculate score for each document found,
                    //should be faster and likely it will be cached
                    .Filter(f =>
                        f.DateRange(dt => dt
                            .Field(field => field.Timestamp)
                            .LessThanOrEquals(new DateTime(2010, 01, 01, 11, 0, 0))
                            .TimeZone("+1:00"))))));

        //prints 1
        Console.WriteLine(searchResponse.Documents.Count);
    }
}

希望能有所帮助。

关于c# - 使用NEST API进行日期范围搜索以进行 Elasticsearch ,返回不适当的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901010/

相关文章:

c# - Response.Redirect ("~/...") 在 HTTP 响应中到底放了什么?

elasticsearch - 查询elasticsearch可以通过id获取文档,但无法在全部查询中找到它

Crud 存储库的 Spring bean 配置

python - 如何将提取的数据转换成python字典?

elasticsearch - NEST Elasticsearch GeoPoint类

elasticsearch - 在Elasticsearch 6.6和NEST 6.6中具有排序和分页变量的SearchTemplate

c# - 我可以在初始配置后(在运行时)关闭 NHibernate ShowSQL

c# - 如何在 EA 中按名称删除标签

c# - 在 WPF 中禁用键

c# - Elasticsearch NEST 查询嵌套对象