我想解析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
操作每个请求都需要一个操作。
别忘了:
- 每一行都必须以换行符(\n)结尾,包括最后一行。这些被用作标记以允许有效的线分离
- 这些行不能包含未加转义的换行符,因为它们会干扰解析。这意味着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"属性后面通常应该只有一个对象。您提供的代码是来自真实的用例,还是仅仅是一个示例?