【问题标题】:Search the fields of tickets with date range搜索具有日期范围的工单字段
【发布时间】:2018-12-31 06:50:20
【问题描述】:

我有以下型号

public class Ticket
{
    public string Id { get; set; }

    public string Question { get; set; }

    public DateTime CreateDate { get; set; }

    public DateTime ClosedDate { get; set; }

    public int Votes { get; set; }
}

我正在使用 ElasticSearch Nest 客户端搜索任何字段包含某个日期范围内特定文本的票证。

我尝试了以下方法:

        var result = client.Search<Ticket>(
            s => s.Query(q => 
                            q.Bool(b => 
                                b.Must(ms => ms.QueryString(qs => qs.Query(term)))
                                 .Filter(f => 
                                         f.Bool(bb => 
                                                bb.Must(ms => ms.DateRange(dr => dr.GreaterThanOrEquals(from).LessThanOrEquals(to))
            ))))));

无论指定时间,它都会返回所有票。

当我想在文本中搜索单词的任何部分时,它也只搜索完整的单词。

有什么想法吗?

【问题讨论】:

    标签: c# elasticsearch .net-core nest


    【解决方案1】:

    DateRange 查询需要 Field 值才能运行 Elasticsearch 中的字段。如果没有为此提供值,NEST 会认为查询是无条件的,并且不会将其序列化为发送的查询的一部分。

    例如,给定

    var term = "term";
    var to = DateTime.Now;
    var from = to.AddDays(-7);
    

    您当前的查询序列化为

    {
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "term"
              }
            }
          ]
        }
      }
    }
    

    如果添加了Field

    var result = client.Search<Ticket>(s => s
        .Query(q => q
            .Bool(b => b
                .Must(ms => ms
                    .QueryString(qs => qs
                        .Query(term)
                    )
                )
                .Filter(f => f
                    .Bool(bb => bb
                        .Must(ms => ms
                            .DateRange(dr => dr
                                .Field(df => df.CreateDate)
                                .GreaterThanOrEquals(from)
                                .LessThanOrEquals(to)
                            )
                        )
                    )
                )
            )
        )
    );
    

    现在序列化为

    {
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "term"
              }
            }
          ],
          "filter": [
            {
              "bool": {
                "must": [
                  {
                    "range": {
                      "createDate": {
                        "gte": "2018-07-17T12:20:02.8659934+10:00",
                        "lte": "2018-07-24T12:20:02.8659934+10:00"
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
    

    使用operator overloading on queries,这样可以写的更简洁

    var result = client.Search<Ticket>(s => s
        .Query(q => q
            .QueryString(qs => qs
                    .Query(term)
            ) && +q
            .DateRange(dr => dr
                .Field(df => df.CreateDate)
                .GreaterThanOrEquals(from)
                .LessThanOrEquals(to)
            )
        )
    );
    

    序列化为

    {
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "term"
              }
            }
          ],
          "filter": [
            {
              "range": {
                "createDate": {
                  "gte": "2018-07-17T12:21:50.2175114+10:00",
                  "lte": "2018-07-24T12:21:50.2175114+10:00"
                }
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多