2016-09-06 37 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; 

} 

我正在使用搜索響應。我在add()中出錯。如何清除java中的ClassCastException?

錯誤:爲LogLineEntry創建

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

LogLineEntry一個POJO class.My列表時,按變量屬於searchHit。所以我不能將searchHit變量添加到List中。我該如何解決這個問題?

+0

你命中需要把它從命中變量,並創建新的'LogLineEntry'裏面的for循環,並設置值的LnLineEntry對象,然後添加對象列出 –

回答

2

您需要將每個SearchHit轉換爲LogLineEntry實例。您不能僅將一個SearchHit實例添加到List聲明爲包含LogLineEntry實例。

因此,在您的for循環中,您需要創建一個新的LogLineEntry實例,並使用您在每個SearchHit實例中找到的字段填充它。

 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

任何值謝謝瓦爾 當我創建entry.setXyz(hit.getXyz()); 錯誤顯示add cast to hit entry.setLineNumber(((LogLineEntry)hit).getLineNumber()); 這是正確的嗎? –

+0

否,'entry.setLineNumber(hit.getSource()。get(「lineNumber」))' – Val

+0

setLineNumber數據類型很長。它顯示錯誤..我可以使用entry.setLineNumber((長)hit.getSource()。get(「lineNumber」));或者我應該更改爲pojo類中的對象? –