0

フィールド「@timestamp」をマップするために JestResult.getSourceAsObjectList をどのように使用しますか? 実際、「@」で始まる名前のフィールドをマップする方法がわかりません。「null」に設定され続けます。

たとえば、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 の適切な使用法は何ですか。「@」で始まる名前のjsonフィールドをマップするgetSourceAsObjectList?

注:これは

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

1 に答える 1

1

捜索救助までサポート!

support@searchly.com からの電子メール応答

フェルハット・ソベイはこう答えました。

ここでの問題は、@version が「@version」として Java フィールドを必要とすることです。これは、Java lang では不可能です。@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

于 2014-12-23T18:27:50.250 に答える