2016-09-06 2 views
0
public List<LogLineEntry> query(){ 

    List<LogLineEntry> timeRange = new ArrayList<LogLineEntry>(); 
     Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch").build(); 
     Client client = TransportClient.builder().settings(settings).build().addTransportAddress((TransportAddress) new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1", 9300))); 

     SearchResponse sResponse = null; 
     QueryBuilder qb = QueryBuilders.rangeQuery("lineNumber").from(100).to(200); 

     while(sResponse== null|| sResponse.getHits().hits().length != 0){ 
      int scrollSize=200, i=0; 
      sResponse = client.prepareSearch("jsonlogpage") 
        .setTypes("jsonlog") 
         .setQuery(QueryBuilders.matchAllQuery()) 
         .setSize(scrollSize) 
         .setFrom(i * scrollSize) 
         .execute() 
         .actionGet(); 

      for(SearchHit hit : sResponse.getHits()){ 
       timeRange.add(hit); //add() shows error 
      } 
      i++; 
     } 
     return timeRange; 

} 

Ich verwende Suchantwort. Ich habe einen Fehler in add().Wie kann ich ClassCastException in Java deaktivieren?

Fehler:

Exception in thread "main" java.lang.ClassCastException: org.elasticsearch.search.internal.InternalSearchHit cannot be cast to com.example.elasticsearch.LogLineEntry

LogLineEntry eine pojo class.My Liste wird für LogLineEntry erstellt, schlagen Variable gehört zu searchHit. Daher kann ich die searchHit-Variable nicht in die Liste aufnehmen. Wie kann ich das beheben?

+0

, was Sie von Hit es aus dem Treffer Variable nehmen benötigte Werte und neuen 'LogLineEntry' innerhalb der for-Schleife und setzen Sie diesen Wert auf das LnLineEntry Objekt hinzufügen, dann das Objekt –

Antwort

2

Sie müssen jede in eine LogLineEntry Instanz konvertieren. Sie können nicht einfach eine Instanz in eine List Instanz einfügen, die LogLineEntry Instanzen enthalten soll.

Also innerhalb Ihrer for-Schleife müssen Sie eine neue Instanz von LogLineEntry erstellen und füllen Sie es mit Feldern, die Sie in jeder Instanz finden.

 for(SearchHit hit : sResponse.getHits()){ 
      LogLineEntry entry = new LogLineEntry(); 
      // populate your new instance 
      entry.setXyz(hit.getXyz()); 
      // do this for each field 

      // add the instance to the list 
      timeRange.add(entry); 
     } 
+0

zur Liste Danke Val Als ich create entry.setXyz (hit.getXyz()); Fehler beim Hinzufügen von Cast zum Treffer entry.setLineNumber (((LogLineEntry) hit) .getLineNumber()); Ist das korrekt? –

+0

Nein, 'entry.setLineNumber (hit.getSource(). Get (" Zeilennummer "))' – Val

+0

Der Datentyp setLineNumber ist lang. es zeigt Fehler an .. kann ich entry.setLineNumber ((long) hit.getSource() verwenden. get ("lineNumber")); oder sollte ich lange in Object in Pojo-Klasse wechseln? –

Verwandte Themen