2015-04-07 4 views
1

Я хотел бы разобрать поле вывода ElasticSearch. Вот пример моего (он содержит только один список значений):Parse ElasticSearch output with Jackson

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

Я знаю, как добраться до _source, но я не знаю, как разобрать его. Кажется, это единственный узел, не так ли?

EDIT:

Я пытался 'досягаемость' _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" 
      } 
     } 
    ] 
}} 

ответ

1

Я нашел решение. Отображение было хорошим, но вставка не была. Чтобы правильно вставить несколько документов, мне пришлось использовать 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. Каждая строка должна заканчиваться символом новой строки (\ п), в том числе в последней строке. Они используются в качестве маркеров для эффективного разделения линий.
  2. Строки не могут содержать символы неэкранированной строки, поскольку они будут мешать синтаксическому разбору. Это означает, что JSON не должен быть довольно печатным.
+0

, не могли бы вы ответить на ваш вопрос? – eliasah

+0

Обновлено. Надеюсь, теперь ясно. –

+1

Проголосовали! Спасибо за обновление – eliasah

0

Если запрос возвращает несколько попаданий, то свойство «_source» будет присутствовать в каждом из возвращенных хитов. (см. здесь в documentation)

Чтобы разобрать json с помощью jackson, просто создайте POJO, которое соответствует схеме json. В вашем случае это должен быть класс (Result.java), который содержит оба свойства key1 и key2. Затем карту JSon строку в классе Pojo с Джексоном ObjectMapper:

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

Позади собственности «_source» обычно должен быть только один объект, я полагаю. Является ли код, предоставленный вами в реальном варианте использования, или просто примером?

+0

Это реальный прецедент. См. Обновленный OP. –

+0

Запрос всегда будет возвращать то же значение, которое представлено выше в OP. Мне сложно разобрать это значение, которое представлено в виде списка значений (как вы можете видеть, есть несколько скобок, но это одно и то же значение). Надеюсь, это не слишком смущает. –

+0

Можете ли вы включить исходный код Lov.class и какое сообщение об ошибке вы получите? На самом деле, это не список значений, что очень странно. Список значений json будет выглядеть как {{}, {}, ..]. Является ли ответ автоматически сгенерированным или вручную? –