2014-12-19 3 views
0

Как использовать JestResult.getSourceAsObjectList для отображения поля «@timestamp»? На самом деле, я не могу понять, как сопоставить любое поле с именем, начинающимся с «@». Он получает значение «null».JestResult.getSourceAsObjectList - для «@timestamp» или, по-видимому, любое поле, начинающееся с «@»

Например, если запрос возвращает Elasticsearch

{ 
    "_id": "Vhv2OE1SNSeSg285UYQRQ", 
    "@version": "1", 
    "@timestamp": "2014-12-19T01:18:06.454Z" 
    "type": "hdfs" 
} 

и есть соответствующий POJO Java класс

import io.searchbox.annotations.JestId; 

public class ElasticsearchLog { 

    @JestId 
    private String _id; 
    private String version; 
    private String timestamp; 
    private String type; 

    @Override 
    public String toString() { 
     return "ElasticsearchLog{" + 
       "_id='" + _id + '\'' + 
       ", version='" + version + '\'' + 
       ", timestamp='" + timestamp + '\'' + 
       ", type='" + type + '\'' 
      ' }'; 

} 

Затем делают

import io.searchbox.client.JestClient; 
import io.searchbox.client.JestClientFactory; 
import io.searchbox.client.JestResult; 
import io.searchbox.client.config.HttpClientConfig; 
import io.searchbox.core.Search; 
import java.util.List; 

public class JESTClient { 
    public static void main(String[] args) throws Exception { 
     String clusterIP = "localhost"; 
     String port = "9200"; 

     //setup client 
     JestClientFactory factory = new JestClientFactory(); 
     factory.setHttpClientConfig(new HttpClientConfig 
       .Builder("http://" + clusterIP + ":" + port) 
       .multiThreaded(true) 
       .build()); 
     JestClient client = factory.getObject(); 

     Search search = new Search.Builder("{ \"query\": { \"match_all\": {} } }") 
       .addIndex("_all") 
       .build(); 
     JestResult result = client.execute(search); 
     List<ElasticsearchLog> resultLogs = result.getSourceAsObjectList(ElasticsearchLog.class); 
     for(ElasticsearchLog log: resultLogs){ 
      System.out.println(log); 
     } 

распечатывает

ElasticsearchLog{_id='Vhv2OE1SNSeSg285UYQRQ', version='null', timestamp='null', type='hdfs'} 

Таким образом, «@version» и «@timestamp» не отображаются правильно.

сама JSONObject кажется просто отлично с символами "@":

import com.google.gson.JsonObject; 

public static void main(String[] args){ 
     JsonObject testy = new JsonObject(); 
     testy.addProperty("@timestamp", "zzz"); 
     System.out.println(testy.get("@timestamp")); 
} 

Выходы: "ZZZ"

Что такое правильное использование JestResult. getSourceAsObjectList для отображения json-поля с именем, начинающимся с «@»?

Примечание: Это для

<dependency> 
    <groupId>io.searchbox</groupId> 
    <artifactId>jest</artifactId> 
    <version>0.1.4</version> 
</dependency> 

ответ

0

поддержка Searchly на помощь!

Email ответ от [email protected]

Ферхатом Sobay ответил:

Проблема здесь является @version требует поля Java как '@version', которое не возможно с Java Ланга. @SerializedName аннотация приходит на помощь, пришлось копать немного, но работает!

Итак, попробуйте ниже;

public class ElasticsearchLog { 

    @JestId 
    private String _id; 
    @SerializedName("@version") 
    private String version; 
    @SerializedName("@timestamp") 
    private String timestamp; 
    private String type; 

    @Override 
    public String toString() { 
    return "ElasticsearchLog{" + 
    "_id='" + _id + '\'' + 
    ", version='" + version + '\'' + 
    ", timestamp='" + timestamp + '\'' + 
    ", type='" + type + '\'' 
    ' }'; 

} 

Бест, @Ferhat