Elasticsearch NEST过滤日期范围

时间:2016-05-04 19:45:01

标签: c# elasticsearch nest

我正在使用以前从未使用过的弹性搜索.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子句和过滤器的过滤子句”。

因为这是我发现包含过滤器的唯一方法是使用NEST Object初始化器语法有更好的方法吗? 我如何使用“filter filter for the filter”或者我必须使用范围查询并忘记过滤器?

谢谢!

1 个答案:

答案 0 :(得分:8)

有一个blog post解释了ES 2.0附带的NEST 2.0中的变化。

要使用对象初始化程序语法将termrange过滤器添加到bool/filter查询,您可以使用新的+特殊构造进行此操作,将导致term查询包含在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

查看更多详情here