为了账号安全,请及时绑定邮箱和手机立即绑定

搜索日期范围内的工单字段

搜索日期范围内的工单字段

C#
绝地无双 2021-10-24 16:38:15
我有以下型号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))            ))))));无论指定的时间如何,它都会返回所有票证。它也只搜索完整的单词,而我想在文本中搜索单词的任何部分。有任何想法吗?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

该DateRange查询需要FieldElasticsearch 中的字段的值才能运行。如果未为此提供值,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"

                  }

                }

              }

            ]

          }

        }

      ]

    }

  }

}

对查询使用运算符重载,这可以写得更简洁


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"

            }

          }

        }

      ]

    }

  }

}


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信