使用Jackson分析ElasticSearch输出



我想解析ElasticSearch输出的_source字段。下面是我的一个例子(它只包含一个值列表):

"_source":
{    
   "key1": "value1",    
   "key2": "value2"
},
{    
   "key1": "value1",    
   "key2": "value2"
},
etc.

我知道如何到达_source,但我不知道如何解析它。它似乎是一个单独的节点,不是吗?

编辑:

我试图"到达"_source字段,但似乎不起作用:

final ArrayNode _source = (ArrayNode) jsonNode.path(ES_HITS).path(ES_HITS).path(ES_SOURCE);
for (JsonNode value : _source)
{
        try 
        {
            lov.add(mapper.treeToValue(value, Lov.class));
        } catch (JsonProcessingException e) {   logger.error("GetLibelles : add : error : JsonProcessingException", e); }
        }

Lov类

@JsonIgnoreProperties(ignoreUnknown = true)
public class Lov extends ParentModel implements Serializable
{   
    private String key1;
    private String key2;
    private String key3;
    private String key4;
    // getters and setters
}

我得到的错误:

com.fasterxml.jackson.databind.node.MissingNode incompatible with com.fasterxml.jackson.databind.node.ArrayNode

ElasticSearch输出:

{
 "took":0,
 "timed_out":false,
 "_shards":
 {
    "total":1,
    "successful":1,
    "failed":0
 },
"hits":
{ 
   "total":1,
   "max_score":1.0,
   "hits":
    [
       {
          "_index":"bla",
          "_type":"lov",
          "_id":"PWA8bmEBRDuys8JUCwg10w",
          "_score":1.0,
          "_source":
          {    
              "key1": "value1",    
              "key2": "value2"
          },
          {    
              "key1": "value1",    
              "key2": "value2"
          }
       } 
    ]
}}

我找到了解决方案。映射很好,但插入不好。为了正确插入多个文档,我不得不使用Bulk API。

映射完成后,我必须使用以下命令插入数据:

curl -s -XPOST 'serverAddress/_bulk' --data-binary @data.json; echo

data.json

{ "index" : { "_index" : "yourIndex", "_type" : "lov"}}
{ "key1": "value1", "key2": "value2"}
{ "index" : { "_index" : "yourIndex", "_type" : "lov"}}
{ "key1": "value1", "key2": "value2"}

与mget允许我们一次检索多个文档的方式相同,批量API允许我们在一个步骤中进行多个创建、索引、更新或删除请求。

我需要插入我的数据,因此我选择了index操作每个请求都需要一个操作

别忘了:

  1. 每一行都必须以换行符(\n)结尾,包括最后一行。这些被用作标记以允许有效的线分离
  2. 这些行不能包含未加转义的换行符,因为它们会干扰解析。这意味着JSON不能打印得很漂亮

如果您的查询返回多个点击,那么"_source"属性将出现在每个返回的点击中。(请参阅文档中的此处)

要使用jackson解析json,只需制作一个与json模式匹配的POJO即可。在您的情况下,这应该是包含属性key1和key2的类(Result.java)。然后使用jackson ObjectMapper:将json字符串映射到您的pojo类

ObjectMapper mapper = new ObjectMapper();
Result result = mapper.readValue("{"key1":"value1",..}",result.class);

我想,在"_source"属性后面通常应该只有一个对象。您提供的代码是来自真实的用例,还是仅仅是一个示例?

最新更新