我是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
}
}
}
}
答案 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": []
}
}
}
}
}