【问题标题】:Transform SearchHit to Java Object in ElasticSearch在 ElasticSearch 中将 SearchHit 转换为 Java 对象
【发布时间】:2020-03-10 06:25:59
【问题描述】:

我正在尝试从 ES 查询中检索数据,但我很困惑如何将检索到的每个命中数据转换为 Java 对象。 到目前为止,我可以使用 Gson 以 JSON 格式获取每个命中,但我认为从 Hit 转换为 JSON 再转换为 Java Object 是没有用的。

我当前的代码是:

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
    Settings settings = Settings.builder()
            .put("cluster.name", "elasticsearch")
            .put("path.home", "/Users/user/Apps/elasticsearch-5.4.1")
            .build();

    QueryBuilder qb = termQuery("price", 12);
    SearchResponse response = client.prepareSearch("kal").setTypes("products")
            .setSearchType(SearchType.DEFAULT)
            .setQuery(qb)
            .get();

    SearchHit[] results = response.getHits().getHits();
    for (SearchHit hit : results) {
        String sourceAsString = hit.getSourceAsString();
        Map<String, SearchHitField> responseFields = hit.getFields();
        if (sourceAsString != null) {
            Gson gson = new GsonBuilder().setDateFormat(sourceAsString)
                    .create();
        }
    }

【问题讨论】:

  • 我不确定你想在那里实现什么。您实际上已经拥有了 java 对象(名为 results 的 SearchHit 数组)。您想获得对 SearchHit 的子对象的引用吗?
  • 有没有直接的方法将 SearchHit 映射到另一个对象?还是需要实现构造函数?
  • 如果你在这里看到 stackoverflow.com/a/30376770/4343294 你从 SearchHit 检索 JSON 对象
  • 哦,我明白了.. 您想获取 SearchHit 的来源并将其映射到另一个自定义对象吗?还是您需要整个 SearchHit?
  • 此代码有效:SearchHit[] results = response.getHits().getHits(); for (SearchHit hit : results) { String sourceAsString = hit.getSourceAsString(); Map responseFields = hit.getFields(); SearchHitField 字段 = responseFields.get("product_id");地图地图 = hit.getSource(); System.out.println(map.toString()); }

标签: java json elasticsearch


【解决方案1】:

一行

YourObject yourObject = new com.fasterxml.jackson.databind.ObjectMapper().convertValue(searchHit.getSourceAsMap(), YourObjectClass.class);

【讨论】:

    【解决方案2】:

    我实现了这个解决方案,但我不确定这是否正确。

    SearchHit[] results = response.getHits().getHits();
        for (SearchHit hit : results) {
            String sourceAsString = hit.getSourceAsString();
            Map<String, SearchHitField> responseFields = hit.getFields();
            SearchHitField field = responseFields.get("product_id");
            Map map = hit.getSource();
            System.out.println(map.toString());
        }
    

    【讨论】:

      【解决方案3】:
          I am working with Elasticsearch version 7.4.2
      
          SearchHit[] searchHit = response.getHits().getHits();
                  for (SearchHit hit : searchHit) {
                      String jsonString=hit.getSourceAsString();
                      TempClass tmpCl=(TempClass )JSONToObject.parser(jsonString, TempClass .class);
                      System.out.println(tmpCl.toString());
                  }
      
      
          // JSONToObject class
          private static Object dc;
          public static Object parser(String file, Class<?> cls) {
              try {
                      Gson gson = new Gson();
                      dc = gson.fromJson(file, cls);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return dc;
          }
      

      【讨论】:

      • 请在您的答案中添加解释。
      猜你喜欢
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2017-04-29
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2012-08-29
      相关资源
      最近更新 更多