【问题标题】:Elasticsearch NEST filter by date rangeElasticsearch NEST 按日期范围过滤
【发布时间】:2016-05-04 19:45:01
【问题描述】:

我正在使用以前从未使用过的 Elastic search .Net NEST 客户端。 我要做的是在评分之前按日期范围过滤结果。

我正在使用对象初始化器语法,因为它最适合我。

我已经完成了我想要的:

        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 子句”。

既然这是我发现包含过滤器的唯一方法,有没有更好的方法来使用 NEST 对象初始化器语法来做到这一点? 如何使用“过滤器的过滤子句”或者我必须使用范围查询并忘记过滤器?

谢谢!

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    blog post 解释了 ES 2.0 中 NEST 2.0 中的变化。

    为了使用 Object Initializer 语法将 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

    【讨论】:

    • ++ 用于链接到使用示例:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多