java - (JAVA、Elasticsearch)如何从 SearchResponse 获取字段?

标签 java elasticsearch

我只是想知道如何从 SearchResponse 中获取字段,这是我的查询结果。

以下是我的查询:

{"size":99,"timeout":"10s","query":{"bool":{"filter":[{"bool":{"must":[{"range":{"LOG_GEN_TIME":{"from":"2018-11-01 12:00:01+09:00","to":"2018-11-01 23:59:59+09:00","include_lower":true,"include_upper":true,"boost":1.0}}},{"wrapper":{"query":"eyAiYm9vbCIgOiB7ICJtdXN0IiA6IFsgeyAidGVybSIgOiB7ICJBU1NFVF9JUCIgOiAiMTAuMTExLjI1Mi4xNiIgfSB9LCB7ICJ0ZXJtIiA6IHsgIkFDVElPTl9UWVBFX0NEIiA6ICIyIiB9IH0sIHsgInRlcm0iIDogeyAiRFNUX1BPUlQiIDogIjgwIiB9IH0gXSB9IH0="}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"_source":{"includes":["LOG_GEN_TIME","LOG_NO","ASSET_NO"],"excludes":[]},"sort":[{"LOG_GEN_TIME":{"order":"desc"}},{"LOG_NO":{"order":"desc"}}]}

当我查询时,如下所示:

SearchResponse searchResponse = request.get();

我得到了正确的结果:

{  

   "took":1071,
   "timed_out":false,
   "_shards":{  
      "total":14,
      "successful":14,
      "skipped":0,
      "failed":0
   },
   "_clusters":{  
      "total":0,
      "successful":0,
      "skipped":0
   },
   "hits":{  
      "total":2,
      "max_score":null,
      "hits":[  
         {  
            "_index":"log_20181101",
            "_type":"SEC",
            "_id":"1197132746951492963",
            "_score":null,
            "_source":{  
               "ASSET_NO":1,
               "LOG_NO":1197132746951492963,
               "LOG_GEN_TIME":"2018-11-01 09:46:28+09:00"
            },
            "sort":[  
               1541033188000,
               1197132746951492963
            ]
         },
         {  
            "_index":"log_20181101",
            "_type":"SEC",
            "_id":"1197132746951492963",
            "_score":null,
            "_source":{  
               "ASSET_NO":2,
               "LOG_NO":1197337264704454700,
               "LOG_GEN_TIME":"2018-11-01 23:00:06+09:00"
            },
            "sort":[  
               1541080806000,
               1197337264704454700
            ]
         }
      ]
   }
}

要使用此结果,我需要按字段和值映射它。

enter image description here

我认为有一种方法可以将字段和值映射到“fields”参数,以便我们可以很好地使用它,但我找不到。

我希望我可以这样使用结果:

SearchHit hit = ...
Map<String, SearchHitField> fields = hit.getFields();
String logNo = fields.get("LOG_NO").value();

这似乎是常见的使用方式..

还是我误解了什么?如果有更好的方法请告诉我其他方法。

如有任何评论,我们将不胜感激。谢谢。

最佳答案

我不清楚你用什么客户端来查询弹性。如果您使用elasticsearch高级休息客户端,那么您可以循环点击并获取源,您可以使用 hit.getSourceAsMap() 来获取字段的键值。

对于您的评论:

  • 首先创建一个与_source(即索引属性;数据在elastic中存储的方式)对应的POJO类
  • 使用 hit.getSourceAsString() 获取 json 格式的_source。
  • 使用 jackson ObjectMapper 将 json 映射到您的 pojo

假设您创建了一个 POJO 类AssetLog

SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits) {
      String hitJson = searchHit.getSourceAsString();
      ObjectMapper objectMapper = new ObjectMapper();
      AssetLog source = objectMapper.readValue(hitJson, AssetLog.class);
      //Store source to map/array
}

希望这有帮助。

关于java - (JAVA、Elasticsearch)如何从 SearchResponse 获取字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391654/

相关文章:

java - CheckboxTableViewer 第一列全选

elasticsearch - elasticsearch范围和项过滤器

java - 使用 android 捕获任意按钮的点击

c# - 重异步处理

java - 作为 Spring Boot 应用程序运行无法正常运行,而作为 Java 应用程序运行则无法正常运行

hadoop - 具有各种文档(pdf、ppt、MS word、纯文本等)的 hadoop 可搜索存档的最佳实践

sql-server - Elasticsearch : set up parent/child using jdbc-rivers

elasticsearch - 带有必须和必须不具有相同字段的Elasticsearch嵌套查询

node.js - 非法参数异常请求包含无法识别的参数: [mapping] - ElasticSearch Index Creation

java - 正则表达式拒绝 '_'