Elasticsearch NEST按日期范围筛选

ngynwnxp  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(1)|浏览(180)

我正在使用ElasticSearch。Net NEST客户端,我从来没有使用过。我试图做的是过滤结果的日期范围之前评分。
我使用Object初始化器语法,因为它最适合我。
我已经完成了我想要的与:

var filter = new FilteredQuery();

        var queryForm = new TermQuery();
        queryForm.Field = "id";
        queryForm.Value = filterModel.Id;

        filter.Query &= queryForm;

        var rangeQuery = new DateRangeQuery();
        rangeQuery.Field = "datetime";
        rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1);
        rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1);
        filter.Filter = rangeQuery;

        // Use boolean query
        searchRequest.Query = new BoolQuery() && filter;

这就像我期望的那样给了我请求JSON:

{
  "from": 0,
  "size": 0,
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "id": {
                  "value": "XXXX"
                }
              }
            }
          ]
        }
      },
      "filter": {
        "range": {
          "datetime": {
            "gte": "2015-12-31T00:00:00",
            "lte": "2016-05-05T00:00:00"
          }
        }
      }
    }
  }
}

但是关于filtered query的文档说"在2.0.0-beta1中不推荐使用。请改用bool查询,查询使用must子句,过滤器使用filter子句"。
因为这是我发现的唯一包含filter的方法,有没有更好的方法用NEST对象初始化器语法来做这件事?我如何使用"filter子句for the filter"或者我必须使用范围查询而忘记filter?
谢谢你!

bwleehnv

bwleehnv1#

有一个blog post解释了ES 2.0附带的NEST 2.0中的更改。
为了使用Object Initializer语法将termrange筛选器添加到bool/filter查询中,可以使用新的+特殊构造来完成此操作,该构造将使term查询 Package 在bool查询的筛选器子句中:

var queryForm = +new TermQuery();
    queryForm.Field = "id";
    queryForm.Value = filterModel.Id;

    var rangeQuery = +new DateRangeQuery();
    rangeQuery.Field = "datetime";
    rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1);
    rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1);

    searchRequest.Query = queryForm && rangeQuery

在此查看更多详细信息

相关问题