将弹性搜索查询+聚合转换为嵌套语法

时间:2019-04-07 07:28:49

标签: elasticsearch c#-4.0 nest

我需要将以下用Kibana编写的嵌套查询和聚合转换为c#嵌套语法。 主要问题是关于“收获日期”子聚合的(我需要将其设置为最近3个月)。但也不确定查询本身就是最佳实践。

GET tdnetindex/_search
{
  "size": 0,
  "aggs": {
    "TermsAggregation": {
      "terms": {
        "field": "database",
        "size": 100
      },
      "aggs": {
        "DateHistogramAggregation": {
          "date_histogram": {
            "field": "harvest_date",
            "interval": "month"
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "filter": {
        "range": {
          "harvest_date": {
            "gte": "now-3M/M"
          }
        }
      }
    }
  }
}

我到目前为止所做的是:

var query = elasticClient.Search<ElasticResponse>(s => s
                .Size(0)
                .Aggregations(a1 => a1
                    .Terms("TermsAggregation", t => t
                        .Field(f => f.DataBase)
                        .Size(100)
                        .Aggregations(a2 => a2
                            .DateHistogram("DateHistogramAggregation", dh => dh
                            .Field(f => f.HarvestDate)
                            .Interval(DateInterval.Month)
                            )
                        )
                    )
            )
            .Query(q => q
                .Bool(b => b
                    .Filter(f => f
                        .Range(r => r
                            .GreaterThanOrEquals(....);
                        )
                    )
                )
            )
           )

1 个答案:

答案 0 :(得分:0)

您几乎在那里,只需使用.DateRange(r => r...)而不是.Range(r => r...)

对于DateMath表达式,您可以直接使用字符串"now-3M/M",或将其转换为

DateMath.Now.Subtract("3M").RoundTo(DateMathTimeUnit.Month)