2016-03-29 4 views
1

Ich bin neu in der Elastic Search und ich habe einige Probleme bei der Verwendung mehrerer Filter (insbesondere mit einem "Max") auf eine AbfrageAbfragen eines maximalen Datums in einem präzisen Bereich und Abrufen ausgewählter Felder in den Ergebnissen

Ich arbeite gerade an einer riesigen Datenbank, die von Elastic Search indiziert wird. Es gibt viele Dokumente, jedes Dokument enthält alle Informationen über einen bestimmten Server.

Auf diesen Servern läuft sporadisch ein soft und erstellt ein neues Dokument mit aktualisierten Informationen.

So werden Informationen wie gespeichert:

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 : ... 

Und so weiter

Mein Problem ist folgendes:

Ich versuche, die neuesten Informationen über einen bestimmten Server zu erhalten. Dazu möchte ich zuerst den Namen des Servers (zB item456) filtern, dann alle Dokumente dieses Servers in einem bestimmten Datumsbereich (zB vom 01.01.2015 bis heute) abrufen, dann nach dem maximalen Datum filtern, um die neuesten Informationen zu erhalten und die ausgewählten Felder zu erhalten (zB Information15, Information28 und Information68)

Ich habe einige verschiedene Anfragen ausprobiert, kann sie aber nicht zum Laufen bringen, zum Beispiel diese:

{ 
    "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" 
      } 
     } 
     } 
    } 
    } 
} 

Es gibt alle Dokumente im Datumsbereich ausgewählt und nicht nur das mit dem max Datum:

{ 
    "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 
     } 
    } 
    } 
} 

Antwort

1

Ich habe endlich eine (temporäre) Lösung gefunden.

Ich verwende eine gefilterte Abfrage, um die Ergebnisse im angegebenen Bereichsdatum zu erhalten. Dann verwende ich auf dem ITDiscovery_Date sortieren und beschränken Sie die Ergebnisse auf 1. Es erhält das neueste Ergebnis wie erwartet.

Zum Beispiel:

{ 
    "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": [] 
     } 
     } 
    } 
    } 
}