Создал вложенные поля из Xpath и проверил существующие документы - PullRequest
0 голосов
/ 09 января 2020

У меня два вопроса:

  1. парсинг xml данных и добавление их в массив в записи в индексе

  2. проверка для существующей записи в индексе и, если она существует, добавьте новые данные этой записи в массив существующей записи

У меня есть вход jdb c, который имеет xml column,

input {
  jdbc {
    ....
    statement => "SELECT event_xml....
  }
}

, а затем фильтр xml для анализа данных. Как сделать последние 3 xpath-значения массивом? Нужен ли мне фильтр мутации или ruby? Я не могу понять это

filter {  
  xml {       
    source => "event_xml"              
    remove_namespaces => true 
    store_xml => false
    force_array => false
    xpath => [ "/CaseNumber/text()", "case_number" ]
    xpath => [ "/FormName/text()", "[conversations][form_name]" ]
    xpath => [ "/EventDate/text()", "[conversations][event_date]" ]
    xpath => [ "/CaseNote/text()", "[conversations][case_note]" ]
  }
}

, поэтому что-то вроде этого будет выглядеть в поиске Elasti c.

{
    "case_number" : "12345",
    "conversations" :
        [
            {
                "form_name" : "form1",
                "event_date" : "2019-01-09T00:00:00Z",
                "case_note" : "this is a case note"
            }
        ]                
}

Итак, второй вопрос, если есть уже уникальный case_number «12345» вместо создания новой записи для этого, добавьте новые значения xml в массив разговоров. так бы это выглядело

{
    "case_number" : "12345",
    "conversations" : [
        {
            "form_name" : "form1",
            "event_date" : "2019-01-09T00:00:00Z",
            "case_note" : "this is a case note"
        },
        {
            "form_name" : "form2",
            "event_date" : "2019-05-09T00:00:00Z",
            "case_note" : "this is another case note"
        }
    ]                
}

мой выходной фильтр

output {
      elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "cases"  
        manage_template => false
      }
    }

Возможно ли это? спасибо

1 Ответ

0 голосов
/ 14 января 2020

этот ruby фильтр создал массив

ruby {
    code => '
        event.set("conversations", [Hash[
          "publish_event_id", event.get("publish_event_id"),
          "form_name", event.get("form_name"),
          "event_date", event.get("event_date"),
          "case_note", event.get("case_note")
        ]])
      '
  }

, для вывода был разрешен

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "cases"  
    document_id => "%{case_number}"
    action => "update"
    doc_as_upsert => true
    script => "     
                boolean recordExists = false;                                                        
                for (int i = 0; i < ctx._source.conversations.length; i++) 
                {                  
                    if(ctx._source.conversations[i].publish_event_id == params.event.get('conversations')[0].publish_event_id)
                    {
                        recordExists = true;
                    }                  
                }     
                if(!recordExists){
                    ctx._source.conversations.add(params.event.get('conversations')[0]); 
                }
              "
    manage_template => false
  }
}
...