2017-08-30 1 views
0

Zurück zu Kibana, kann ich Protokolle für verschiedene Produkte (product.name) zusammen mit Zeitstempel und andere Informationen anzeigen. Hier ist einer der Protokolle:ELK-Abfrage, um einen Datensatz für jedes Produkt mit dem maximalen Zeitstempel

{ 
    "_index": "xxx-2017.08.30", 
    "_type": "logs", 
    "_id": "xxxx", 
    "_version": 1, 
    "_score": null, 
    "_source": { 
    "v": "1.0", 
    "level": "INFO", 
    "timestamp": "2017-01-30T18:31:50.761Z", 
    "product": { 
     "name": "zzz", 
     "version": "2.1.0-111" 
    }, 
    "context": { 
     ... 
     ... 
    } 
    }, 
    "fields": { 
    "timestamp": [ 
     1504117910761 
    ] 
    }, 
    "sort": [ 
    1504117910761 
    ] 
} 

Es gibt mehrere andere Protokolle für das gleiche Produkt und auch mehrere Protokolle für verschiedene Produkte.

Allerdings möchte ich eine Abfrage schreiben, die einzelnen Datensatz für ein bestimmtes product.name (das mit dem maximalen Zeitstempel Wert) zurückgibt und es die gleiche Information für alle anderen Produkte zurückgibt. Das heißt, dass Protokolle für jedes Produkt eine zurückgegeben werden und für jedes Produkt sollte es die mit dem maximalen Zeitstempel sein.

Wie erreiche ich das?

Ich habe versucht, den Ansatz in aufgeführt zu folgen: How to get latest values for each group with an Elasticsearch query?

und erstellt eine Abfrage:

{ 
    "aggs": { 
     "group": { 
      "terms": { 
       "field": "product.name" 
      }, 
      "aggs": { 
       "group_docs": { 
        "top_hits": { 
         "size": 1, 
         "sort": [ 
          { 
           "timestamp": { 
            "order": "desc" 
           } 
          } 
         ] 
        } 
       } 
      } 
     } 
    } 
}' 

Aber, ich habe einen Fehler, der sagte:

ich
"error" : { 
    "root_cause" : [ 
     { 
     "type" : "illegal_argument_exception", 
     "reason" : "Fielddata is disabled on text fields by default. Set fielddata=true on [product.name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead." 
     } 
    ], 

Sie absolut muss fielddata = true für dieses Feld in diesem Fall gesetzt werden? Wenn nein, was soll ich tun? Wenn ja, bin ich mir nicht sicher, wie ich es einstellen soll. Ich habe versucht, es auf diese Weise tun:

curl -XGET 'localhost:9200/xxx*/_search?pretty' -H 'Content-Type: application/json' -d' 
{ 
    "properties": { 
     "product.name": { 
     "type":  "text", 
     "fielddata": true 
     } 
    }, 
    "aggs": { 
     "group": { 
      "terms": { 
       "field": "product.name" 
      }, 
      "aggs": { 
       "group_docs": { 
        "top_hits": { 
         "size": 1, 
         "sort": [ 
          { 
           "timestamp": { 
            "order": "desc" 
           } 
          } 
         ] 
        } 
       } 
      } 
     } 
    } 
}' 

Aber ich denke, es ist etwas falsch mit ihm ist, und ich bekomme diese Fehlermeldung (synatactically?):

{ 
    "error" : { 
    "root_cause" : [ 
     { 
     "type" : "parsing_exception", 
     "reason" : "Unknown key for a START_OBJECT in [properties].", 
     "line" : 3, 
     "col" : 19 
     } 
    ], 

Antwort

0

Der Grund, warum Sie eine Fehlermeldung anzeigt, weil Sie versuchen, Um die Aggregation für das Textfeld (product.name) durchzuführen, können Sie das nicht in elasticsearch 5 tun. Sie müssen die Felddaten nicht auf "true" setzen. Sie müssen das Produkt im Mapping definieren. Namen als 2 Felder, ein product.name und zweite product.name.keyword So:

{ 
"product.name": 
     { 
     "type" "text", 
      "fields": 
      { 
       "keyword": 
        { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
      } 
     } 
    } 

Dann müssen Sie die Aggregation auf product.name.keyword

+0

Lax zu tun, hatte ich infact nur habe versucht, "field": "product.name" in meiner Anfrage oben auf "field": "product.name.keyword" zu setzen, nachdem diese Frage gepostet wurde und das zumindest nicht fehlgeschlagen ist und scheinbar korrekte Datensätze zurückgibt. Müssen wir wirklich den ganzen großen Abschnitt oben verwenden, wie Sie oben geschrieben haben, anstatt nur product.name durch product.name.keywrod zu ersetzen? Wenn ja, warum? Und wie nehme ich das in meine aktuelle Anfrage auf? – user1892775

+0

Der ganze große Abschnitt muss in Ihrem Schema sein. Bitte posten Sie Ihr Schema – Lax

Verwandte Themen