2016-08-19 4 views
0

Ich bin neu in Logstash und ElasticSearch. Ich möchte Logs lesen, die in ElasticSearch mit Spring Data (ElasticsearchRepository) oder ElasticsearchTemplate gespeichert sind.Abfrage ElasticSearch mit Spring

Ein Protokolleintrag in Elasticsearch sieht wie folgt aus:

{ 
    "_index": "logstash-2016.08.19", 
    "_type": "logs", 
    "_id": "AVagGzQ4GS5SuLe66qxR", 
    "_score": 1.0, 
    "_source": { 
     "message": "Aug 19, 2016 12:02:32 AM com.example.server.MOM$2 handleDelivery\n", 
     "@version": "1", 
     "@timestamp": "2016-08-19T00:02:32.000Z", 
     "host": "10.x.x.x", 
     "priority": 11, 
     "timestamp8601": "2016-08-19T00:02:32Z", 
     "logsource": "a094b35d71da", 
     "program": "xxx-router_1", 
     "pid": "2424", 
     "severity": 3, 
     "facility": 1, 
     "timestamp": "2016-08-19T00:02:32Z", 
     "facility_label": "user-level", 
     "severity_label": "Error" 
    } 
} 

Basierend auf den JSON-Daten des Protokolleintrags, habe ich die folgenden Java-Klassen erstellt:

@Document(indexName = "logstash-2016.08.19") 
public class Logstash { 
    @Id 
    private String _id;  
    private String _index; 
    private String _type; 
    private Integer _score; 
    private Source _source; 

/* getters & setters */ 
} 

und

public class Source { 
    private String message; 
    private String host; 
    private Integer priority; 
    private String timestamp8601; 
    private String logsource; 
    private String program; 
    private String pid; 
    private Integer severity; 
    private Integer facility; 
    private String facility_label; 
    private String severity_label; 

/* getters & setters */ 

} 

Dann versuche ich die Daten abzufragen ... In diesem Beispiel versuche ich das Protokoll mit der angegebenen ID zu bekommen. Ich habe verschiedene Kombinationen der Abfrage ausprobiert, aber alles, was ich bekomme, ist ein leeres Objekt oder Array. Nie geschafft, ein echtes Objekt zurück zu bekommen ... Außerdem habe ich Spring's ElasticsearchRepository ohne Erfolg versucht.

@RestController 
public class TestController { 

    @Autowired 
    ElasticsearchTemplate elt; 

    @RequestMapping(value = "/e", method = RequestMethod.GET) 
    public List<Logstash> elasticSearch() { 

     SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) 
       .withFilter(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("_id", "AVagGzQ4GS5SuLe66qxR"))) 
       .build(); 

     return elt.queryForList(searchQuery, Logstash.class); 
    } 

} 

Jede Hilfe ist willkommen =)

Antwort

1

Sie sollten nicht ordnen Sie die Felder, die mit einem Unterstrich beginnen, sondern nur das, was in der Quelle ist.

Ihre Logstash Klasse sollte einfach wie sein diese

@Document(indexName = "logstash-2016.08.19") 
public class Logstash { 
    private String message; 
    private String host; 
    private Integer priority; 
    private String timestamp8601; 
    private String logsource; 
    private String program; 
    private String pid; 
    private Integer severity; 
    private Integer facility; 
    private String facility_label; 
    private String severity_label; 

/* getters & setters */ 
} 
+0

Vielen Dank für Ihre Antwort, aber ich ein leeres Array noch zurück. :-( – Daniel

+0

Wenn ich weitere Informationen zur Lösung dieses Problems bereitstellen kann, lassen Sie es mich bitte wissen. Dies ist mein zweiter Tag, an dem ich Elasticsearch verwende. Daher ist mein Überblick etwas eingeschränkt. – Daniel

+0

Was passiert, wenn Sie '' withFilter() 'entfernen? Aufruf? – Val

Verwandte Themen