查询精确范围内的最大日期并在结果中获取选定的字段

时间:2016-03-29 09:15:51

标签: date elasticsearch max filtering aggregate

我是Elastic Search的新手,在查询时使用多个过滤器(尤其是" max")时遇到了一些问题

我目前正在开发一个由Elastic Search索引的庞大数据库。 有很多文档,每个文档都是关于一个特定服务器的所有信息。

软件偶尔会在这些服务器上运行,并创建一个包含更新信息的新文档。

因此,信息存储如下:

Id : item1
ITDiscovery_Date : 29/03/2016
Information1 : ...
Information2 : ...

Id : item1
ITDiscovery_Date : 12/03/2016
Information1 : ...
Information2 : ...

Id : item2
ITDiscovery_Date : 16/02/2016
Information1 : ...
Information2 : ...

Id : item2 
ITDiscovery_Date : 27/01/2016 
Information1 : ...
Information2 : ...

等等

我的问题如下:

我试图获取有关某个特定服务器的最新信息。为此,我想首先过滤服务器的名称(例如item456),然后在特定的日期范围内(例如从2015年1月1日到今天)获取该服务器的所有文档,然后在最大日期过滤,为了获得最新的信息,并获得所选字段的结果(例如Information15,Information28和Information68)

我已经尝试了一些不同的请求,但无法让它发挥作用,例如:

{
  "fields": [
    "Information15",
    "Information28",
    "Information68"
  ],
  "query": {
    "match": {
      "Id": "item456"
    }
  },
  "aggs": {
    "date_range": {
      "filter": {
        "range": {
          "ITDiscovery_Date": {
            "gte": 1420066800000,
            "lte": 1459241770000
          }
        }
      },
      "aggs": {
        "max_date": {
          "max": {
            "field": "ITDiscovery_Date"
          }
        }
      }
    }
  }
}

它返回所选日期范围内的所有文档,而不仅仅是具有最大日期的文档:

{
  "took" : 34,
  "timed_out" : false,
  "_shards" : {
    "total" : 982,
    "successful" : 982,
    "failed" : 0
  },
  "hits" : {
    "total" : 33,
    "max_score" : 15.364556,
    "hits" : [ {
      "_index" : "itdiscovery_2016.03.02",
      "_type" : "default",
      "_id" : "item456",
      "_score" : 15.364556,
      "fields" : {
        "Information15" : [ "XXX" ],
        "Information28" : [ "XXX" ],
        "Information68" : [ "XXX" ]
      }
    }, {
      "_index" : "itdiscovery_2016.03.23",
      "_type" : "default",
      "_id" : "item456",
      "_score" : 15.359651,
      "fields" : {
        "Information15" : [ "XXX" ],
        "Information28" : [ "XXX" ],
        "Information68" : [ "XXX" ]
      }
    } ]
  }, {
    ...
  },
  "aggregations" : {
    "date_range" : {
      "doc_count" : 33,
      "max_date" : {
        "value" : 1.45922382E12
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我终于找到了(临时)解决方案。

我使用过滤后的查询来获取指定范围日期的结果。 然后我在ITDiscovery_Date上使用sort并将结果限制为1。 它获得了预期的最新结果。

例如:

{
  "fields": [
    "Information15",
    "Information28",
    "Information68"
  ],
  "sort": [
    { "ITDiscovery.Date.raw": {"order": "desc", "ignore_unmapped" : true}}
  ],
  "size": 1,
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "Id: item456",
          "analyze_wildcard": true
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "ITDiscovery.Date": {
                  "gte": 1420070400000,
                  "lte": 1459241770000
                }
              }
            }
          ],
          "must_not": []
        }
      }
    }
  }
}