Java 使用Jackson解析ElasticSearch输出

Java 使用Jackson解析ElasticSearch输出,java,jackson,Java,Jackson,我想解析ElasticSearch输出的\u source字段。下面是我的一个示例(它只包含一个值列表): 我知道如何访问\u source,但我不知道如何解析它。它似乎是一个单一的节点,不是吗 编辑: 我试图“到达”源代码字段,但似乎不起作用: final ArrayNode _source = (ArrayNode) jsonNode.path(ES_HITS).path(ES_HITS).path(ES_SOURCE); for (JsonNode value : _source) {

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

我知道如何访问
\u 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"
          }
       } 
    ]
}}

如果查询返回多个命中,则每个返回的命中中都会出现“\u source”属性。(见附录中的此处)

要使用jackson解析json,只需创建一个与json模式匹配的POJO。在您的例子中,这个类(Result.java)应该同时包含属性key1和key2。然后使用jackson ObjectMapper将json字符串映射到pojo类:

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

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

我找到了解决方案。映射良好,但插入不正确。要正确插入多个文档,我必须使用

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

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允许我们在一个步骤中进行多个创建、索引、更新或删除请求

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

别忘了:

  • 每行必须以换行符(\n)结尾,包括最后一行。这些被用作标记,以实现有效的线分离
  • 行不能包含未转换的换行符,因为它们会干扰解析。这意味着JSON不能很好地打印出来
    查询将始终返回相同的值,这在上面的OP中显示。我很难解析这个值,它表示为一个值列表(正如您可以看到的,有几个括号,但它是相同的值)。我希望不要太混乱。你能包括Lov.class的源代码和你得到的错误信息吗?实际上,这不是一个值列表,这很奇怪。json值的列表看起来像[{},{},…]。答案是自动生成的还是手动生成的?我已经更新了我的循环。请参阅带有新代码和错误行的OP。答案手动插入Elastic搜索引擎的
    lov
    索引中。我是否应该以不同的方式插入值列表?感谢您的帮助。在我看来,您得到的“\u source”字段不是有效的json。这意味着,它不是一个json对象数组,实际上,您有“_source”:{“key1”:“value1”。},{“key1”:“value1”。},{“key1”:“value1”。}。您应该从elasticsearch获得的是“_source”:[{“key1”:“value1”。},{“key1”:“value1”。}]->一个json对象数组。您愿意详细说明您的答案吗!
    { "index" : { "_index" : "yourIndex", "_type" : "lov"}}
    { "key1": "value1", "key2": "value2"}
    { "index" : { "_index" : "yourIndex", "_type" : "lov"}}
    { "key1": "value1", "key2": "value2"}